• Страница 1 из 1
  • 1
Комментарий к персонажу
Nyll
Всем привет! Сегодня статья будет не обычная, а очень большая (^_^). В этой статье я буду рассказывать как создать аддон "Комментарий к персонажу". Суть аддона заключается в том что к любому персонажу можно добавить комментарий.


(Сори за звуки в скайпе друг флудил.)

Инструкция по созданию 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, за идею для статьи. Удачи вам в созданиях аддонов!
Маме беркута привет!
Сообщение # 1 отредактировано Nyll - Суббота, 18.08.2012, 12:57
Kante
Born To be Free
После релога все пропало, почему?
Сообщение # 2 написано 18.08.2012 в 16:06
Nyll
Quote (Kante)
После релога все пропало, почему?

А ты прописал название базы в TOC файле..?
Маме беркута привет!
Сообщение # 3 написано 18.08.2012 в 18:20
Kante
Born To be Free
Нет biggrin
Сообщение # 4 написано 18.08.2012 в 19:46
Nyll
Quote (Kante)
Нет

Ну вот...
Маме беркута привет!
Сообщение # 5 написано 18.08.2012 в 20:25
Juline
!1
Отлично. Практическая польза на лицо :).
Сообщение # 6 написано 18.08.2012 в 23:03
0niwone
WoW-Carnge <Dev>
Очень полезно. Мне людей 100 должны по 100 голд, а кто я не помню biggrin
Сделай следующий урок о том , как сделать тэг <Com>
Пользуюсь гарант услугами pwlvl.ru
Сообщение # 7 написано 19.08.2012 в 00:26
Kante
Born To be Free
Quote (0niwone)
<Com>

Патч вроде, я делаю это патчем.
Сообщение # 8 написано 19.08.2012 в 01:52
Nyll
Quote (0niwone)
Сделай следующий урок о том , как сделать тэг <Com>

no

Quote (Kante)
Патч вроде

no
Маме беркута привет!
Сообщение # 9 написано 19.08.2012 в 15:04
Kante
Born To be Free
Quote (Nyll)
no

я тебе сказал, что я делаю патчем значит это 1 из способов.
Сообщение # 10 написано 19.08.2012 в 15:29
Juline
!1
А о каком теге вообще речь?
Сообщение # 11 написано 19.08.2012 в 17:41
Nyll
Quote (Juline)
А о каком теге вообще речь?

Символы около ника на видео.
Маме беркута привет!
Сообщение # 12 написано 19.08.2012 в 17:49
0niwone
WoW-Carnge <Dev>
Тогда хоть свой манг админ доделай, а то у тебя полезные аддоны через раз dry
Пользуюсь гарант услугами pwlvl.ru
Сообщение # 13 написано 19.08.2012 в 18:06
BlackFlame
Старший Маршал
Отлично, пригодится, например, для отметки персонажей должников, врагов и т.п. Суперский аддон, Nyll молодец вообще.
Сообщение # 14 написано 19.08.2012 в 18:50
askariot
Скаут
а на лк роботает ?
Сообщение # 15 написано 19.08.2012 в 19:07
Kante
Born To be Free
Quote (askariot)
а на лк роботает ?

Да
Сообщение # 16 написано 19.08.2012 в 19:23
NeroxD
Скаут
кто сделал, можете в лс кинуть? А то у меня чтото криво получается и ничего не работает
Сообщение # 17 написано 20.08.2012 в 00:12
Juline
!1
Quote (NeroxD)
кто сделал, можете в лс кинуть? А то у меня чтото криво получается и ничего не работает

Автор в следующем уроке будет доработкой идеи заниматься, опубликуем результат полноценным аддоном.
Сообщение # 18 написано 21.08.2012 в 01:19
Arcanum
Скаут
У меня тоже не работает.
Сообщение # 19 написано 02.09.2012 в 15:42
Vladyxxa
Капрал
Глаз косой, кривые руки)))
Сообщение # 20 написано 03.09.2012 в 10:48
  • Страница 1 из 1
  • 1
Поиск: