icreator Posted December 29, 2010 Share Posted December 29, 2010 чем отличается userMods.GetAvatarConfigSection( common.GetAddonName() ) от GetGlobalConfigSection если мой персонаж вышел из игры то эти настройки тоже пропадают? Quote Link to comment Share on other sites More sharing options...
SLA Posted December 29, 2010 Share Posted December 29, 2010 Ничего нигде не пропадает. Get/SetGlobalConfigSection - общие настройки для ВСЕХ персонажей, на всех серверах. Эта секция в конфиге всего одна. Рекомендую именно СЮДА сохранять все настройки аддонов, кроме тех редких случаев, когда приходится пользоваться вторым вариантом: Get/SetAvatarConfigSection - персональный настройки конкретного персонажа, которым играют в данный момент. Таких секций в конфиге может быть очень много - по одной на каждого персонажа на каждом сервере (у меня их 30-40 штук, наверное). По возможности, рекомендую НЕ пользоваться этой секцией. НЕцелесообразно сохранять сюда общие настройки аддонов - несчастным пользователям придётся мучиться, настраивать аддон под каждого своего существующего персонажа, и в будущем, под каждого нового. Но за то, этот способ годится для персональных настроек персонажей, как в твоём LootEDSchoice. В одном аддоне, можно одновременно пользоваться обоими способами - в Global-секцию сохранять общие настройки аддона, а в Avatar-секцию только те настройки, которые нужны только персонально этому аватару. P.S. Обе эти функции, хранят данные в файле: Allods Online\Personal\user.cfg можешь посмотреть, какой там бардак Quote Link to comment Share on other sites More sharing options...
SLA Posted December 29, 2010 Share Posted December 29, 2010 И очень рекомендую, всегда стараться, чтобы сохраняемые данные были КАК МОЖНО КОМПАКТНЕЕ. Потому, что, от некоторых аддонов, этот файл настроек, пухнет как на дрожжах. И каждый вызов функции Set*ConfigSection(), создаёт лаг в игре, и перезапись ВСЕГО этого файла целиком. Есть ПЛОХИЕ аддоны, немеренно и бесконечно плодящие секции и создающие толстые таблицы. Таких аддонов всего несколько, и они способны <зачёркнуто>устроить апокалипсис</зачёркнуто> настрочить МЕГАБАЙТЫ (даже, гигабайты, и более) данных. Из-за этих аддонов, иногда приходится чистить этот файл, когда он на 99% состоит из их мусора. Пример ХОРОШЕГО аддона, сохраняющего свои настройки компактно - GuildGui1b. Его Global-секция выглядит вот так: Code: table_begin ScriptUserMods_GuildGui1b table_begin data Language = l"rus" ListAll = true PageSize = 30 SortBy = l"ACT" SortOrder = l"ZA" w540x = 216 w540y = 92 w541x = 30 w541y = 0 table_end data remote_version = -1 table_end ScriptUserMods_GuildGui1b И всё! Здесь все его настройки. Language, ListAll, PageSize, SortBy, SortOrder - это настройки самого аддона, w540x, w540y, w541x, w541y - это сохранила библиотека LibDnD (координаты двух окон). Quote Link to comment Share on other sites More sharing options...
icreator Posted December 29, 2010 Author Share Posted December 29, 2010 так почему у меня данные сохраняются если я выхожу через Настройки/Завершить, потом опять вхожу этим же персонажем. а если закрываю окно АО и потом запускаю поновой игру то ничего не сохраняется (( 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: Quote Link to comment Share on other sites More sharing options...
SLA Posted December 29, 2010 Share Posted December 29, 2010 Quote: может путаница с self: choice: Наверное. Quote Link to comment Share on other sites More sharing options...
icreator Posted December 29, 2010 Author Share Posted December 29, 2010 кстати в 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 затем вообще пусто (( Quote Link to comment Share on other sites More sharing options...
SLA Posted December 29, 2010 Share Posted December 29, 2010 Всё правильно, это одна из avatar-секций твоего аддона. С двумя предметами. Quote Link to comment Share on other sites More sharing options...
icreator Posted December 29, 2010 Author Share Posted December 29, 2010 кстати дурдом - там для каждого персонажа сохраняется отдельно настройки клавиатуры 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 ... да короче нельзя в качестве индекса у таблицы делать строку с пробелами (( и никакие ухищрения не помогают - надо запаковывать свои данные так чтобы они были без пробелов Quote Link to comment Share on other sites More sharing options...
SLA Posted December 29, 2010 Share Posted December 29, 2010 Не знаю, никогда с таким не сталкивался. Нужно разбираться. Quote Link to comment Share on other sites More sharing options...
icreator Posted December 29, 2010 Author Share Posted December 29, 2010 короче нельзя такие иметь таблицы: Code: табл ["Знак Рвения"] = val но можно: Code: табл ["Знак_Рвения"] = valтабл ["\"Знак_Рвения"] = val табл ["1092"] = val Quote Link to comment Share on other sites More sharing options...
icreator Posted December 30, 2010 Author Share Posted December 30, 2010 в общем мне пришлось запаковать свою базу знаний в компактную таблицу для сохранения в конфигурации: 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 Quote Link to comment Share on other sites More sharing options...
icreator Posted December 30, 2010 Author Share Posted December 30, 2010 кстати идея про 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 Quote Link to comment Share on other sites More sharing options...
icreator Posted December 30, 2010 Author Share Posted December 30, 2010 ну в общем я запаковала данные в 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" явно компактней. и я сделала сохранение в секции аватара - так как разным персонажам нужны разные аддоны - кому защита, кому хил, кому агр, а кому магические Quote Link to comment Share on other sites More sharing options...
icreator Posted December 30, 2010 Author Share Posted December 30, 2010 мимоходом замечание для разрабов - у нних настройка быстрых клавиш тоже некомпактно сохраняется: 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" ... Quote Link to comment Share on other sites More sharing options...
duvo Posted December 30, 2010 Share Posted December 30, 2010 Откровенно говоря, подобный подход мне не очень нравится. По-моему, выигрыша ни в скорости, ни в надежности, ни в удобстве не получается. Предположим, нужно работать с 10 значениями разных типов. Сперва их придется склеить в строку, вставляя между подстроками разделитель. Затем эту строку разбирать, выуживая значения. Важен порядок записи/чтения. Хотя можно, запаковывать пару "имя_переменной-значение". Понадобятся функции pack/unpack. Несколько сумбурно, н-да. В общем, нужна оценка компетентного программиста, коим я ни разу не являюсь Quote Link to comment Share on other sites More sharing options...
Guest Hommit Posted December 30, 2010 Share Posted December 30, 2010 кстати про сохранение... с квест трекером имхо надо чтото делать он, похоже, записывает положение *каждого* рандомного моба в конфиг, как цель заданий )) Quote Link to comment Share on other sites More sharing options...
icreator Posted December 31, 2010 Author Share Posted December 31, 2010 поидее есть(?) стандартный распаковщик командных строк Quote Link to comment Share on other sites More sharing options...
SLA Posted December 31, 2010 Share Posted December 31, 2010 Угу, если так, то это не очень хорошо. Имхо, он должен сохранять координат только для тех квестов, для которых не указано место выполнения (Межевые камни, и др. квесты, для которых нет маркеров на карте). Таких квестов не много, поэтому, БД будет небольшой и компактной. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.