Классы
Статы, идеальное соотношение · Умения и вехи, как получить · Души · Сравнение классов
Воин · Жрец · Некр · Лучник · Шаман · Мист · Бард · Инж · Демон
Игровой процесс
Как одеваться · Драконий облик · Наследие Богов · Фарм золота
Прохождения локаций
Мониторинг серверов и редактор аддонов
Представляем вам две легенды. То, о чем можно было только мечтать, стало реальностью.
Подсказки из игры на вашем сайте
Теперь вы можете отображать сведения о внутриигровых элементах простым наведением курсора мыши.
-
Постов
3 118 -
Зарегистрирован
-
Посещение
Тип контента
Загрузки
Форумы
Статьи и объявления
Гардероб
Маунты
Сообщения Allods Team
Магазин
Галерея
Весь контент icreator
-
я поняла как загрузить - грузим как файл для выполнения: например так: Code: local filename = "C:/Program Files/Games/Allods Online/data/Mods/Addons/GuildCommissionaire/Scripts/list.txt" gList = {} dofile (filename) researchObj(" load:", gList) а в файле list.txt пишет это: Code: gList = {----------------------data MyPers = 1234, ["Большая Розочка"] = " уже совсем взрослая", ["dddd"] = 111, MyPers2 = 233 --------------------- } в результате у нас будут загружены данные из файла! результат работы в ЛогФайле: Code: Info: addon GuildCommissionaire: load: MyPers2:=233{number}Info: addon GuildCommissionaire: load: Большая Розочка:=уже совсем взрослая{string} Info: addon GuildCommissionaire: load: dddd:=111{number} Info: addon GuildCommissionaire: load: MyPers:=1234{number}
-
вообще как-нибудь можно загрузить "на лету" файл? Code: io.input ( [file] )io.lines ( [filename] ) или только через AddonDesc.(UIAddon).xdb
-
Code: will iterate over all the words from string s, printing one per line. The next example collects all pairs key=value from the given string into a table: t = {} s = "from=world, to=Lua" for k, v in string.gfind(s, "(%w+)=(%w+)") do t [k] = v end то есть они заменили string.gmatch на это string.gfind
-
а что стандартные: string.match (s, pattern [, init]) string.gmatch (s, pattern) не работают? мне пишет: Error: addon GuildCommissionaire: Error while running the chunk Error: addon GuildCommissionaire: [string "mods/addons/guildcommissionaire/scriptgcommissionaire.lua"] attempt to call field `match' (a nil value) Error: addon GuildCommissionaire: func: match, field, line: -1, defined: C, line: -1, [c] Error: addon GuildCommissionaire: func: ?, ?, line: 31, defined: Lua, line: 25, [string "mods/addons/guildcommissionaire/scriptgcommissionaire.lua"]
-
поидее есть(?) стандартный распаковщик командных строк
-
5. полученный архив проверяем: либо смотрим что там (там должны быть все пути начиная с Addons), либо распаковываем куда-нибудь: там должна появиться папка Addons и в ней папка с вашим аддоном
-
4. полученный Mods.zip переименовала в свой
-
3. Запаковала самую верхнюю - Mods
-
итак как я в это сделала: 1. создала новую папку Mods/Addons у себя (а не в папке игры) 2. скопировала в эту папку Addons свой аддон, который хранился в папке игры (C:\Program Files\Games\Allods Online\data\Mods\Addons). Получилось: мояПапка\Mods\Addons\LootEDSchoice
-
Quote: Заходим в папку Allods Online\data\Mods\Addons, в которой находятся все папки установленных аддонов. И упаковываем папку со своим новеньким аддоном в ZIP-архив. Получится ZIP, внутри которого одна-единственная папка, названная именем вашего аддона. А уже в ней, находится AddonDesc.(UIAddon).xdb и все остальные файлы/папки аддона. так мы все и делаем и получится архив который надо будет распаовываь сразу в папку Addons а ваши все архивы на сайте запакованы так что их надо распаковывать в Mods
-
этот мой архив делается очень просто
-
вот ЗИП который создается простым выбором из контекстного меню видно сто там нет главной папки Addons и файлы надо распаковывать именно в Addons
-
вот ваши запакованные файлы - видно что там папка аддона вложена в общую папу Addons
-
мимоходом замечание для разрабов - у нних настройка быстрых клавиш тоже некомпактно сохраняется: Code: table_begin action_panel table_begin data int_keys_begin data table_begin 0 int_keys_begin 0 1 = 1 2 = 59301 int_keys_end 0 table_end 0 table_begin 1 int_keys_begin 1 1 = 1 2 = 1355284495 int_keys_end 1 table_end 1 а надо бы сделать: Code: table_begin action_panel table_begin data int_keys_begin data 0 = L"1:59301" 1 = L"1:1355284495" ...
-
ну в общем я запаковала данные в AddonManager: Code: ---- запаковывает базу знаний в конфигурацию function toConfig( DB ) local config = {} for k, _ in pairs( DB ) do config [ k ] = (DB [ k ] .state and 1 or 0) .. (DB [ k ] .comment or "") end userMods.SetAvatarConfigSection( common.GetAddonName(), config ) end ---- распаковывает конфигурацию в базу знаний function fromConfig() local config = userMods.GetAvatarConfigSection( common.GetAddonName() ) or {} --- если секция не найдена то --- инициализируем как таблицу local DB = {} for k, v in pairs( config ) do DB [ k ] = { comment = string.sub (v, 2) or "--" } --- сразу создаст таблицу в таблице DB [ k ] = { state = (string.sub (v, 0, 1) + 0) == 1 } end return DB end ---------------- addon.Init = function( self ) .... --- self.config = userMods.GetGlobalConfigSection( common.GetAddonName() ) or {} self.config = fromConfig() end addon.SaveConfig = function( self ) ... --- userMods.SetGlobalConfigSection( common.GetAddonName(), self.config ) toConfig ( self.config ) end результат теперь такой: Code: table_begin ScriptUserMods_AddonManager table_begin data Alchemy = l"1" ArmorCraft = l"1" AstralMap = l"1" BattleEnd = l"1" BonusStatSelector = l"0" BuffInfo = l"1" явно компактней. и я сделала сохранение в секции аватара - так как разным персонажам нужны разные аддоны - кому защита, кому хил, кому агр, а кому магические
-
кстати идея про AddonManager там данные сохраняются не компактно: Quote: table_begin ScriptUserMods_AddonManager table_begin data table_begin Alchemy state = true table_end Alchemy table_begin ArmorCraft state = true table_end ArmorCraft table_begin AstralMap state = true table_end AstralMap table_begin BattleEnd state = true table_end BattleEnd ... а можно было бы так: Code: table_begin ScriptUserMods_AddonManager table_begin data Alchemy = L"1" ArmorCraft = L"1" AstralMap = L"0карта астрала" BattleEnd = L"1это конец" то есть в одной строке запаковать 2 значения: state и comment
-
в общем мне пришлось запаковать свою базу знаний в компактную таблицу для сохранения в конфигурации: Code: choice.DBtoConfig = function( self ) local config = {} local i = 0 for k, v in pairs( self.DB ) do config [ i ] = v .. k i = i + 1 end userMods.SetAvatarConfigSection( common.GetAddonName(), config ) end choice.DBfromConfig = function( self ) self.DB = {} --- обнулим текущие знания local config = userMods.GetAvatarConfigSection( common.GetAddonName() ) or {} --- если секция не найдена то --- инициализируем как таблицу for _, v in pairs( config ) do self.DB [ string.sub (v, 2) ] = string.sub (v, 0, 1) + 0 end end после чего они стали сохраняться в таком виде: Code: table_begin ScriptUserMods_LootEDSchoice table_begin data 0 = l"2Закрытый подарок" 1 = l"2Пластырь" 2 = l"2Закрытый малый подарок" table_end data remote_version = -1 table_end ScriptUserMods_LootEDSchoice
-
короче нельзя такие иметь таблицы: Code: табл ["Знак Рвения"] = val но можно: Code: табл ["Знак_Рвения"] = valтабл ["\"Знак_Рвения"] = val табл ["1092"] = val
-
кстати дурдом - там для каждого персонажа сохраняется отдельно настройки клавиатуры Code: table_begin key_bindings table_begin data table_begin data table_begin mission_actions table_begin action_01 table_begin 0 key = L"NUM_4" table_end 0 table_end action_01 надо про это разрабам сказать - а то слишком много инфо копируется зря ну хорошо - а почему когда я делаю загрузку этих 2-х строк у меня в таблице choice.DB оказывается всего 1 строка? - каждый раз на 1 строку меньше (( понятно! у меня там не строковая переменная а имя индекса да еще с пробелами может поэтому не получается... должно быть что-то вроде L" Code: row1 = L"Закрытый малый подарок" row2 = 2 а в AddonManager конфиге вообще так: Code: table_begin data table_begin UserAddon/AucEDSman state = true table_end UserAddon/AucEDSman ... да короче нельзя в качестве индекса у таблицы делать строку с пробелами (( и никакие ухищрения не помогают - надо запаковывать свои данные так чтобы они были без пробелов
-
кстати в user.cfg есть: Code: table_begin ScriptUserMods_LootEDSchoice table_begin data Закрытый малый подарок = 2 Пластырь = 2 table_end data remote_version = -1 table_end ScriptUserMods_LootEDSchoice а после того как я еще раз заходу персонажем уже остается Code: table_begin ScriptUserMods_LootEDSchoice table_begin data Пластырь = 2 table_end data remote_version = -1 table_end ScriptUserMods_LootEDSchoice затем вообще пусто ((
-
так почему у меня данные сохраняются если я выхожу через Настройки/Завершить, потом опять вхожу этим же персонажем. а если закрываю окно АО и потом запускаю поновой игру то ничего не сохраняется (( Code: choice._R [ "EVENT_UNKNOWN_SLASH_COMMAND" ] = function( event ) local cmd = FromWS(event.text) if cmd == "/lc study" then choice.stage = "STUDY" elseif cmd == "/lc load" then choice.DB = userMods.GetAvatarConfigSection( common.GetAddonName() ) or {} elseif cmd == "/lc save" then userMods.SetAvatarConfigSection( common.GetAddonName(), choice.DB ) end end choice._R [ "EVENT_AVATAR_CREATED" ] = function( ) --- инициация переменных тут --- иначе будет нил если в глобал переменной сразу присвоить choice:initVal() end choice.initVal = function( self ) ---LogInfo("initVal") self.DB = userMods.GetAvatarConfigSection( common.GetAddonName() ) or {} --- если секция не найдена то --- инициализируем как таблицу self.myID = avatar.GetId() end choice.Init = function( self ) --- на случай перезагрузки аддона иницируем переменные if avatar.IsExist() then self:initVal() end --- включим слежку за событиями self:Reg() end -------------------------------------------------------------------------------- choice:Init() -------------------------------------------------------------------------------- может путаница с self: choice:
-
чем отличается userMods.GetAvatarConfigSection( common.GetAddonName() ) от GetGlobalConfigSection если мой персонаж вышел из игры то эти настройки тоже пропадают?
-
как я сделала WidgetEditLine взяла окантовку стандартную от MainPanel: Code: <BackLayer href="MainFrame.(WidgetLayerTiledTexture).xdb#xpointer(/WidgetLayerTiledTexture)" /> и создала панель WidgetPanel с этой окантовкой и расположением как у WidgetEditLine : Code: <?xml version="1.0" encoding="UTF-8" ?><WidgetPanel> <Name></Name> <Priority>0</Priority> <Children /> <BackLayer href="MainFrame.(WidgetLayerTiledTexture).xdb#xpointer(/WidgetLayerTiledTexture)" /> <Placement> <X> <Align>WIDGET_ALIGN_LOW</Align> <Pos>78</Pos> <Size>100</Size> </X> <Y> <Pos>35</Pos> <Size>45</Size> </Y> </Placement> </WidgetPanel> затем эту панель поставила под WidgetEditLine: Code: <Item href="Input1.(WidgetEditLine).xdb#xpointer(/WidgetEditLine)" /> <Item href="Input1Panel.(WidgetPanel).xdb#xpointer(/WidgetPanel)" /> а текстуры взяла стандартные. полный пример использования в AucEDSman
-
в общем я сделала массив глобальным и просто к нему из подпрограммы по индексам обращаюсь: Code: MyCompare = function (IndexA, IndexB ) local tA = addon.widgets.elems [IndexA] local tB = addon.widgets.elems [IndexB] return ( FromWS(tA.name) .. FromWS(tA.comment) ) < (FromWS(tB.name) .. FromWS(tB.comment) ) end
