Jump to content

Digest August

We talk about what was done and updated in the past month. We help keep abreast of events.

Read more

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

Game tooltips

Tooltips provide a way for 3rd party fansites and extensions to display detailed information on mouseover.

Read more

сохранение настрое к аддоне


icreator
 Share

Recommended Posts

Ничего нигде не пропадает.

Get/SetGlobalConfigSection - общие настройки для ВСЕХ персонажей, на всех серверах.

Эта секция в конфиге всего одна.

Рекомендую именно СЮДА сохранять все настройки аддонов, кроме тех редких случаев, когда приходится пользоваться вторым вариантом:

Get/SetAvatarConfigSection - персональный настройки конкретного персонажа, которым играют в данный момент.

Таких секций в конфиге может быть очень много - по одной на каждого персонажа на каждом сервере (у меня их 30-40 штук, наверное).

По возможности, рекомендую НЕ пользоваться этой секцией. НЕцелесообразно сохранять сюда общие настройки аддонов - несчастным пользователям придётся мучиться, настраивать аддон под каждого своего существующего персонажа, и в будущем, под каждого нового. Но за то, этот способ годится для персональных настроек персонажей, как в твоём LootEDSchoice.

В одном аддоне, можно одновременно пользоваться обоими способами - в Global-секцию сохранять общие настройки аддона, а в Avatar-секцию только те настройки, которые нужны только персонально этому аватару.

P.S. Обе эти функции, хранят данные в файле:

Allods Online\Personal\user.cfg

можешь посмотреть, какой там бардак :)

Link to comment
Share on other sites

И очень рекомендую, всегда стараться, чтобы сохраняемые данные были КАК МОЖНО КОМПАКТНЕЕ. Потому, что, от некоторых аддонов, этот файл настроек, пухнет как на дрожжах. И каждый вызов функции 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 (координаты двух окон).

Link to comment
Share on other sites

так почему у меня данные сохраняются если я выхожу через Настройки/Завершить, потом опять вхожу этим же персонажем.

а если закрываю окно АО и потом запускаю поновой игру то ничего не сохраняется ((

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:

Link to comment
Share on other sites

кстати в 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

затем вообще пусто ((

Link to comment
Share on other sites

кстати дурдом - там для каждого персонажа сохраняется отдельно настройки клавиатуры

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

...

да короче нельзя в качестве индекса у таблицы делать строку с пробелами ((

и никакие ухищрения не помогают - надо запаковывать свои данные так чтобы они были без пробелов

Link to comment
Share on other sites

короче нельзя такие иметь таблицы:

Code:
табл ["Знак Рвения"]  = val

но можно:

Code:
табл ["Знак_Рвения"]  = val

табл ["\"Знак_Рвения"]  = val

табл ["1092"]  = val

Link to comment
Share on other sites

в общем мне пришлось запаковать свою базу знаний в компактную таблицу для сохранения в конфигурации:

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

Link to comment
Share on other sites

кстати идея про 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

Link to comment
Share on other sites

ну в общем я запаковала данные в 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"

явно компактней. и я сделала сохранение в секции аватара - так как разным персонажам нужны разные аддоны - кому защита, кому хил, кому агр, а кому магические

Link to comment
Share on other sites

мимоходом замечание для разрабов - у нних настройка быстрых клавиш тоже некомпактно сохраняется:

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"

...

Link to comment
Share on other sites

Откровенно говоря, подобный подход мне не очень нравится. По-моему, выигрыша ни в скорости, ни в надежности, ни в удобстве не получается.

Предположим, нужно работать с 10 значениями разных типов. Сперва их придется склеить в строку, вставляя между подстроками разделитель. Затем эту строку разбирать, выуживая значения. Важен порядок записи/чтения. Хотя можно, запаковывать пару "имя_переменной-значение". Понадобятся функции pack/unpack.

Несколько сумбурно, н-да. В общем, нужна оценка компетентного программиста, коим я ни разу не являюсь :)

Link to comment
Share on other sites

кстати про сохранение...

с квест трекером имхо надо чтото делать он, похоже, записывает положение *каждого* рандомного моба в конфиг, как цель заданий ))

Link to comment
Share on other sites

Угу, если так, то это не очень хорошо.

Имхо, он должен сохранять координат только для тех квестов, для которых не указано место выполнения (Межевые камни, и др. квесты, для которых нет маркеров на карте). Таких квестов не много, поэтому, БД будет небольшой и компактной.

Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use