Jump to content
Alloder.pro: about Allods with love
Search In
  • More options...
Find results that contain...
Find results in...

New program for writers

We turn from quantity to quality and tell you how we will supplement the Allods Team program with rewards in rubles.

More

The new Updater

Let us to introduce the new addon updater software and to share the details

Read more

Alloder 2.0

We have started the process of project evolve, and this relates not only, and not even primarily of the site's view

Read more

Помощь в работе с классами


Guest untomas
 Share

Recommended Posts

Guest untomas

Пишу аддон - и столкнулся с проблемой при работе с классами,

очень хочется разобраться с этим

код аддона

Code:

Global("tmp", 0)

Global("param1", "param1")

Global("param2", "param2")

Global("param3", "param3")

Global("obj1", "obj1")

Global("obj2", "obj2")

--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! КЛАССЫ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

--------------------------------------Класс "data"------------------------------------------------------------------

Global("data" , {

 ["List"]  = {}

})

function data:Initialize()

common.LogInfo(common.GetAddonName(),"Создаем ",obj1)

self:AddNewObject(obj1)

common.LogInfo(common.GetAddonName(),"Создаем ",obj2)

self:AddNewObject(obj2)

-- добавляем к каждому обьекту параметры "param2"

common.LogInfo(common.GetAddonName(),"добавляем к ",obj1, " параметр ", param2)

data.List [obj1] :AddNewParam(param2)

common.LogInfo(common.GetAddonName(),"добавляем к ",obj2, " параметр ", param2)

data.List [obj2] :AddNewParam(param2)

-- выводим в mods.txt список обьектов и их параметров

for k1,v1 in data.List do

common.LogInfo(common.GetAddonName(),k1)

for k2,v2 in v1.ParamsList do

common.LogInfo(common.GetAddonName()," ",k2," ",common.FormatInt(v2.data,"%i"))

end

end

--меняем у первого обьекта значение первого параметра

common.LogInfo(common.GetAddonName(),"изменяем ",param1," у ",obj1, " на 10")

data.List [obj1] .ParamsList [param1] .data = 10

common.LogInfo(common.GetAddonName(),"добавляем ",param3," к ",obj1)

data.List [obj1] :AddNewParam(param3)

-- выводим в mods.txt список обьектов и их параметров

for k1,v1 in data.List do

common.LogInfo(common.GetAddonName(),k1)

for k2,v2 in v1.ParamsList do

common.LogInfo(common.GetAddonName()," ",k2," ",common.FormatInt(v2.data,"%i"))

end

end

end

function data:AddNewObject(name)

local NewObject = {}

setmetatable( NewObject, {__index = ObjectData})

common.LogInfo(common.GetAddonName()," инициализируем ",name)

NewObject:Initialize(name)

self.List [name]  = NewObject

end

--------------------------------------конец класса "data"-----------------------------------------------------------

--------------------------------------Класс "ObjectData"------------------------------------------------------------------

Global("ObjectData" , {

 ["ParamsList"]  = {}

})

function ObjectData:Initialize(name)

-- при инициализации обьекта к нему сразу добавляется параметр "param1"

common.LogInfo(common.GetAddonName()," добавляем параметр ",param1)

self:AddNewParam(param1)

end

function ObjectData:AddNewParam(name)

local NewParam = {}

setmetatable( NewParam, {__index = Params})

common.LogInfo(common.GetAddonName()," инициализируем параметр ",name)

NewParam:Initialize(name)

self.ParamsList [name]  = NewParam

end

--------------------------------------конец класса "ObjectData"-----------------------------------------------------------

--------------------------------------Класс "Params"------------------------------------------------------------------

Global("Params" , {

 ["data"]  = 0

})

function Params:Initialize(name)

tmp = tmp + 1

common.LogInfo(common.GetAddonName()," было ",common.FormatInt(self.data,"%i"))

self.data = tmp

common.LogInfo(common.GetAddonName()," стало ",common.FormatInt(self.data,"%i"))

end

--------------------------------------конец класса "Params"-----------------------------------------------------------

--!!!!!!!!!!!!!!!!!!!!!!!!!!конец раздела "КЛАССЫ" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ФУНКЦИИ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

function Init()

common.LogInfo(common.GetAddonName(),"аддон включен")

data:Initialize()

end

--!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! конец раздела "ФУНКЦИИ" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Init()

информация из mods.txt

Code:

Info: addon test: аддон включен

Info: addon test: Создаем obj1

Info: addon test:  инициализируем obj1

Info: addon test:  добавляем параметр param1

Info: addon test:  инициализируем параметр param1

Info: addon test:  было 0

Info: addon test:  стало 1

Info: addon test: Создаем obj2

Info: addon test:  инициализируем obj2

Info: addon test:  добавляем параметр param1

Info: addon test:  инициализируем параметр param1

Info: addon test:  было 0

Info: addon test:  стало 2

Info: addon test: добавляем к obj1 параметр param2

Info: addon test:  инициализируем параметр param2

Info: addon test:  было 0

Info: addon test:  стало 3

Info: addon test: добавляем к obj2 параметр param2

Info: addon test:  инициализируем параметр param2

Info: addon test:  было 0

Info: addon test:  стало 4

Info: addon test: obj2

Info: addon test:  param2 4

Info: addon test:  param1 2

Info: addon test: obj1

Info: addon test:  param2 4

Info: addon test:  param1 2

Info: addon test: изменяем param1 у obj1 на 10

Info: addon test: добавляем param3 к obj1

Info: addon test:  инициализируем параметр param3

Info: addon test:  было 0

Info: addon test:  стало 5

Info: addon test: obj2

Info: addon test:  param2 4

Info: addon test:  param1 10

Info: addon test:  param3 5

Info: addon test: obj1

Info: addon test:  param2 4

Info: addon test:  param1 10

Info: addon test:  param3 5

т.е. изменяем параметр param1 только у первого обьекта - он изменяется у обоих

при добавлении нового параметра к обьекту obj1 - он появляется у обоих обьектов.

Link to comment
Share on other sites

Очень грамотно составленный запрос о помощи. Странно, что никто до сих пор не отозвался, аж стыдно за коллег :)

Лично я ещё не сделал ни одного аддона, в котором бы активно использовались классы. Поэтому я ещё не разбирался, как классы работают в LUA, и конкретно в Аллодах. И не стесняюсь признаться в этом :)

То есть, мне, по существу, посоветовать нечего :) Я только подозреваю, что в вышеприведённом коде, ты создаёшь НЕ новые объекты, а просто линкуешь один и тот же объект в нескольких местах. Поэтому, когда он изменяется, он изменяется везде. Конечно, я могу ошибаться, т.к. нихрена не смыслю в этом. :)

Но я могу посоветовать посмотреть, как устроена библиотека классов AOClassLibrary.lua, которую можно найти в аддоне DarkDPSMeter. Там всё отлично работает, думаю, ты найдёшь подходящее решение там :)

Link to comment
Share on other sites

Guest untomas

да, мысль о том что создаются линки на один экземпляр мне тоже приходила в голову, но я никак не могу разобраться почему это происходит =)

ну а AOClassLibrary.lua я просто как настольную книгу использую =D

эх... буду дальше ковырять..ну и ждать, может ктонить разжует =\

Link to comment
Share on other sites

Зря :)

В Аллодах используется обычный Lua 5.0.

Поэтому, обучиться работе с классами поможет любой учебник по Lua.

Link to comment
Share on other sites

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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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