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

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

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

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

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

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

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

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

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

Подробнее

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

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

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

Помогите с созданием Аддона


worm

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

Помогите пожалуйста.

Хотел написать чтобы потипу отображения мирры отображался и курс кри. Тут проблем не возникло. Нашел функцию считывающие курс кри из аддона для аопанели и подставил в код для мирры. Все замечательно отображается 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 там на синтакс указывает. а тут непонятно

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

  • Ответов 95
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Помогите пожалуйста.

Автоюз, насколько знаю, невозможен, функции юза предмета не дали. Так что придумай себе другой аддон. Походи по форуму, покури других аддонов и документации для API из клиента.

Ошибки тяжело читаются обычно, если их кидает возмущенная функия API; ошибки, кинутые Lua, понять можно всегда. Функции API обычно возмущаются на некорректные аргументы или условия вызова.

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

Спасибо. Но та хотелось решить проблему с сундуками и монетками. Даже при одновременном л+п кн мыши очень долго и нудно переводится в ценности/открывается

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

Спасибо. Но та хотелось решить проблему с сундуками и монетками. Даже при одновременном л+п кн мыши очень долго и нудно переводится в ценности/открывается

Сундуки есть особые объекты. Функция на их открытие у нас есть, называется

avatar.OpenUnlockedBoxForItem( boxId )

открывает сундуки получаемые из монстров и по квестам на поиск сокровищ.

Но она не может использовать монетки и прочие предметы, только для открытия "ящиков".

Про ошибки:

Error: addon TestingButton: Syntax error during pre-compilation
Error: addon TestingButton:   [string "Mods/Addons/TestingButton/ScriptTestingButton.lua"] unexpected symbol near `='
Error: addon TestingButton: Can't execute script for addon: Mods/Addons/TestingButton/AddonDesc.(UIAddon).xdb

Ошибка Луа. Ошибка в синтаксисе - в строке 31 непонятный символ около знака = (в моем случае я просто написал Foo = и всё).

Error: addon TestingButton:   func: GetChildUnchecked, method, line: -1, defined: C, line: -1, [C]
Error: addon TestingButton:	 func: ?, ?, line: 28, defined: main, line: 0, [string "Mods/Addons/TestingButton/ScriptTestingButton.lua"]
Error: addon TestingButton: Widgets::LuaGetChildUnchecked: wrong params count (4, should be 3), details: int __cdecl Widgets::LuaGetChildUnchecked(struct lua_State *)
Error: addon TestingButton: Error while running the chunk

Ошибка функции АПИ. В строке 28 у функции LuaGetChildUnchecked неправильное количество параметров, 4 штуки, а должно быть 3.

Еще:

Error: addon TestingButton:   func: GetChildUnchecked, method, line: -1, defined: C, line: -1, [C]
Error: addon TestingButton:	 func: ?, ?, line: 28, defined: main, line: 0, [string "Mods/Addons/TestingButton/ScriptTestingButton.lua"]
Error: addon TestingButton: Widgets::LuaGetChildUnchecked: param 3 not a bool (type: number), details: int __cdecl Widgets::LuaGetChildUnchecked(struct lua_State *)
Error: addon TestingButton: Error while running the chunk

В той же самой функции на этот раз я заменил параметр со значения false (третий параметр) на значение 4. В итоге она сообщает что параметр 3 не boolean, а number.

На мой взгляд все ошибки в достаточной мере понятны. Если что-то непонятно - приведи пример ошибки и кода в этой строке±2 (хотя на самом деле код обычно не нужен, т.к. в ошибке обычно написано достаточно для того чтобы исправить её).

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

Спасибо) Попробую с сундуками а то замучали изверги). Уже начинает прояснятся картинка)

А печать в логфайл просто выводится или надо еще функцию писать какую. на форуме видел что просто выводится, но у меня руки совсем кривые видимо. Hello world! так и ненапечатал(

И БД организуется как массив. если он в отдельном файле то просто в lua объявить как глобал? или надо еще какието функции?

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

Если ты напортачил то ошибка в файл mods.txt выведется сама. Если тебе надо самому в лог вывести какую-то информацию - используй функцию common.LogInfo() или LogInfo() из папки SampleCommon.

Переменные нужно объявлять, неявное объявление глобальных переменных у нас в игре запрещено. Можешь объявить как локальную, разницы можешь и не увидеть - зависит, правда, от того где объявляешь. Просто по "традиции" глобальные переменные объявляют в коде основной "функции" - если там объявить локальную разницы не увидишь. Если объявить локальную переменную внутри какой-то функции или конструкции for/while/if - то эта локальная переменная будет видна во всех дочерних функциях и конструкциях, но не будет видна в родительской и других. Грубо говоря код:

if a == 1 then
local foo = true
else
local bar = false
end
LogInfo(foo, bar)

Выдаст ошибку "попытка чтения из несуществующей глобальной переменной foo". Т.е. переменные foo и bar будут "не определены" вне конструкции if.

Например я предпочитаю объявлять "локальные" переменные по причине того, что чтобы объявить глобальную переменную надо написать

Global("Database", {} )

А чтобы объявить локальную надо написать

local Database = {}

Т.е. гораздо меньше "лишних" нажатий на клавиатуру надо делать :)

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

Спасибо. Но та хотелось решить проблему с сундуками и монетками. Даже при одновременном л+п кн мыши очень долго и нудно переводится в ценности/открывается

сундуки открываются - уже 2 аддона на них есть

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

Суть вопроса научиться писать аддон (естественно начав с чего-то легкого и простого) ) О существование аддонов на сундуки я не знал. Я вообще не очень жалую аддоны. Розочка мы тебя помним... )) И пьесы все в том же стиле...))

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

Суть вопроса научиться писать аддон (естественно начав с чего-то легкого и простого) )

Будут вопросы - задавай.

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

Суть вопроса научиться писать аддон

...

Я вообще не очень жалую аддоны.

Цель всего этого - познать врага?

И обязательно написать 1-2-3 из тех "читорных" аддонов, о которых пишут всякие дауны?

Ну-ну

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

И обязательно написать 1-2-3 из тех "читорных" аддонов, о которых пишут всякие дауны?

Да к сожалению уже написал один - "Прямые руки"))) Лично для тебя. у меня стоит блокировка панелек, автокормежка, показ миры, авто сбор почты, автопродажа серых вещей и показ корон (который кстати смешно на пета на арене корону повесил). и все)

Сундучки открываются))) 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 или обрезкой каких то символов) или кодировку как то сменить?

В принципе по первому коду и как в лутменеджере устроено можно уже сварганить файлик с бд где по названию можно указывать что выкинуть что продать но разобраться хочется

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

local textreadr = "Прочее" это строка типа string

local textread = itemtype.className это строка типа WString

поэтому

if textreadr == userMods.FromWString(textread) then

end

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

Вот возник еще такой вопрос. Как узнать в каком виде (к какому типу) поступают данные

Надо применить какую-то текстовую функцию (с указанием что переменная типа string или обрезкой каких то символов) или кодировку как то сменить?

В принципе по первому коду и как в лутменеджере устроено можно уже сварганить файлик с бд где по названию можно указывать что выкинуть что продать но разобраться хочется

В документации к АПИ описаны все типы входных и выходных данных. Например по этому пункту:

/Allods Online/data/Mods/Docs/Modding Docs 121220/LuaApi/FunctionAvatarGetItemInfo.html

-- возвращаемые значения:

table or nil - таблица с информацией о предмете или nil (в случае ошибок)

поля:

name: WString - название предмета

className: WString - название класса предмета

В данном случае поля name и className имеют тип "WString". Как его преобразовывать в string написал logg.

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

П.С. Документация по АПИ лежит в папке \Allods Online\data\Mods\Docs в архиве.

Цель всего этого - познать врага?

И обязательно написать 1-2-3 из тех "читорных" аддонов, о которых пишут всякие дауны?

Ну-ну

А ты бы вместо необоснованной агрессии CuEx залил бы на сайт :) Аддон весьма полезен и работоспособен.

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

Да к сожалению уже написал один - "Прямые руки"))) Лично для тебя.

Идеоно? Надеюсь не в скомпилированном виде, как тут некоторые любят делать?

В общем, не обрщай внимания просто прицепился

А ты бы вместо необоснованной агрессии CuEx залил бы на сайт :) Аддон весьма полезен и работоспособен.

2 фразы от 1 человека. Какие еще можно сделать выводы?

...

Язх ваще чего его здесь нет. Вроде не умирал и до сих пор жив

И ваще я не разрабочик и ничего запиливать не умею

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

Спасибо огромное) Уже ковыряю то архивчик. Столько интересного и есть куда приткнуть)

А еще не подскажите где про графику почитать?

На примере аддонов (да и в том же архивчике) есть *.xdb файлы в них в основном (как я понимаю) написано положение объекта его размер, то над каким объектом отображать и отображать ли вообще. Но четко что это. как это выглядит и какого цвета не расписано. В аддоне на автокормежку на чекбоксы еще и файлы *.bin есть( А чек бокс такая нужная вещь...)) Эту магию надо разгадать)) В принципе только дошло что само название файла может указывать конкретно на то какой объект в игре используется. Если это так то как посмотреть эти объекты списком? или интуитивно глядеть где они могут быть и через скрипты вытаскивать их название?

Да и есть еще какие-то интересные файлы *.luac что это за звери?)).

Спасибо)

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

А еще не подскажите где про графику почитать?

В теме "создание GUI".

На примере аддонов (да и в том же архивчике) есть *.xdb файлы

Это описатели игровых ресурсов. Они описывают ресурсы - панели, текстуры, тексты и т.п.

в них в основном (как я понимаю) написано положение объекта его размер, то над каким объектом отображать и отображать ли вообще.

В них написано что это за объект (панель, кнопка, эдитлайн, текстура, текст, список текстур и т.п.) и указаны некоторые характеристики объекта. Например для виджетов это координаты, расположение, список дочерних виджетов для панелей (другие панели, кнопки, эдитлайны, контейнеры), текстуры и прочее. Для текстур указан файл текстуры, для списка текстов указаны все текстовые файлы из списка и их названия.

В общем любой ресурс описан этими самыми xdb файлами.

Но четко что это. как это выглядит и какого цвета не расписано.

Это тебе только кажется. Например для панели можно увидеть какую текстуру она использует и какие у нее дочерние виджеты, у них - свои текстуры и виджеты, и т.д.

В аддоне на автокормежку на чекбоксы еще и файлы *.bin есть

bin - это сконвертированные (в данном случае) текстуры. xdb рядом с bin'ами рассказывают какая это текстура, есть ли там прозрачность(альфа канал) или нет, какого она размера и т.п.

( А чек бокс такая нужная вещь...)) Эту магию надо разгадать))
Чекбокс это просто кнопка с состояниями(вариантами).
Да и есть еще какие-то интересные файлы *.luac что это за звери?)).

Спасибо)

luac - lua compiled. Скомпилированный луа скрипт. Его текст уже не посмотреть, увы.

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

Спасибо) Столько всего интересного. Уже читаю.)) Думаю в Выходной времени побольше будет. Сяду потыкаю и чтонибудь уже получится)

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

А есть ли какая нибудь функция на вещи которые находятся не у персонажа?

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

А есть ли какая нибудь функция на вещи которые находятся не у персонажа?

Конкретнее? Функция на вещи? Не совсем понял. Можно осмотреть экипировку другого игрока. Уточни вопрос. Что ты хочешь делать с вещами которые находятся не у персонажа, не у персонажа где? У другого персонажа? Или в банке? Или на почте?

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

Да те функции видел... Мне бы скажем так бесхозные вещи, т.е. заложенные в БД игры

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

Да те функции видел... Мне бы скажем так бесхозные вещи, т.е. заложенные в БД игры

Попросту перебери все идентификаторы от 1 до....

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

 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 ). Вооть(

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

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

Доброго времени суток) Я вам еще не надоел?)

вот на такое ругается почему то(


-- Отформатируем данные (чтобы приписывался 0 с переди)
silver = common.FormatInt( silver, "%02d" )
copper = common.FormatInt( copper, "%02d" )

-- Собераем данные в одну строку
local kriPokupView = userMods.ToWString("КриПок:"..gold.."."..silver.."."..copper)

-- Задаем свойства графическому элементу.
wtMessage:SetVal( "myrmyr2", kriPokupView )

И хотел спросить. А если со звуком работать (вроде функции есть такие) то он не будет играть при отключённом в настройках?

И еще вопрос до кучи. Понимаю что не хорошо но на сколько можно имеющиеся аддоны задействовать?

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

вот на такое ругается почему то(


-- Отформатируем данные (чтобы приписывался 0 с переди)
silver = common.FormatInt( silver, "%02d" )
copper = common.FormatInt( copper, "%02d" )

-- Собераем данные в одну строку
local kriPokupView = userMods.ToWString("КриПок:"..gold.."."..silver.."."..copper)

-- Задаем свойства графическому элементу.
wtMessage:SetVal( "myrmyr2", kriPokupView )

Не просто форматируешь, а переводишь в WString, а потом пытаешься соединить со string. Так делать нельзя.

Замени

silver = common.FormatInt( silver, "%02d" )

на

silver = string.format( "%02d", silver )

И хотел спросить. А если со звуком работать (вроде функции есть такие) то он не будет играть при отключённом в настройках?

Со звуком нельзя работать.

И еще вопрос до кучи. Понимаю что не хорошо но на сколько можно имеющиеся аддоны задействовать?

Если я правильно понял вопрос, то каждый для себя определяет сам.

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

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

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

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

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

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

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


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

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

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