I Gné? oUF, squoi ça?
Transcription
I Gné? oUF, squoi ça?
Index I Gné? oUF, squoi ça?................................................................................................................................2 Présentation de l'addon..........................................................................................................................2 Rapides explications..............................................................................................................................2 II Quelques bases indispensables...............................................................................................................2 Introduction aux fonctions.....................................................................................................................2 Utilisation de 'local'...............................................................................................................................3 III Structure de votre layout.......................................................................................................................3 Frame générale......................................................................................................................................3 Barre de vie...........................................................................................................................................4 Barre de mana/rage/énergie/puissance runique.....................................................................................4 Textes.....................................................................................................................................................4 Quelques additions................................................................................................................................4 IV Mise en place du layout........................................................................................................................4 Frame générale......................................................................................................................................6 Barre de vie...........................................................................................................................................7 Barre de mana/rage/énergie/puissance runique.....................................................................................8 Textes.....................................................................................................................................................9 Quelques additions..............................................................................................................................11 L'icône de leader.............................................................................................................................11 L'icône de raid.................................................................................................................................11 Le portrait.......................................................................................................................................11 Les buffs/debuffs............................................................................................................................12 Finalisation..........................................................................................................................................13 V Quelques tuyaux et choses pratiques....................................................................................................15 I Gné? oUF, squoi ça? Présentation de l'addon Comme le titre l'indique, oUF est un addon. Le seul problème c'est que tout seul il vous servira à rien, ce qui n'est pas super pratique. Enfin si, justement: oUF est un addon qui va "manager" le layout que je vais justement vous apprendre à créer. L'avantage d' oUF est qu'il va s'occuper de toutes les taches fastidieuses pour vous. Vous n'avez qu'à créer la partie graphique et l'addon s'occupe du reste, et très bien en plus ^^. Rapides explications Nous allons faire un layout le plus complet possible, abordant le plus possible (dans la limite de mes capacités) de choses. Si vous devez n'utiliser qu'un seul site pour vous aider c'est WowWiki partie Widget API, certes tout est en anglais mais le code aussi donc ^^ http://www.wowwiki.com/Widget_API II Quelques bases indispensables Introduction aux fonctions Les fonctions sont la base de tout addon. Une fonction est une partie de code qui fait des choses précises comme changer l'opacité. Ex: SetAlpha(valeur entre 0 et 1) permet de changer l'opacité On utilise : pour appeler une fonction générale Minimap:SetAlpha(0.5) Votre minimap sera à 50% d'opacité Vous pouvez vous même créer vos propres fonctions Ex: function Test() ChatFrame1:AddMessage('Ceci est un test') end Maintenant si dans votre code vous mettez Test() la fonction Test créée précédemment sera effectuée. Utilisation de 'local' Utiliser local en début de ligne permet de stocker une variable dans votre addon local texture = "Interface\\AddOns\\Test\\texture" Chaque fois que vous marquerez la variable texture dans votre addon cela reverra au fichier relatif à cette texture Ex: local frame = CreateFrame(nil,nil,UIParent) local frame.texture = frame:CreateTexture(nil,'OVERLAY') frame.texture:SetTexture(texture) On a d'abord créé la frame puis sa texture et enfin on lui a dit quelle texture appliquer. L'utilisation intensive de WowWiki est fortement recommandé au départ pour connaître les fonctions que vous allez utiliser le plus. III Structure de votre layout Frame générale C'est la base de votre layout, elle a besoin d'avoir une longueur, une largeur, et pourquoi pas un background. Barre de vie La base d'un addon d'UnitFrame: la barre de vie. C'est une StatusBar qui change de valeur suivant votre vie, elle a besoin d'une texture, d'une taille, d'être placée par rapport à la frame générale, et pourquoi pas un background Barre de mana/rage/énergie/puissance runique cf. Barre de vie mais pour le mana/rage/énergie/puissance runique Textes Les textes affichant vos points de vie, de mana, les noms, niveaux etc Quelques additions Nous rajouterons une barre de cast, un portrait,les buffs/debuffs, et le support pour quelques plugins. IV Mise en place du layout Je vais appeler mon addon oUF_Test, donc vous vous occupez du fichier ,toc et du répertoire Avant tout on préfère généralement mettre en place les textures, enfin les local. Je vous conseille de vous créer un répertoire media a l'intérieur Tous les noms commençant par self ou self.quelquechose NE DOIVENT PAS ETRE MODIFIES. Vous allez donc commender par mettre vos local La police et sa taille local font, fontsize = "Fonts\\FRIZQT__.ttf", 12 Le background local backdrop = { bgFile = "Interface\\AddOns\\oUF_Test\\media\\HalBackgroundA", tile = true, tileSize = 16, insets = {left = -2, right = -2, top = -2, bottom = -2}, } La texture pour les barres de vie local statusbar = "Interface\\AddOns\\oUF_Test\\media\\LiteStep" Pour choisir plus facilement en fonction de la classe du joueur local playerClass = select(2, UnitClass("player")) Ensuite je vais rajouter les options pour que le clic droit sur la frame marche: local menu = function(self) local unit = self.unit:sub(1, -2) local cunit = self.unit:gsub("(.)", string.upper, 1) if(unit == "party" or unit == "partypet") then ToggleDropDownMenu(1, nil, _G["PartyMemberFrame"..self.id.."DropDown"], "cursor", 0, 0) elseif(_G[cunit.."FrameDropDown"]) then ToggleDropDownMenu(1, nil, _G[cunit.."FrameDropDown"], "cursor", 0, 0) end end Ensuite pour me faciliter la vie, on va utiliser une fonction créée par Caellian pour la mise en place des textes. Elle consiste à créer un FontString, lui appliquer une police, une taille et un style. local function SetFontString(parent, fontName, fontHeight, fontStyle) local fs = parent:CreateFontString(nil, 'OVERLAY') fs:SetFont(fontName, fontHeight, fontStyle) fs:SetJustifyH('LEFT') fs:SetShadowColor(0,0,0) fs:SetShadowOffset(1.25, -1.25) return fs end Par exemple local texte = SetFontString(UIParent, font, fontsize, 'OUTLINE') Les variables font et fontsize ayant déjà été ajoutées précédemment dans votre code si vous avez bien suivi. Frame générale Tout notre layout doit être enregistré par le layout par une fonction que nous allons créer local function Style(self, unit) Ensuite nous allons donner quelques attributs pour le clic droit à toutes nos frames self.colors = colors self.menu = menu self:RegisterForClicks('AnyUp') self:SetAttribute('*type2', 'menu') self:SetScript('OnEnter', UnitFrame_OnEnter) self:SetScript('OnLeave', UnitFrame_OnLeave) Ensuite nous allons rajouter un fond à notre frame self:SetBackdrop(backdrop); self:SetBackdropColor(0,0,0,.65) Ensuite nous allons leur donner une taille en fonction du type d'unité Pour le joueur et sa cible if unit == 'player' or unit == 'target' then self:SetAttribute('initial-height', 20) self:SetAttribute('initial-width', 260) end Pour le focus, les pet et la cible de la cible if unit == 'pet' or unit == 'focus' or unit == 'targettarget' then self:SetAttribute('initial-height', 10) self:SetAttribute('initial-width', 100) end Pour le raid et le groupe unit == 'party' ou unit == 'raid' ne marche pas donc on va utiliser une méthode différentes qui consiste à chercher dans le nom de la frame mère s'il y a écrit oUF_Party ou oUF_Raid. if(self:GetParent():GetName():match"oUF_Party") or (self:GetParent():GetName():match"oUF_Raid") then self:SetAttribute('initial-height', 20) self:SetAttribute('initial-width', 120) end Barre de vie Maintenant créons les barres de vie L'élément géré par oUF sera self.Health, nous pouvons lui appliquer quelques filtres qui sont par priorité - colorTapping - colorDisconnected – va changer la couleur de la barre si l'unit est déconnectée - colorHappiness – va colorer en fonction de la satisfaction (que les pets je pense) - colorClass – va utiliser les couleurs de raid pour la couleur de barre - colorClassNPC – de même pour les PNJ (guerrier, mage et paladin seulement) - colorReaction – en fonction de la réaction (hostile, amical, neutre,...) - colorSmooth – va utiliser smoothGradient à la place du dégradé interne s'il est donné - colorHealth On va donc créer la StatusBar, la placer, lui donner une texture, une couleur et quelques filtres. self.Health = CreateFrame('StatusBar', nil, self) self.Health:SetPoint"TOP" self.Health:SetStatusBarTexture(statusbar) self.Health:SetHeight(15) self.Health:SetPoint"RIGHT" self.Health:SetPoint"LEFT" self.Health:SetStatusBarColor(74/255,74/255,74/255) self.Health.colorDisconnected = true self.Health.colorClass = false La barre de vie est donc attaché au haut, à la droite et à la gauche de la frame et fait 15 pixels de hauts, sa couleur est un gris. Pour la changer simplement aller sous Paint est prendre les valeurs de rouge, bleu et vert et les diviser par 255 (sachant que les couleurs doivent être données dans l'ordre r,v,b) Mais toutes ses UF n'ont pas besoin d'avoir la même taille, changeons là donc if unit == 'pet' or unit == 'focus' or unit == 'targettarget' then self.Health:SetHeight(7) end if(self:GetParent():GetName():match"oUF_Party") or (self:GetParent():GetName():match"oUF_Raid") then self.Health.colorClass = true self.Health:SetHeight(16) end Barre de mana/rage/énergie/puissance runique De même pour les barres de mana je met donc directement le code L'élément géré par oUF sera self.Power et ses filtres sont par priorité: - colorTapping - colorDisconnected - colorHappiness - colorPower - colorClass - colorClassNPC - colorReaction - colorSmooth Les mêmes que self.Health donc. self.Power = CreateFrame('StatusBar', nil, self) self.Power:SetPoint("TOP", self.Health, "BOTTOM", 0, 0) self.Power:SetStatusBarTexture(statusbar) self.Power:SetHeight(4) self.Power:SetPoint"LEFT" self.Power:SetPoint"RIGHT" self.Power:SetParent(self) self.Power.colorPower = true if unit == 'pet' or unit == 'focus' or unit == 'targettarget' then self.Power:SetHeight(2) end if(self:GetParent():GetName():match"oUF_Party") or (self:GetParent():GetName():match"oUF_Raid") then self.Power:SetHeight(4) end La seule chose qui change c'est que la fonction SetPoint n'est pas utilisée de la même façon Ici la barre est attachée par le haut au bas de la barre de vie avec un décalage de 0 px en abscisse et 0 px en ordonnée Textes Ici nous allons utiliser le système de tags présents dans oUF, si vous voulez une liste vous la trouverez dans oUF\element\tags.lua au début La fonction self:Tag s'utilise comme ceci self:Tag(le_fontstring_a_tagger,'le texte avec le [tag en crochets]') Nous créons donc un texte grâce à SetFontString, puis nous le plaçons et nous le tagguons Le texte ne sera pas placé au même endroit suivant l'unité, nous allons donc changer son alignement et sa place en fonction de l'unité local healthtext = SetFontString(self.Health, font, 12) healthtext:SetPoint('BOTTOM',self,'TOP',0,2) healthtext:SetJustifyH('LEFT') self:Tag(healthtext,'|cffffffff[curhp] | [perhp]%|r') if unit == 'player' then healthtext:SetJustifyH('RIGHT') healthtext:ClearAllPoints() healthtext:SetPoint('TOPLEFT',self,'BOTTOMLEFT',2,-1) end if unit == 'target' then healthtext:SetJustifyH('LEFT') healthtext:ClearAllPoints() healthtext:SetPoint('TOPRIGHT',self,'BOTTOMRIGHT',-2,-1) end if(self:GetParent():GetName():match"oUF_Party") or (self:GetParent():GetName():match"oUF_Raid") then healthtext:SetPoint('LEFT',self,'LEFT',2,0) self:Tag(healthtext,'[perhp]% |cff787878[missinghp]|r') end local powertext = SetFontString(self.Health, font, 10) if unit == 'player' then self:Tag(powertext,'|cffffffff[perpp]|r') powertext:SetPoint('TOPRIGHT',self,'BOTTOMRIGHT',-2,-1) powertext:SetJustifyH('LEFT') end if(self:GetParent():GetName():match"oUF_Party") or (self:GetParent():GetName():match"oUF_Raid") then powertext:SetPoint('RIGHT',self,'RIGHT',-2,0) self:Tag(powertext,'[perpp]%') end local name = SetFontString(self.Health, font, 10) name:SetPoint('LEFT', self.Health, 'LEFT',2,0) if (UnitIsPlayer('target')) then self:Tag(name,'[name] [raidcolor] [level] [shortclassification] [dead]') else self:Tag(name,'[name] [level] [shortclassification] [dead]') end if unit == 'player' or unit == 'focus' or unit == 'pet' then name:Hide() end if(self:GetParent():GetName():match"oUF_Party") or (self:GetParent():GetName():match"oUF_Raid") then name:ClearAllPoints() name:SetPoint('TOPLEFT', self, 'BOTTOMLEFT',0,-3) self:Tag(name,'[name] [dead]') end Quelques additions L'icône de leader Nous allons rajouter quelques plugins comme l'icône de Leader L'élément géré est self.Leader, nous créons donc la texture, la plaçons et lui donnons une taille self.Leader = self.Health:CreateTexture(nil, 'OVERLAY') self.Leader:SetPoint('TOPRIGHT', self, -1,-1 ) self.Leader:SetHeight(16) self.Leader:SetWidth(16) L'icône de raid L'élément géré est self.RaidIcon, on fait la même chose que pour l'icône de leader self.RaidIcon = self.Health:CreateTexture(nil, 'OVERLAY') self.RaidIcon:SetPoint('BOTTOM', self.Portrait,'TOP' ,0,3) self.RaidIcon:SetHeight(16) self.RaidIcon:SetWidth(16) Le portrait L'élement géré est self.Portrait Cette fois ci on doit créer un "PlayerModel", qu'on place, auquel on fixe une taille enfin la même chose que d'habitude. On lui crée ensuite un fond gris clair, qui aura une opacité de 35%. if unit == 'player' or unit == 'target' then local port = CreateFrame"PlayerModel" port:SetWidth(20) port:SetHeight(20) port:SetParent(self) if unit == 'player' then port:SetPoint('RIGHT',self,'LEFT',-1.5,0) else port:SetPoint('LEFT',self,'RIGHT',1.5,0) end local portbg = port:CreateTexture(nil, "BACKGROUND") portbg:SetTexture(25/255,25/255,25/255,0.35) portbg:SetAllPoints(port) portbg:SetWidth(45) portbg:SetHeight(45) self.Portrait = port Pour la castbar je vous passe un lien avec un screenshot et un lien pour le code (car il est trop long) Code: http://deith.pastey.net/106450 Screenshot: Les buffs/debuffs Les éléments gérés sont self.Buffs ou self.Debuffs, tous les filtres sont disponibles dans oUF/elements/ aura.lua et en contient une liste non exhaustive , c'est aussi disponible ici ["growth-x"] désigne la direction horizontale vers laquelle les buffs vont aller quand un nouveau apparaitra ["growth-y"] c'est la même chose mais pour la direction verticale. if unit == 'target' then self.Buffs = CreateFrame('Frame', nil, self) self.Buffs.size = 16 * 1.1 self.Buffs["growth-x"] = "RIGHT" self.Buffs["growth-y"] = "UP" self.Buffs.spacing = 5.3 self.Buffs:SetHeight(self.Buffs.size) self.Buffs:SetWidth(self.Buffs.size * 8) self.Buffs:SetPoint('BOTTOMLEFT', self, 'TOPLEFT', 1, 3) self.Debuffs = CreateFrame('Frame', nil, self) self.Debuffs.size = 19 * 1.1 self.Debuffs.spacing = 5.3 self.Debuffs:SetHeight(self.Debuffs.size) self.Debuffs:SetWidth(self.Debuffs.size * 6) self.Debuffs['growth-y'] = 'DOWN' self.Debuffs['growth-x'] = 'RIGHT' self.Debuffs.showDebuffType = true self.Debuffs.num = 40 self.Debuffs.filter = false self.Debuffs:SetPoint('TOPLEFT', self, 'TOPRIGHT', 2, -1) end Une simple lecture permet de comprendre a part peut-être pour self.Buffs.size = nombre_en_une_ligne * taille Finalisation Enfin finissons le style, end return self Et enfin Nous disons à oUF d'enregistrer notre style à partir de la fonction Style, et de l'activer. Ensuite nous disons à oUF de créer les frames 'player', 'target', 'pet', 'targettarget','focus', du raid et du groupe. A la suite de cette création nous plaçons les frames car autrement elles n'existent pas. Dans SetManyAttributes nous pouvons voir 'yOffset',-15 ce qui signifie que entre les frames d'un même groupe les frames sont séparées de 15 pixels verticalement vers le bas. Ensuite je vous laisse déchiffrer un peu si vous voulez vraiment le personnaliser oUF:RegisterStyle("Test", Style) oUF:SetActiveStyle("Test") oUF:Spawn("player"):SetPoint("RIGHT", UIParent, "CENTER", -125, -150) oUF:Spawn("target"):SetPoint("LEFT", UIParent, "CENTER", 125, -150) oUF:Spawn("pet"):SetPoint("BOTTOMLEFT", oUF.units.player, "TOPLEFT", 0, 15) oUF:Spawn("targettarget"):SetPoint("CENTER", UIParent, "CENTER", 0, -157) oUF:Spawn("focus"):SetPoint("BOTTOMRIGHT", oUF.units.player, "TOPRIGHT", 0, 15) local raid = {} for i = 1, 8 do local group = oUF:Spawn('header', 'oUF_Group'..i) group:SetManyAttributes('groupFilter', tostring(i), 'showRaid', true, 'yOffset', -15) table.insert(raid, group) if(i == 1) then group:SetManyAttributes('showParty', true, 'showPlayer', false) group:SetPoint('TOPLEFT', UIParent, 10, -65) else group:SetPoint('TOPLEFT', raid[i-1], 'TOPRIGHT', 15, 0) end group:Show() end Les groupes de raid seront disposés comme sur ce screen: Ensuite nous reprennons avec une partie pour les MT et MA local MT = oUF:Spawn('header', 'oUF_MainTank') MT:SetManyAttributes('showRaid', true, 'groupFilter', 'MAINTANK', 'yOffset', -15) MT:SetPoint('TOPLEFT', UIParent, 15, -265) MT:Show() local MA = oUF:Spawn('header', 'oUF_MainAssist') MA:SetManyAttributes('showRaid', true, 'groupFilter', 'MAINASSIST', 'yOffset', -15) MA:SetPoint('TOPLEFT', 150, -265) MA:Show() Voilà votre layout est terminé V Quelques tuyaux et choses pratiques Un très bon conseil, utilisez des noms de local (variables autrement dit) explicites de façon à ce qu'ils soient compréhensibles par tout le monde Commentez, commentez vos lignes pour la même raison que les local ( un commentaire commence en écrivant - - (sans l'espace entre les deux) Les plugins aux layouts fournissent généralement le moyen (autrement dit les lignes de code) nécessaire à la mise en place de leur plugin