|
Форум Обсуждение аддонов Разработка аддонов WoW Комментарий к персонажу |
Комментарий к персонажу |
Всем привет! Сегодня статья будет не обычная, а очень большая (^_^). В этой статье я буду рассказывать как создать аддон "Комментарий к персонажу". Суть аддона заключается в том что к любому персонажу можно добавить комментарий.
(Сори за звуки в скайпе друг флудил.) Инструкция по созданию toc файла - клик Ссылка на предыдущие статью - Меню текстур Скачать notepad++ - Скачать API функции - WoWJP API Начнем... В первую очередь в файле TOC, прописываем новую базу под названием "TC", она нам нужна для сохранение всей информации. Теперь открываем наш Lua, файл и прописываем там: Code TC = {} Этим мы говорим клиенту что у нас зарегистрирована база данных под именем WM. Также вписуем туда Code Error = {} Можно приступить к созданию надписи в меню при нажатии на иконку персонажа. Code UnitPopupButtons["ADDCOMMENT"] = {text = "|cffd2b48cДобавить комментарий|r", dist = 0} ADDCOMMENT - Название нашего пункта в меню. Создаем функцию которая будет формировать структуру меню. Code function ADDCOMMENT(name, value) UnitPopupMenus[name][#(UnitPopupMenus[name])-1] = value end 1 - Позиция кнопки. Дальше создаем ... Не знаю даже как назвать "Ссылку", "Указатель" где будет находится наша кнопка. Code ADDCOMMENT("PLAYER", "ADDCOMMENT") PLAYER - Позиция кнопки. Делаем условие которое выглядит так "Мы открыли Popup меню и у нас происходят следующие действия ... " Code hooksecurefunc("UnitPopup_OnClick", function(self) if (self.value == "ADDCOMMENT") then addcomentframe:Show() end end) addcomentframe:Show() - Открытие фреймы куда писать коменты. Теперь можно и текстуру создать. Многие могли бы спросить: Почему я текстуру ставлю всегда первой а не в конце.. Ответ на этот вопрос прост: При загрузки аддона он считывает информацию с вехру в низ, т.е если у нас в начале будет фрейма а потом массив с текстурами то будет ошибка. Ошибка будет из за того что фрейма уже загрузилась а массив с текстурами нет, фрейма посылает запрос на массив а его нету в памяти вот и ошибка. Code backdrop = { bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", edgeSize = 16, insets = { left = 3, right = 3, top = 3, bottom = 3 } } Текстуры можете установить свои... Я поставил эти т.к у мну не хватило фантазии на другое. Создаем саму фрейму с помощью которой мы будем добавлять текст для комментария. Code addcomentframe = CreateFrame("FRAME","addcomentframe_frame",UIParent); addcomentframe:SetMovable(true) addcomentframe:EnableMouse(true) addcomentframe:SetClampedToScreen(true) addcomentframe:SetScript("OnMouseDown", addcomentframe.StartMoving) addcomentframe:SetScript("OnMouseUp", addcomentframe.StopMovingOrSizing) addcomentframe:SetWidth(400); addcomentframe:SetHeight(150); addcomentframe:SetPoint("CENTER", repChoiceOffX, repChoiceOffY ); addcomentframe:SetBackdrop(backdrop); addcomentframe:SetBackdropColor(0.2,0.2,0.2,1); addcomentframe:SetBackdropBorderColor(0.2,0.1,0.1,1); addcomentframe:Hide() addcomentframe:SetBackdrop(backdrop); - Берем текстуру из массива. Для удобности создаем кнопку закрытия фреймы. Code closeaddcomment = CreateFrame("Button",nil,addcomentframe,"UIPanelCloseButton"); closeaddcomment:SetPoint("TOPRIGHT",0,0); closeaddcomment:SetScript("OnClick",function() addcomentframe:Hide(); end); UIPanelCloseButton - Текстура кнопки "Крестика" закрытия фреймы. Для оформления окошка мы создадим пару надписей... "Ну не голым же его делать Оо" Code nameaddons = addcomentframe:CreateFontString(nil, "OVERLAY", "GameFontNormal") nameaddons:SetPoint("TOP", addcomentframe, "TOP", 0, -10) nameaddons:SetWidth(addcomentframe:GetRight() - addcomentframe:GetLeft()) nameaddons:SetText("|cffFFFFFFДобавить комментарий|r") Я задал "белый" цвет чтобы он гармонировал с фоном И создаем еще один текст который будет говорить нам "Не вводи больше 100 символов..." Code nameaddons1 = addcomentframe:CreateFontString(nil, "OVERLAY", "GameFontNormal") nameaddons1:SetPoint("TOP", addcomentframe, "TOP", 0, -80) nameaddons1:SetWidth(addcomentframe:GetRight() - addcomentframe:GetLeft()) nameaddons1:SetText("|cffFFFFFFКоличество символов не должно превышать 100 символов.|r") Создаем EditBox, в который мы будем вводить комментарий. Code commentbox = CreateFrame("EditBox",nil,addcomentframe) commentbox:SetWidth(300) commentbox:SetHeight(24) commentbox:SetFontObject(GameFontNormal) commentbox:SetBackdrop(backdrop); commentbox:SetBackdropColor(0.2,0.2,0.2,1); commentbox:SetBackdropBorderColor(0.2,0.1,0.1,1); commentbox:SetPoint("TOP",addcomentframe,0,-40) commentbox:ClearFocus(self) commentbox:SetAutoFocus(false) commentbox:SetScript( "OnEscapePressed", function( self ) self:ClearFocus() end ) commentbox:SetFontObject(GameFontNormal) - Тут название шрифта. Теперь осталось сделать только кнопку и можно приступать к основному блюду. Code addcommentbutton = CreateFrame("Button",nil,addcomentframe,"OptionsButtonTemplate") addcommentbutton:Enable(true) addcommentbutton:SetWidth(90) addcommentbutton:SetHeight(22) addcommentbutton:SetText("Добавить") addcommentbutton:SetPoint("CENTER",addcomentframe,0,-45) addcommentbutton:SetScript("OnClick",function() injecting() addcomentframe:Hide() end) Все из графики мы все сделали! Теперь приступим к самому интересному! Code GameTooltip:HookScript("OnTooltipSetUnit",function(self,...) local _, unit = self:GetUnit(); if (not unit) then local mFocus = GetMouseFocus(); if (mFocus) and (mFocus.unit) then unit = mFocus.unit; end end if (UnitIsPlayer(unit)) then local d = UnitGUID("mouseover") local E = tonumber(d:sub(13,18), 16); for k,v in pairs(TC) do if k == E then GameTooltip:AddLine(v) else Error = 1 end end end end); Если честно, я над этим думал очень долго.. но как всегда тут все просто. Расскажу систему как это работает: При наведении на что-либо у нас идет проверка "Персонаж ли это", если это персонаж то с помощью UnitGUID("mouseover"), мы получаем GUID персонажа. Дальше что мы делаем конвертируем гуид из вида "0х0000000" в нормальный цифровой вид, для этого нам нужна переменная local E = tonumber(d:sub(13,18), 16);. Дальше делаем запрос в базу данных и выводим 2 параметра, первый параметр это GUID (мы откуда он берется я расскажу позже), второй параметр это текст а точнее комментарий к персонажу. Теперь у нас идет проверка а точнее сравнение первого аргумента из базы с гуидом персонажа на котором у нас курсор. Если сравнение проходит успешно то мы выводим следующее GameTooltip:AddLine(v), это мы выводим второй аргумент из базы данных с текстом. Если у нас нету на этом персонажи записи то мы делаем запрос в базу "Error" (Я это сделал т.к не смог придумать что туда поставить) Вот и вся система вывода комментария, теперь посмотрим на систему записи комментария. Code function injecting() print("Комментарий успешно добавлен.") local d = UnitGUID("target") local E = tonumber(d:sub(13,18), 16); TC[E] = commentbox:GetText() end Эта система очень проста.. Получаем гуид персонажа по таргету, и составляем запрос в базу данных аддона таким методом: Code TC[GUID] = "Комментарий" Вот и вся система... Проста, не правда ли? Весь код: Code TC = {} Error = {} UnitPopupButtons["ADDCOMMENT"] = {text = "|cffd2b48cДобавить комментарий|r", dist = 0} function ADDCOMMENT(name, value) UnitPopupMenus[name][#(UnitPopupMenus[name])-1] = value end ADDCOMMENT("PLAYER", "ADDCOMMENT") hooksecurefunc("UnitPopup_OnClick", function(self) if (self.value == "ADDCOMMENT") then addcomentframe:Show() end end) ------------------------------------------- backdrop = { bgFile = "Interface\\DialogFrame\\UI-DialogBox-Background", edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border", edgeSize = 16, insets = { left = 3, right = 3, top = 3, bottom = 3 } } addcomentframe = CreateFrame("FRAME","addcomentframe_frame",UIParent); addcomentframe:SetMovable(true) addcomentframe:EnableMouse(true) addcomentframe:SetClampedToScreen(true) addcomentframe:SetScript("OnMouseDown", addcomentframe.StartMoving) addcomentframe:SetScript("OnMouseUp", addcomentframe.StopMovingOrSizing) addcomentframe:SetWidth(400); addcomentframe:SetHeight(150); addcomentframe:SetPoint("CENTER", repChoiceOffX, repChoiceOffY ); addcomentframe:SetBackdrop(backdrop); addcomentframe:SetBackdropColor(0.2,0.2,0.2,1); addcomentframe:SetBackdropBorderColor(0.2,0.1,0.1,1); addcomentframe:Hide() closeaddcomment = CreateFrame("Button",nil,addcomentframe,"UIPanelCloseButton"); closeaddcomment:SetPoint("TOPRIGHT",0,0); closeaddcomment:SetScript("OnClick",function() addcomentframe:Hide(); end); nameaddons = addcomentframe:CreateFontString(nil, "OVERLAY", "GameFontNormal") nameaddons:SetPoint("TOP", addcomentframe, "TOP", 0, -10) nameaddons:SetWidth(addcomentframe:GetRight() - addcomentframe:GetLeft()) nameaddons:SetText("|cffFFFFFFДобавить комментарий|r") nameaddons1 = addcomentframe:CreateFontString(nil, "OVERLAY", "GameFontNormal") nameaddons1:SetPoint("TOP", addcomentframe, "TOP", 0, -80) nameaddons1:SetWidth(addcomentframe:GetRight() - addcomentframe:GetLeft()) nameaddons1:SetText("|cffFFFFFFКоличество символов не должно превышать 100 символов.|r") commentbox = CreateFrame("EditBox",nil,addcomentframe) commentbox:SetWidth(300) commentbox:SetHeight(24) commentbox:SetFontObject(GameFontNormal) commentbox:SetBackdrop(backdrop); commentbox:SetBackdropColor(0.2,0.2,0.2,1); commentbox:SetBackdropBorderColor(0.2,0.1,0.1,1); commentbox:SetPoint("TOP",addcomentframe,0,-40) commentbox:ClearFocus(self) commentbox:SetAutoFocus(false) commentbox:SetScript( "OnEscapePressed", function( self ) self:ClearFocus() end ) addcommentbutton = CreateFrame("Button",nil,addcomentframe,"OptionsButtonTemplate") addcommentbutton:Enable(true) addcommentbutton:SetWidth(90) addcommentbutton:SetHeight(22) addcommentbutton:SetText("Добавить") addcommentbutton:SetPoint("CENTER",addcomentframe,0,-45) addcommentbutton:SetScript("OnClick",function() injecting() addcomentframe:Hide() end) -------------------------------- GameTooltip:HookScript("OnTooltipSetUnit",function(self,...) local _, unit = self:GetUnit(); if (not unit) then local mFocus = GetMouseFocus(); if (mFocus) and (mFocus.unit) then unit = mFocus.unit; end end if (UnitIsPlayer(unit)) then local d = UnitGUID("mouseover") local E = tonumber(d:sub(13,18), 16); for k,v in pairs(TC) do if k == E then GameTooltip:AddLine(v) else Error = 1 end end end end); function injecting() print("Комментарий успешно добавлен.") local d = UnitGUID("target") local E = tonumber(d:sub(13,18), 16); TC[E] = commentbox:GetText() end На этом все! Спасибо Juline, за идею для статьи. Удачи вам в созданиях аддонов!
Маме беркута привет!
|
| |||
| |||