Archive for the “Hackity Hackity Hack” Category

You may not believe it, but addons are severely limited in what they can do.  Mostly, they are driven off of "events" which they can react to, or they’re re-imaging of something that already exists.

Warning, technical bits

Addons that have a lot of animation or fast reacting indicators, such as cast bar replacements ala Quartz, usually trigger off of an event called "OnUpdate".  It fires every time the current "frame" (i.e. your screen) updates, and it’s the only event of its kind. Thus, the higher your FPS ("Frames per Second"), the more often this guy fires.  If you have low FPS, all animations tend to be choppy, including your addons.

Because it fires so often and is at the heart of your FPS, OnUpdate even "handlers", such as the code routine that updates your cast bar, are supposed to be kept small and focused. All the stuff that sets the texture, size, position, and other frippery associated with the cast bar, for example, will be done elsewhere. We try to restrict the OnUpdate handler, in this case, to calculating and drawing the cast bar, nothing else, and then handing off to the client so it can get about the business of rendering.  If we put stuff here that takes a long time to do, it will drag the system FPS down.

What this means to you

There are a few conclusions you can draw with this knowledge.

Addons count

The addons you have loaded will affect your client’s performance.  Furthermore, those with no OnUpdate handler will impact performance far less than those that use one.  I don’t suggest you learn to read LUA source code as much as be familiar with what addons are high-impact with animations and critical indicators, such as Quartz or any unit frame addon. The more of these you have, the more delay there is in rendering each frame, until your FPS starts to decline.

You can’t eliminate this, but you can mitigate it.

The fewer, the better

The first principle is that the more active addons you have, the less responsive your client will be.  So if you can eliminate addons that you don’t really need, that will help performance. Sometimes it’s a matter of disabling those that you only use from time to time, such as MogIt – which does have some real-time components, but nothing you need in the middle of a raid. 

Quality Counts

Comparative testing of addons is a must, to eke out every bit of performance. The best approach is to get a little FPS addon (or just use CTL+R to turn on the built-in one), then find a quiet place to test your candidates.  For example, all else being equal, try each HUD addon and look for dramatic drops in FPS. Any obvious outliers can be given the boot.

A good place to test your candidates is in the entrance of just about any instance. Avoid those with a lot going on – e.g. Violet Hold or ICC – and opt instead for those that have nice, quiet staging areas, like Karazhan.

Easy Upgrade

All other things being equal, if your client’s main issue is with framerate under load, a simple video card upgrade may do the trick.  I’m running a Radeon 5000 series card which I purchased for under $100 over a year ago, and get on average 30 fps in cities.  I have a lot of problems in 25- and 40- man raids, though. Purchasing another identical card and coupling it with the one I have already will improve matters a lot, and that will also improve the performance of all my high-impact addons.

Or, I could upgrade to the next tier of Radeon, a 6000 or 7000 series, whichever is available in my price range from my favorite vendor (I prefer Gigabyte solid cap boards because electrolytes are icky)1.

It isn’t just WoW that will improve, I’ve found. So many apps and games use similar mechanics for updating high-activity visual components that a nice video card upgrade.

So, protip – if you buy to last, you can stretch a PC’s life a long time with video card upgrades.


  1. Example only, but oho, looky, under $100! []

Comments No Comments »

You’ve probably heard about the peeps suing Blizzard over the authenticator thing. If not, WoW Insider has a pretty good summary.

At first I was amused. Well, of course Blizz claims the case has no merit! The suing lawfirm could have pictures of Metzen on the Grassy Knoll with a rifle in his hand, and they’d say that.  So, SHOCK, right?

Then you look at the suit itself and things start to pop out.

After reviewing it, I have come to the careful conclusion that Carney Williams Bates Pulliam & Bowman are, collectively and individually, full of shit.

Now, this is notwithstanding Blizz’s own response, which pretty much sums up a fair response on the topic of their response to the data breach earlier this year. I also love this bit:

"…and we will vigorously defend ourselves through the appropriate legal channels."

Heh. In other words, CWBBPB are a bunch of grandstanding losers that are trying to run this case through the press in the hopes of getting some sort of useful publicity.

But in case anyone out there feels like a "victim" and think that CWBBPB make a good point about "forcing" you to use an authenticator, let’s put the record straight.

Blizzard’s login security does not require an authenticator.

It requires two things – an email address, and a password. This is the same thing you get from Twitter, Facebook, Google (who also recommend two-part security, FWIW), MSN, and so forth. 

Maintenance of that password is your responsibility.

The same as it is with Twitter, Facebook, Google, MSN, and so forth.

Maintenance of your own security is your responsibility.

The same as it is with Twitter, Facebook, Google, MSN, and so forth.

The need for an authenticator is dependent on your own security, not Blizzard’s

As far as I can tell, we’ve had exactly one breach of the account servers since WoW’s inception, and that was in August of this year1.

No, authenticators are designed to mitigate (not solve) problems with users not following proper security protocols.

  • Using the same password for all your accounts everywhere.  All it takes is some bozo to hack Twitter – and Twitter to not inform you – for that bozo to get your WoW password as well.
  • Not using antivirus software. Come on. If you’re on Windows, it’s free, even for XP.  Microsoft’s "Defender" software is highly recommended, it’s lightweight and fairly unobtrusive, and it’s completely free of charge. There is no excuse. And don’t tell me you have nothing to fear from viruses. Just don’t.
  • Visiting website of questionable reputation.  I’m not talking about porn here, or torrent sites, or zero-days, or anything like that. Well, okay, I am, but only in as much as purveyors of Trojan viruses will use the porn, torrents, and warez to get you to click something and then hit YES when the dialog comes up. This is probably the greatest threat out there, and anti-virus software can only warn you. If you don’t listen, and grant some crusty software from a porn site full access to your system, you’re getting pwned, and now. Say hello to my little friend "keylogger".
  • Not using multi-user security on a multi-user system. Sure, it’s a family computer. But Microsoft provides many tools for keeping YOUR stuff out Junior’s hands.  Oh, sure, he’s an angel. And he’s not downloading "free" software, surely.  (insert sarcasm emotes here)

I’m just scratching the surface here.

Point is, the vast, vast, vast majority of account breaches are because you, the user, did not follow protocol, or got some bug somewhere, without knowing it.  The authenticator is as much protection against YOU as it is the bad guys.

All this is to say

If this lawsuit has given rise to a nice, warm sense of entitlement, I want you to reach out, put your hands around its neck, and choke it in its sleep. It’s not for real. It’s like one of those pod people in that movie. It will consume you and return nothing back.

Nobody is forcing you to use an authenticator. Nobody. Well, maybe your GM wisely requires an authenticator for access to the guild bank. But that’s the GM being properly cautious since she can’t control where everyone sticks their noses, as it were.

But the authenticator is not intended as a replacement for Blizzard’s security or your own. It’s a safeguard against YOU at your worse. If you have impeccable security practices online, never have virus issues, use strong security all the time, you could probably get away with not having one.  I, however, am not that good, and am glad for the extra bit of protection.


  1. Searching Google for this sort of thing generally fills your page with PSN server breach info, unless you restrict the search to this year, because they generally haven’t had problems in that realm and seem to take it pretty seriously. []

Comments No Comments »

I’ve often used WoWHead and other similar sites to compare stats on items as I gather them, but most if not all have a couple of flaws.

  1. They often don’t include all viable stats, just the major ones, in their comparisons – or at least not that I can see.
  2. It’s usually impossible to compare 2H to DW or 1H+OH ratings; for example, a staff compared to a wand and an orb. But that’s what you need to know when comparing staves to wands and so forth.

I started working on a solution to the latter and ended up creating a full blown worksheet for item comparison.

Coincidentally, Rating Buster is losing its mind, so this is somewhat timely.

Rating BasherWhat it does and how to use it

  • In the blue box on the right of the sheet, select your toon’s class + spec.
  • In the left hand column entitled Equipped / MH, put the stats for the item you are currently using.
    • For any stat that doesn’t have a weighting value (Column I), you don’t need to populate it, because it will not count.
  • In the column entitled Of Interest / MH put the stats for the item you are considering.
  • If you’re comparing dual-wield stats or MH + OH stats, you’ll want to fill in the offhand value as well, especially if comparing 2H (say, a staff) against a one-hand with offhand (say, wand + orb).
  • If any of the items have gem slots and/or bonus stats, you will need to populate the bonuscolumn appropriately.
    • No, I haven’t pre-loaded those with common values for gems and other bonuses. Read your tooltips.
  • In the little yellow box at the lower right, you will be informed if it’s an upgrade or not.

I realize this isn’t optimal like WoWHead or something like that, but it’s better than a lot of the available tools right now, and it does things I like that they don’t, or they do something silly like say that a wand by itself is an upgrade over a staff, even though the wand + orb combo doesn’t even come close to the same stats when put together1.

This worksheet is protected against modification; you will have to make your own copy to use, since this is an interactive device.  If you don’t have a google account – which is all you really need – why not? Drop me an email and I’ll float you an invite.

I still haven’t figured out a way to mass-import the stat weights yet (right now I’m doing like everybody else and looking at Mr. Robot).  What this means is that until I do, I’ll just be doing one major update per patch unless I see reason to do otherwise.

The version number will reflect the patch level that the gizmo coincides with. As you can see, right now we’re still not up with 5.0.5.  In a couple of days, Light willing.

Technical Notes

You can add specs to this yourself.  You will need to add the name of the spec to the list entitled “Specs” which is on the “Classes” tab, and you will need to come up with a little mnemonic for it.  For example, “Rogue, Assassination” becomes “RoA”. Then you will need to create a spec weight table as a named list, this time with the name being the mnemonic.  You will find all these on the “Weights” tab, but there is nothing that says it has to be. In fact, if you create your own tab for your own stuff, you won’t have to worry about it getting overwritten whenever the main sheet is updated.

In summary:

  1. Create a name for your spec and insert it into the “Specs” named list.
  2. Create a mnemonic for that spec and include it on the same sheet, next to your spec’s name (row B).
  3. Create a named list and name it after your mnemonic. Populate it with the stat weights you want, in the same order as seen on the “Weights” tab.
  4. ???
  5. Profit!

If all of that made no sense to you, custom weights are not something you should attempt. WoWHead or Rawr is probably your best bet.

Hope you enjoy using this tool! And if not, I’ll refund your complete purchase price provided it is purchased directly through the Grimmlabs Swag and Incidental Crap store.


  1. Yes, looking at you again, Rating Buster. []

Comments No Comments »

Update 5/15/2012 - Well, I certainly hope we pulled last night’s attempt before anyone downloaded it and installed, it. If not, I do appologize for your empty addon directory. As has been said many times, backups are our friends. With any luck, the only install that was damaged was my own.

This build does not appear to have that problem. But still, be mindful and proceed with caution until you’re sure it won’t hurt anything.

If you have, like me, used The Undermine Journal for price research, you may have installed the addon that the author also makes available. There are two varieties; the generic one you will find on Curse and other similar sites1 and a custom one that you can download from TUJ itself.

The custom one can have up to four realms’ specific pricing data. The generic one uses an average of all realms.  I think you can see the advantage of the former – near real-time data specific to the realm you’re logged in to at the time.

The downside is that it is a little tedious to go and get the realm-specific build and install it every day or whatever schedule you follow.

Before the Crib was wiped out, we had this automated. Thanks to no good backups, this automation tool was lost forever.

Well, we’ve reengineered it, and we’ll share it with you.

What you will need:

  1. Python 2.7 or later installed. Do not install version 3 of any sort.  You can download Python here: http://www.python.org/download/releases/2.7.3/
  2. A text editor that won’t make a mess of things. While NotePad will work, Notepad++ is better. You can find it here: http://notepad-plus-plus.org/download/v6.1.2.html
  3. An account on The Undermine Journal. If you don’t have one, go here and do so. https://theunderminejournal.com/user.php It’s really nifty. You can use your Google or Facebook or Twitter account to authenticate. And who doesn’t have one of those?
  4. The technical acumen to create files, edit them, and move them around.
  5. The technical acumen to use a command line shell (‘cmd’ in Windows.)

Setting up TUJ

The first thing you should do is set up your account on The Undermine Journal.  Once you have done so, you need to set up which realm(s) you wish to obtain realm-specific pricing data for. Go to this page (https://theunderminejournal.com/user.php) and scroll down to see something like this.

TUJ-Realm-Addon-Control

Control-click each realm of interest, up to four.

Now, the link to the right will have a custom URL that you can use to get your realm data.

Keep that web page open somewhere so you can go back and get that URL when you need it.

Setting up a workspace

This program is a slob and needs its own home. All of our work is done in d:\grimmlabs\project_name, but you will have your preferences as to where you put this.  It should be a path that you can remember.  For example, C:\TUJ.  Do that by opening a shell and doing the following.

shell-1

Once you have the workspace, CD to that directory in your shell.

Creating the program

You can either download this file to your PC (It’s a zip file, you’ll have to unpack it.), or, if you’re the suspicious type2, copy the following and paste it into a file called, for example, C:\TUJ\UpdateTUJ.py.  (Clicky on the little magnifying glass to show the code. Hover over it to see a toolbar with a few interesting features.)

## UpdateTUJ.py
## (c) 2011-2012 by Jeff Grimmett
## Freely redistributable for all non-commericial uses
## including modification and improvement.
##
## Shine on you crazy diamond.
##

# See http://wowblog.grimmlabs.com/article-number for the full
# set of instructions involved to use this script.

# Note: this can only be used ten times a day. After that, it
# goes boom, but it won't do any damage when it does.

# Here are some variables you will need to change.

import  os
import  os.path
import  shutil
import  urllib2
import  zipfile

# The URL to retrieve; will be unique for your account
TUJURL      = 'https://theunderminejournal.com/TheUndermineJournal.zip'
# The location of your addon directory
TargetPath  = 'c:/program files/world of warcraft/interface/addons'

# These are some variables that you don't need to mess with
#
# ... and if you do, you better do it right or things will go "crunch".

# The name of the zip file, locally
LocalFile                      = 'TheUndermineJournal.ZIP'
# The final path of the addon
FinalDestination    = os.path.join(TargetPath, 'TheUndermineJournal')

print "Starting ..."
print "Opening %s" %TUJURL

# Open the URL and local file
u = urllib2.urlopen(TUJURL)
f = open(LocalFile, 'wb')
meta = u.info()
file_size = int(meta.getheaders("Content-Length")[0])
print "Downloading: %s Bytes: %s" % (LocalFile, file_size)

file_size_dl = 0
block_sz = 8192

# Proceed to download and update the display as it progresses.
while True:
    buffer = u.read(block_sz)
    if not buffer:
        # All done
        break

    file_size_dl += len(buffer)
    f.write(buffer)
    status = r"%10d  [%3.2f%%]" % (file_size_dl, file_size_dl * 100. / file_size)
    status = status + chr(8)*(len(status)+1)
    print status,

# Close local file
f.close()

# Make sure we have a place to unpack
if not os.path.exists('unpack'):
    print "Creating unpacking space"
    os.mkdir('unpack')
else:
    print "Cleaning up last session"
    shutil.rmtree('unpack', True)
    os.mkdir('unpack')

# Now that the file is downloaded, we unpack it.
print "Unpacking ...",
z = zipfile.ZipFile(LocalFile)
z.extractall('unpack')
z.close()
print "Done!"

# Now that the directory is unpacked, we delete the old TUJ addon
if os.path.exists(FinalDestination):
    print "Deleting old addon"
    print FinalDestination
    shutil.rmtree(FinalDestination, True)

# Now that the old TUJ is gone, this one is put in its place.
print "Installing updated version ...",
shutil.copytree('unpack/TheUndermineJournal', FinalDestination)

# All done!
print "All done!"

Everything between the quotes is the custom URL for your custom addon.  You will need to delete what is there3 between the quotes.

Go back to the Undermine Journal user page where your user account info is, and copy the URL for the link:

TUJ-Realm-URL-Location

Paste that link in between the quotes, and save the document.

(2) Set up your addon folder’s location

By default, addons are assumed to live in c:\program files\world of warcraft\interface\addons.  If your system follows that convention, then there is nothing else to do. If, on the other hand, you have WoW’s addons living elsewhere, you will need to edit the following line.

# The location of your addon directory
TargetPath = 'c:/program files/world of warcraft/interface/addons'

Note that this is the top level of the addons directory, not for TUJ itself.  The script will take care of that for you.

(3) Set up your environment

On Windows7, installation of the Python interpreter automatically registers the .py and .pyw extensions to the interpreter, so just running one from a shell will make it go.  On older systems, such as XP, you will need to add those extensions to the EXTPATH environmental variable.

You can also just include Python’s interpreter in your command path via the PATH variable and run it directly:

image showing python UpdateTUJ.py

… or use the full path.

shell-2

If you have the extension registered, then you can just drag an icon to the desktop once you know things are running smoothly. Up to you.

(4) … and that’s it!

If we’ve done our homework properly, you’re ready to give this thing a try.

Open a shell and give it a whirl!

shell-3

If you can’t figure out what’s going wrong from the error code, just drop me a line via the email link above or a comment below and we’ll sort it out.

Some Final Thoughts

  • This is in no way a bulletproof solution. The error handling is virtually nonexistent. I’m pretty sure it can’t do any real damage to your WoW install or OS, but if you have doubts, best to just move along.
  • TUJ only allows access to this custom addon ten times a day per account. You may hit that wall during installation and testing. My suggestion is to get a copy by hand first, so you can use it while you tweak the script. Or just be patient, the next day will be here tomorrow.
  • I intend to keep updating as I go along.  First priority is error handling. Next is a nice installer to make life easier. Next is a windows-only version that will run natively, no need for nasty interpreters.
  • This code should work on any platform that supports Python, including MacOS or whatever they call it today.
  • I’m sure I’ve overlooked a zillion things. Software projects generally involve a bit of beta testing which exposes these things. This app has received none.

  1. I dunno, did they kill all the other addon sites off? []
  2. To which I say, bully for you! []
  3. That’s just a total fake in the example. []

Comments 2 Comments »

If you have downloaded the program that was just recently posted, please don’t run it!  It has a flaw that can potentially delete all your installed addons!  We’re looking in to it.

Comments No Comments »

In which I realize that WoW raiding and software development have a common element.

twit1-1twit1-2twit1-3twit1-4

How does this relate to raiding? Well, it has to do with learning from one’s mistakes.

In the software development world, we have to face the same old problems repeatedly because, instead of defining what a product should do clearly, we just say "it should do what the old one did" and then re-implement the same old mistakes.  Since we are implementing "anew", our regression test suite often drops product-specific test cases and misses it initially. Which always devolves into exchanges like "why didn’t you test this?" followed by "we didn’t realize it was THERE."

Software developer Jamie Zawinski stated the syndrome fairly well as CADT – Cascade of Attention-Deficit Teenagers. Its fairly universal across the development world. I’ve often stated it as "developers like bright shiny things." Code monkey not want fix broken code. CODE MONKEY WANT MAKE NEW CODE FOR OTHER CODE MONKEY TO FIX.

Now, imagine if we raided that way. Maybe you’ve actually BEEN in a raid lead that way. After one or two tries doing it THIS WAY with mild improvements, we switch to a WHOLE NEW WAY, fail a couple of times, then switch again, and again, and so forth. In other words, we never execute any raid strat fully, just creating new ones that – we promise – won’t fail like the last one.

Well, that’s just silly. All good raid teams know that it takes time and patience and practice and, most importantly, LEARNING in order to get anywhere on a new raid boss. How to catch the signs that mean you should blow a defensive cooldown. When to notice that the adds are about to come out. The signs that now is the time to use that special boss button. Watching a vid only helps so much. Doing – and, more importantly – failing will fill in those final blanks and make it possible to progress to the next task in the chain towards the boss kill.

If all software development progressed like raid progression for successful raiding teams, our world would have much more awesome software and far less jaundiced eye-rolling as we faced yet another BSOD as reward for trying to save our work.

So there’s a take-away for the successful raid leader. If you can lead a raid team through progression, you have skills valuable in the software development industry. If you put it that way to your prospective boss, you’ll get some odd looks, but I’m sure you’ll find a way to explain it. You are, after all, obviously pretty bright. :)

Comments No Comments »

GOOD NEWS, EVERONE!

The creator of the much beloved (by us, anyway) GUPPet addon has updated it to be current with 4.3 and even corrected a but or two. My past ramblings are therefore rendered moot. I haven’t tested to see if the sea mount bug is still there, yet, but my workaround still probably works.

At any rate, no need to hack, just download!  And if you’re super-cautious, like I am, back it up to a USB thumb drive first.1.

/cheer


  1. If you don’t know how to do that, STOP HACKING NAOW! []

Comments No Comments »

STOP RIGHT THERE! As of early December 2011, the author has begun updating the addon again.  The new version (2.020-ish) works properly.  See here for more details.

If you have been using the addon GupPet, you’ve no doubt noticed that (a) it has problems with swimming mounts in Vash’jir, and (b) it has problems with any of the new mounts from 4.0.6 onward. This is a shame since GupPet is otherwise one of the most sophisticated and well-featured random mount addons you are likely to encounter. Fortunately, all is not lost. I have some tips on how to fix both issues.

Easy one first – the swimming mount issue

In the most recent version, 2.018, the following appears in the release note.

Fixed the bug where a flying mount was selected while swimming if you only had a mount that can be used as ground and fly

This got me thinking: what if that broke something else? So, I downgraded to 2.017.  That fixed the problem!

New mounts!

This is a little harder to sort out, but isn’t that difficult if you’re familiar with using text editors to edit configuration files.

GupPet puts all of its mount data in a single file called Gup_MountData.lua. The trick is to find a mount similar to the one you want to add, copy it, paste it where needed, and then edit the new data to add your mount.

Here’s how.

  1. Find your Addons. On an XP box, it’s C:\Program Files\World of Warcraft\Interface\Addons, in Win7 and Vista it’s C:\Users\Public\Games\World of Warcraft\Addons. Inside that folder you will find a folder called GupPet .Find your addons
  2. Find the file to edit, and open it with a text editor. The file is called Gup_MountData.lua. You can use NotePad, but I recommend one of the free replacements such as NotePad++ (which will be used for this example).Edit this file
  3. Find a mount similar to the one you want to copy.  In this case, I want to add my new Subdued Seahorse mount, so I’m going to copy the seahorse mount that everyone gets in Vash’jir, as you can see.I'm on a seahorse!
  4. Copy that mount’s info, and paste it where it needs to go. In this case, it goes right at the end of the aquatic mounts section.Paste the copied mount info
  5. Edit the name of the mount. This is not required – the mod will work either way – but if you don’t edit the text on the far right (a programming comment), you may forget what’s what in your updated file. DO NOT REMOVE THE DOUBLE-MINUS AT THE START OF THE DESCRIPTION. The addon will break if you do.Edit the comment
  6. Find the mount on WoWHead. You need the ItemID of the mount. There are many ways to get that information, but this is the surest.Let me WowHead that for you
  7. Find the ItemID. The ItemID is the unique identifier of the mount (not it’s reigns or similar "item" that teaches you the mount). The ItemID will be the number at the end of the URL for that mount’s WoWHead page. Note the ID and write it down.Get the ItemID That's the ItemID
  8. In the LUA file, change the ItemID of the copied line to that of the mount itself.Change the ID
  9. Save the file and you’re done! If you are logged in to the game, you will need to exit the game and re-start it1.

 

And that is it!  You should now have the Subdued Seahorse as a usable mount in GupPet if you should ever catch Poseidus out on a stroll.

Here’s an example of adding a couple of flying mounts. In this case, the Flameward Hippogryph and the Winged Guardian.

Two flying mounts

Finally, at the top of the file is a guide to the flag logic that you can use when adding mounts of various types.

Mount Flags

When upgrading, don’t forget to copy this file off as a safeguard against being overwritten by one with incomplete information. You will need to manually inspect the upgrade file to ensure that all your mount data is preserved in the new one.  Now, I suspect that any upgrade that comes down the pike will be up to date with the latest mount data. But I also find it unlikely that we will see an upgrade since this one is close to eight months out of date (nine, if you don’t count the broken 2.018). Otherwise I’d not be writing this guide.

Hey, if you know of a maintained addon that has all the bells and whistles that this one has, please do drop a line in the comments.  And, if not, then at least we can extend the life of this lovely piece of software a bit more. Who knows, we might keep it running into 5.0!


  1. There are other ways, yes, but this is the most reliable way to get the right results. Hush. Do eet. []

Comments 10 Comments »