Tag Archive for 'Addons'

Texture Painting

Here are a couple of screens of last nights “work” on my UI. Ever since I stopped using Tukui – which is great but I rather do like fiddling around and it does everything for you already – I’ve been back to changing around my interface. Last night I believe I spent nearly 3 hours creating the background texture – in gimp! – that you can see in the pictures below.

UI in Solo Mode fighting

UI in group mode healing

Visible Addons

  • Actionbar: Dominos
  • UnitFrames: oUF (einmal Caellian Layout, einmal Phanx Layout)
  • Healer-Frames: Vuhdo
  • Infobar: Databroker + Fortress + Diverse
  • Cooldownbar: ForteExorcist
  • Buffs/Debuffs: SatrinaBuffFrames + DebuffFilter
  • PvP: Capping
  • DPS-Meter: Recount
  • Map: pMinimap + Mapster
  • Tooltip: TipTop + Ghost Recon
  • NamePlates: TidyPlates + Clean Plates Layout
  • Combat Text: MikScrollingCombatText
  • Chat: Prat
  • TextureDisplay: DelusionsAddon (my own code and not for download because it sucks, using BTex or kgPanels felt like a bit too much for just a couple of textures)

I am not yet where I want to be with my latest layout. It should be cleaner I feel. There is too much going on but after Tukui I really wanted more buttons. I think the minimap is too small and the chat windows too high, the placement of the unit frames random. What I really need is to do my own oUF Layout.

WoW API: UnitId is an enum

Snowy Mountains in the Howling Fjord, From Screenshots 2008

Last night I didn’t feel as calm as the area in the screen above looks. I started programming on a very simple addon idea and immediately ran into a big huge blob of “doesn’t work as one would have thought”.

The Basic Idea

Our guild has lots of alts, nearly everybody has between two or three alts. Now with everybody making Death Knights there has been a growth spurt that nobody – well at least not me – can keep track of anylonger. As a rule we write the name of the main character in the guild note so it is possible to find out who is behind a character.

I am lazy however and when I see the “[Funny DK Name I never heard of before:74] has come online.” I want to know who it is without having to mouseover some FuBar social thingy or even having to call up the actual social pane to look up the note. I want the info right where I read that they just came online in my nice ChatFrame1!

Who is this Guildie?

It’s easy to find out the event to register for (CHAT_MSG_SYSTEM), it is not quite as easy to parse the message to extract the name and it wasn’t even that hard to find the method that will give me the info I was looking for and then some. Ok it took me about an hour to do the name parsing thing because I tried to use the string from GlobalStrings.lua to escape any need for localization. In the end I caved in and did some puny variant that will work only on the English client for now. But I managed to extract the name from the message and display the info (using GetNumGuildMembers and GetGuildRosterInfo). (There’s still a bug though because the message appears in chat before the guild roster knows the person is online and I tried to optimize … never mind).

Spying on Friends

But then I had this idea that I could extend my addon to include friends. It’s quite easy to extract the info you need from your friendslist with GetNumFriends and GetFriendInfo.

But because I am insanely curious and like to keep track of former guildies and all that (friendslist is much too small IMO) I wanted to output the guild of any friend that came online.

I spent another hour looking for a way to obtain the guild name of a player by the name of that player. The – seemingly? – only function that allows to retrieve the guild of a player is GetGuildInfo. However this method only takes one parameter: UnitId. It took me a lot of time to figure out UnitId actually is the equivalent of an enum and it only allows values like “player”, “target”, “pet”, “mouseover”, “focus” etc.. There is no UnitId value to signify an arbitrary unit. Of course there wouldn’t be. How would I decide which unit that was? Oh the unit has a name … maybe I could take the name of the unit?

It does not work that way.

The only way I found that allowed retrieval of GuildInfo for an arbitrary “unit” was the /who command which can be triggered with the SendWho function. This actually does execute a /who command including the system message you get when who returns 3 or less results. This is not what I wanted.

How bad can an API be designed that there is no obvious way to obtain the guild of a player unless you have that player targeted or in your party or mouseover that player?

Meh.

PS: when I get home I’ll post the code, I forgot to commit to the svn last night after fishing my way up to 450 I felt kind of stupid – brain had gone to sleep two hours before the rest of me ;)

PPS: and now I realized there is a third category of people I need to spy on … those in our in-game chat channel ;) so at least something good came from this rant.

The “Hello World” Addon

I am trying to learn to program my own addons. I’ve been installing other people’s addons for a few years now. Being a software developer I am thinking I should be able to do it myself.

Yet I am having a very hard time getting into it and there are very few tutorials especially current ones are rare. It is not trivial to learn from other people’s code either because so many addons use libraries and not all code is equal in readbility.

1) Documentation

Online you can find quite a few resources that all help in certain aspects.

I like learning from other people’s code. My best source for code so far has been Tekkub (whose code you like is very much a question of personal preference). Together with his repositories, the APIs published on WoWWiki and the Lua Manual,  I was finally able to put together a small “Hello World” style addon. One of his simplest addons is the tekJunkSeller. Just take a look at it.

For a bit of offline documentation I ordered a book about WoW addons. Actually there are several books available. I checked the table of contents and this one sounded most promising.

2) Developer Utilities

First things first: installing a few resources.  There are quite a few lua editors out there and a few other developer utilities. Here’s my current list:

  • WoW UI Designer: a nice looking lua ide
  • tekPad to evaluate lua code in the game.
  • BugSack to be able to see errors and stacktraces (I’ve had that forever actually)
  • svn repository. I already had one. I guess most people will not need revision control immediately. I do because I want to be able to access my stuff from different places.
  • Macro to obtain the name of a frame/script DEFAULT_CHAT_FRAME:AddMessage( GetMouseFocus():GetName() );
  • Macro to obtain an item ID /script local infoType, info1, info2 = GetCursorInfo(); if infoType == "item" then DEFAULT_CHAT_FRAME:AddMessage( info1 ); end

3) The Basic Structure

Now that your preparations are all done on to the addon programming stuff. Here’s the basic structure of the simplest WoW Addon:

  • HelloWorld.toc: contains meta information on the addon. For example: name, author, website and loading information. It also has to has a “toc” = table of contents for all the files or libraries included with the addon.
  • HelloWorld.lua: contains the actual code of your addon.
  • You could have an xml file as well to define your frames. Personally I want to try the all-lua approach.
  • Put these files in a HelloWorld folder in your Interface\Addons directory and once you filled them with content you can test your addon.

4) The HelloWorld.toc File

The toc file is more important and versatile than you would think at first. But right now I want to keep it very simple (the LineNumbers are not included in the actual file!):

1-- ## Interface: 30300
2--
3-- ## Title: HelloWorld
4-- ## Notes: Say "Hello!" to the world
5-- ## Author: Yashima
6-- ## Version: Alpha
7--
8-- HelloWorld.lua

Just a quick explanation, most of this is self explanatory.

  • Line 1: contains the version of the interface this addon was written for
  • Line 3-6: basic information on the addon and its’ author
  • Line 8: the table of contents consists of a single file in our case

What you can also do here:

  • control load on demand behaviour (nice example)
  • insert dependencies or optional dependencies
  • give more information on the author etc.

5) The HelloWorld.lua File

Here’s a sample file.

1-- UIErrorsFrame:AddMessage("Hello World",0.5,1.0,1.0,5.0);

As far as I was able to find out all code (except functions which must be called) in the lua file will be executed when the addon is loaded. The one line in this file will simply print a message to the in-game error frame with the AddMessage method. Of course the message here is “Hello World”. The additional parameters control the color and fade time of the message.

Of course keeping it so simple won’t get you far. Here’s another example with some very simple event handling.

1-- local function OnEvent()
2--   UIErrorsFrame:AddMessage(arg1,0.5,1.0,1.0,5.0);
3-- end
4--
5-- local f = CreateFrame("Frame")
6-- f:RegisterEvent("CHAT_MSG_SYSTEM")
7-- f:SetScript("OnEvent",OnEvent)

This code does some very simple event handling. There is a local function called OnEvent() (lines 1-3) that will be executed when the registered event(s) occur and does the same as the previous example: it prints a message to the error frame.

The lua code in the global scope that will be executed on load is found on lines 5-7. In Line 5 we create a simple frame with CreateFrame and on this frame we can register events to listen for in our case the CHAT_MSG_SYSTEM (line 6), an event that is fired when a system chat message (they are displayed in yellow) is received.This event has a single argument arg1 that contains the chat message. On line 7 we finally define that when a registered event is fired we want the OnEvent() method to be called. Since we only have a single event registered all this is pretty simple.

So here’s a tiny first addon. I will continue with this topic once I learn how to do more.

From being a Bartender to playing Dominos

or: The Quest for a better Interface

I am always on that quest.

If you are an addon/interface junkie like me you know that one of the most important addons is the “bar” mod that you use. I’ve tried them all starting with ctMod, Flexbar, Bongos, Bartender and probably some more. For a long long time now I’ve been using Bartender4.

Bartender4 is a nice enough mod developed in the Ace community. (writing while eating please forgive the missing links I might add them later). But lately I feel like I am running into a dead-end with the mod. Bartender3 could be found on other sites besides wowace.com. Bartender4 seems like a forever-alpha which can only be updated through files.wowace.com . Maybe I missed some announcement or a split into a new project.

With the upcoming changes to files.wowace.com (mainly its not going to be there anymore in the near future) and not being sure when and how these changes are going to come about I am looking for stable alternative mod sites. So I went back to WoWI. Most of my favorites can be found there. All except a handful – a handful I can play without if 3.x comes and breaks my UI and files.wowace.com both. I was able to test the most important ones on the PTR this week. I hate being ridiculed in guild chat because a patch broke my UI. It has happened.

I found everything I needed on WoWI. Yay! Everything but one mod: Bartender4. And it’s not on curse or wowui either. One sad druid player I was …

So I took another looked at Bongos again which I used before Bartender for a very long time and only dropped using because WAU (the WoWAceUpdater) made updating mods so perfectly easy (which is the reason for the huge amount of traffic wowace.com gets). Then I saw: Bongos is discontinued. Oh noes!

Only moments later I noticed a link to Dominos. Developed by the same guy and obviously ready to go for Wrath. So here I am sitting on the PTR having a working bar mod which was easily configured in about 5 minutes.

Bye bye Bartender. Hello Dominos!

I am sad about wowace suffering from popularity as it is. I am sure there will be a solution. But I don’t want to be caught with too many wowace-only addons when the problem explodes before the solution is ready to go.

See my interface

I made a UI page with a screen of my current User Interface and a list of the most important addons I use. I also made a lot of links on the sidebar that point to the addons I use. I’ll try to keep it updated. Luckily I don’t change my interface as much anymore.

I experimented a bit with different Databroker addons yesterday but nothing really satisfied me and so I kept my FuBar.

The biggest change I made yesterday was the switch from ClosetGnome to Outfitter. Outfitter looks really interesting, has all the features of ClosetGnome and then some.

Addons: UI refresh with eePanels2

Yesterday I took the time to make myself a new UI. I took some textures from Taeo’s UI I had seen on WoWInsider ages ago and couldn’t use them because I didn’t have a widescreen monitor back then. Here’s the result, after about 3 hours of fiddling:

What took me so long? Finally understanding how eePanels works took some time. I had so far only managed to copy other people’s configuration. Yesterday I made my own because Taeo uses DiscordArt in his original UI. Way back when I did use all of the Discord Suite. Since those are no longer updated I have tried several times to get used to eePanels. It never worked out for me and I resorted to stuff like XArt or ElextrofluxTextronator.

I did want to use those other textures and they could not be fit with Xart or ET.

There are several rules to obey when using textures with eePanels.

  1. Read the really nice documentation of eePanels2 on the wowace wiki.
  2. Follow the advice to do a /console reloadui if you had an old profile of eePanels and are trying to create a new one!
  3. Put the textures you want to use in the eePanels2 directory
  4. Check that they have height and width measures that are a power of 2 (64, 128, 256, 512 = max)
  5. Check they are saved as 32-bit resolution tga
  6. Turn on advanced mode of eePanels to be able to add background textures to panels you create
  7. Create some panels and add your textures.
  8. You may want to use the addon Align to help with positioning.
  9. Carefully resize and position your panels the way you want them and then lock them.

Interesting stuff you can also do with eePanels:

Set the parent frame in the panel configuration to something different than “UIParent”. I added two panels with textures for my player unit frame and my target unit frame, those I set to the correct sizes and offset to move with those unit frames. The target frame only shows if I have a target, which is exactly the behaviour I wanted. I also added a texture to my Autobar frame.

You can also add lua scripts to your panels. I have not tested that yet but maybe I can come up with some use for that.

eePanels2 is much easier to use than I thought it was, the documentation is quite nice. Just give it a try and don’t be scared of the many options you can configure.

Need more Bagspace


Here’s Yashima’s inventory.
  • 43 slots filled with gear
  • 16 slots with consumables
  • 4 slots with vanity pets and mounts
  • 2 slots with spell reagents
  • 1 slot for my homing beacon

She’s a great farm character currently being specced feral (for a few more days) but the inventory is way too full. As a Resto it is easier (except my bank is also full) because I usually do not carry my full dmg and tank equip as a healer. But as Feral I need two full sets of gear (plus some PvP items) anyway and want to be prepared to heal on short notice for quests, battlegrounds or whatever may come up.

I wish Blizzard would do something to help us Druids (and Paladins and Shamans) with our wardrobe problems.

The inventory addon is ArkInventory by the way.

Addons: LevelSnap

As I said I wanted to have a semi-regular addon feature on the blog. I use a lot of addons and have always found that many people enjoyed hearing about new gimmicks to add to their interface. So here we go with a first installment.

So today I just want to introduce you to a nifty little thing I’ve been using since I first heard about it over on wow_ladies:

LevelSnap (WoWI | Curse)

First a screenshot of the addon in action:

It has one very simple function it takes a screenshot any time your character dings. I take a lot of screenshots of anything that seems like a memorable in-game experience (maybe because photographing is a hobby of mine) and it is nice to capture those milestones of my characters.

Above you can see that Thalya finally dinged 68 last night in Nagrand (and that she is broke because I bought 250 of the big Scryer faction thingies to turn in once she hits 70).

My Interface

Addons are some of my favorite content of WoW. I think if it wasn’t possible to modify the UI as it is, I would no longer be playing. I do not develop addons I just browse the net for interesting screens of other people’s UIs and then try to find out what addons they used.

My addon folder currently contains 397 subfolders. Which is probably about 150 different addons in the end. I have a lot of Ace addons, but I am also using the Curse client to keep some others up to date and there are still some addons only hosted at WoWI.

Here is a short list of some of my addon choices:

  • action bar: Bartender
  • unit frames: Pitbull
  • raid frames: PerfectRaid
  • threat meter: Omen
  • gear management: ClosetGnome
  • auctions: Auctioneer
  • boss mod: BigWigs
  • map mod: Cartographer + SimpleMinimap
  • castbar: Quartz
  • inventory: ArkInventory + Possessions
  • click heal: Clique
  • DoTs & cooldowns: DoTimer + OmniCC
  • questing: LightHeaded + TomTom
  • consumables management: AutoBar
  • PvP helpers: Capping + HonorFu + BattlegroundFu
  • Arena: Proximo

The list could go on and on … I’ll just stop here. I want to try to have a weekly addon feature with some of the more obscure addons I use. I know lots of people have these addon feature articles but in my opinion there can never be enough. Each such article is a potential discovery of a hidden addon gem that I might need :)