Jump to content

Digest October-December

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

December November October

Servers monitoring and the Addons Editor

We present you two legends. All dreams come true.

Servers monitoring The Addons Editor

A statistics bot for Telegram

Convenient analytics right on your phone.

Read more

Game tooltips

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

Read more

The Addons Updater

Let us to introduce the addons updating software and to share the details

Read more Download

Инициализация объектов в lua


Anfet

Recommended Posts

Добрый день.

Задался вопросом написать хоть какой-то аддончик.

И конечно же сразу же наткнулся на проблему инициализации объектов.

Взял исходный код icreator для надписи сообщения в свой чат.

--------------------------------------------------------------------------------------

Global( "Chat", {} )

local wtChat = nil

local chatRows = 0 --- for clear buffer after show messages

function Chat:LogToChat(message, color, fontSize)

if not wtChat and not errMess.Chat then

---- если окно еще не искали и ошибки при этом не было. а если уже ошибка была то не искать

--- найдем окно чата

--- Chat..Chat

local w

w = stateMainForm:GetChildUnchecked("Chat", false)

if not w then

--- главня форма не найдена - найден по ребенку

w = stateMainForm:GetChildUnchecked("Chat", true)

else

w = w:GetChildUnchecked("Chat", true)

end

wtChat = w

end

if not wtChat or not wtChat.PushFrontValuedText then

if not errMess.Chat then

errMess.Chat = "can't find Chat window"

LogError(errMess.Chat)

end

return

end

local valuedText = common.CreateValuedText()

--- fontname=\"AllodsWest\"

local format = "<body alignx='left' fontname='AllodsSystem' fontsize='"..(fontSize or 14)

format = format.."' shadow='1' ><rs class='color'><r name='text'/></rs></body>"

valuedText:SetFormat(userMods.ToWString(format))

if color then

valuedText:SetClassVal( "color", color )

else

valuedText:SetClassVal( "color", "LogColorYellow" )

end

if not common.IsWString( message ) then message = userMods.ToWString(message) end

---message = ToWS(chatRows.. ":".. FromWS(message))

valuedText:SetVal( "text", message )

---wtChat:PopBack() --- ++

chatRows = chatRows + 1

wtChat:PushFrontValuedText( valuedText )

---wtChat:PushFrontRawText( message ) --- текст не видно ((

end

--- call by "EVENT_SECOND_TIMER" - for clear messages from chat

function Chat:ClearChat( size )

for i=1, size or math.ceil( chatRows / 30 ) + 1 do

if chatRows < 1 then break end

chatRows = chatRows - 1

wtChat:PopBack()

end

end

------------------------------------------------------------------------------------

Вроде как тут всё понятно.

Теперь сам test.lua

--------------------------------------------------------------------------------

-- INITIALIZATION

--------------------------------------------------------------------------------

function Init()

LogInfo( "Initialization sample" )

Chat:LogToChat({ text = "Привки ВСЕМ!", color = "LogColorGreen" })

end

--------------------------------------------------------------------------------

Init()

--------------------------------------------------------------------------------

Тоже всё ясно.

В AddonDesc следующие подключения:

<Item href="Chat.lua" />

<Item href="Test.lua" />

Однако в логах выводится ошибка что Chat nil.

Я честно пытался искать как его заинициализировать, но тщетно. Тот же LibDND тоже используется одну глобу и после легко к ней обращается. Без какой-либо инициализации.

Если просто подключить функиции, то в логе идёт ошибка декларации LogToChat

Error: addon Test: Attempt to read from undeclared global variable: LogToChat

Подскажите что я не догоняю? Как правильно подключать внешние Lua файлы чтобы исходник видел внутренние функции.

Link to comment
Share on other sites

Верхний код в файле Chat.lua находится?

В логе еще какие ошибки появляются?

С самого начала

ЗЫ. Розочин код в качестве примера использовать не советовал бы никогда и никому

Link to comment
Share on other sites

Да.

Info: addon Test: Initialization sample

Error: addon Test:

Error: addon Test:

Error: addon Test: func: ?, ?, line: -1, defined: C, line: -1, [C]

Error: addon Test: func: Init, global, line: 6, defined: Lua, line: 4, [string "Mods/Addons/Test/Test.lua"]

Error: addon Test: func: ?, ?, line: 9, defined: main, line: 0, [string "Mods/Addons/Test/Test.lua"]

Error: addon Test: Attempt to read from undeclared global variable: LogToChat

Error: addon Test: Error while running the chunk

Error: addon Test: [string "Mods/Addons/Test/Test.lua"]:6: attempt to call global `LogToChat' (a nil value)

Error: addon Test: func: LogToChat, global, line: -1, defined: C, line: -1, [C]

Error: addon Test: func: Init, global, line: 6, defined: Lua, line: 4, [string "Mods/Addons/Test/Test.lua"]

Error: addon Test: func: ?, ?, line: 9, defined: main, line: 0, [string "Mods/Addons/Test/Test.lua"]

Error: addon Test: Can't execute script for addon: Mods/Addons/Test/AddonDesc.(UIAddon).xdb

Если выставить просто функцию - то выходит такие ошибки.

Link to comment
Share on other sites

Вот эта хрень "LogInfo" находится в стандартных сэмплах

В AddonDesc.(UIAddon).xdb вписываешь еще и <Item href="/Mods/SampleCommon/SampleAddonBase.lua" /> если нужна

Нафига ее(и вообще их) используют - яхз

Вот эта хрень "errMess" - Розочкина хрень

И вообще-то в логах на нее должна быть ругань поначалу, раз ее у тебя нет

Добавляешь 3-й строчкой в Chat.lua:

local errMess = {Chat="OK"}

А дальше... ошибок нет и текста нет

Чо там куда выводиться должно - яхз

...

А если сделать так:

local errMess = {Chat=nil}

То выводится сообщение в лог "can't find Chat window"

Может и здесь собака порылась

Edited by Nikon
Link to comment
Share on other sites

По-моему, это какой-то старый вариант ее скрипта. Сейчас у виджетов чата другие имена же.

Link to comment
Share on other sites

Вот у кого надо брать примеры кода :)

...

По поводу "Привки ВСЕМ!" - не дождесся. Весь этот текст кроме тебя не увидит никто

Link to comment
Share on other sites

старый вариант

Да, новый можно найти в ScriptLIB.lua ( AddonsTools ), если интересно.

Чтобы заработал вариант из 1-го сообщения:

1. В Chat.lua добавить строку в начале:

local errMess = {}

И заменить в строках:

w = stateMainForm:GetChildUnchecked("Chat", false)

w = w:GetChildUnchecked("Chat", true)

"Chat" и "Chat" на "ChatLog" и "Container" соответственно.

2. В Test.lua заменить

Chat:LogToChat({ text = "Привки ВСЕМ!", color = "LogColorGreen" })

на

Chat:LogToChat( "Привки ВСЕМ!", "LogColorGreen" )

В данном примере ошибка

Attempt to read from undeclared global variable: LogToChat

будет возникать, если Chat.lua не загружен совсем либо загружен после Test.lua.

Следует проверить пути, имена файлов и порядок загрузки.

Рабочий вариант прикрепил.

Вот у кого надо брать примеры кода :)

Не, лучше что-нибудь отсюда. Хотя бы. :)

Test.zip

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.

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.

×
×
  • Create New...

Important Information

By using our site you agree to the Terms of Use