I was an avid Diablo 3 player for a while back in 2012. The game was something I bought myself as a reward for finishing finals week, and I had never really played any of the previous games. Because of this I guess it’s safe to assume that, while I found the game fun, I didn’t really have that much attachment to it, so naturally, breaking the rules didn’t seem like a big deal to me.
For those not familiar with the game, it used to allow players to sell in-game items and gold over a virtual marketplace for real world money. Activision-Blizzard took their cut of the sale, and players were able to keep the rest. And for a while, it was actually kind of successful despite the backlash of a majority of players. Yes, it did provide an unfair advantage to those willing to shell out cash, and yes, it did dumb down the experience, but some players were very willing to shell out $20…$50….$100…$300 for some of the most valuable items in the game.
I took an interest to this, and began searching for a way to exploit it.
I came across a forum thread promoting an AutoIt script that plays the game for you. The main idea of what the script was trying to do was well thought out; here’s the gist of it:
- Use a portal to teleport to a specific area.
- Simulate a click on a specific location on screen and perform a hard-coded sleep
- Enter Sarkoth’s Dungeon
- Shoot arrows in all directions repeatedly for a set time to ensure every monster is dead.
- Walk around the room and pick up gold
- Exit to main menu, re-load the game, and repeat the process.
There are a few problems with how this is done:
- Monsters can stand where the script is trying to click, resulting in attacking the monster that is in the way, screwing the entire thing up
- It looks suspicious
- It doesn’t pick up rare items
The project was written in AutoIt, and I had previously had a bit of experience with using it to create online prize redemption bots. I had a few ideas to bring to the table, so I created an account using one of my old aliases (rvbfreak) and replied to the forum thread.
My idea was to use PixelSearch to scan the screen for a few things: First, the gold, as the bot was frequently missing piles of gold strewn across the room. Secondly, it could be used to search for the colors used in the in-game labels for rare items. Each item rarity level was labeled with a different color: white, blue, yellow, and brown respectively. Using PixelSearch, we could scan the screen for those colors and click on the item using that color. This could have worked fairly well if it wasn’t for the fact that the room the script loots items in is nearly the same shade of brown as the rarest weapons. With this problem, PixelSearch wasn’t the right tool for the job.
I then began playing with the idea of _ImageSearch, which is a third-party library that does just what you think it does: it searches the screen for the provided image. The problem was, it needed a lot of tweaking to get just right, and it wasn’t an optimal solution to scan the screen for each letter of the alphabet times the levels of rarity. That would be super inefficient.
I thought about it for a while and came up with a solution. I hopped on the forum and asked for users to take screenshots of the labels of their rare items. My goal was to take those screenshots, get cutouts of each vowel for each rare item, remove the background, and use _ImageSearch’s transparency ability to search only for the shapes of those vowels.
After a bit of tweaking, it actually worked pretty well. notAres (the project author) added it into the public release, along with a few other near features such as auto-selling looted items. Now that it was working, it was time to reap the benefits.
I let the script run overnight for about a week. The first six days yielded a lot of gold from the selling of less-rare items, but on day seven, I awoke to a legendary (brown) item in my inventory. I posted it as an auction on the real-money auction house and eventually sold it for $50.15 (after Blizzard took their cut).
Needless to say I was banned a from Battle.net a month or so later for breaking the game’s rules (blatantly, I might add). I’m not promoting this behavior, but I still like sharing the story behind this project.
Here’s the script for those interested.