Skip to content

Commit

Permalink
center text, d2 botting article
Browse files Browse the repository at this point in the history
  • Loading branch information
ckcollab committed Jun 26, 2016
1 parent 903e5b9 commit f6ff29f
Show file tree
Hide file tree
Showing 17 changed files with 148 additions and 52 deletions.
2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -3,7 +3,7 @@ Eric Carmichael's blog

![Picture of Eric Carmichael](content/images/kayak.jpg)

<p align="center"><b>"This is like my tenth time on a kayak, I'm pretty cool"</b> <br> &mdash; Eric Carmichael on Fernan Lake, Idaho</p>
<p style="text-align: center;"><b>"This is like my tenth time on a kayak, I'm pretty cool"</b> <br> &mdash; Eric Carmichael on Fernan Lake, Idaho</p>

Environment variables
=====================
Expand Down
7 changes: 7 additions & 0 deletions content/Diablo 2 AutoIt OCR.md
@@ -0,0 +1,7 @@
Title: Wayback machine - Diablo 2 AutoIt OCR
Date: 2016-6-26 15:10
Category: diablo 2
Tags: diablo 2, C#, hacking
Status: draft

asdfasdfadsf
109 changes: 99 additions & 10 deletions content/Diablo 2 Botting.md
@@ -1,23 +1,112 @@
Title: The coolest thing I've ever done: my Diablo 2 Bot
Date: 2014-5-15 15:10
Title: The coolest app I've built: Diablo 2 Botting
Date: 2016-6-26 15:10
Category: diablo 2
Tags: diablo 2, C#, hacking
Status: draft


To be honest my favorite project (ever) was a Diablo II bot I made ~10 years ago. If you've never played the game Diablo II, it's your typical nerdy Dungeons and Dragons kind of collect gear + level up + beat up monsters type of game.
My favorite project (ever) was a Diablo II botting system I made ~10
years ago. If you've never played the game Diablo II, it's your typical
nerdy Dungeons and Dragons kind of collect gear + level up + beat up
monsters type of game.

The bot I made was "clientless," meaning it tracked the entire game state itself, replied to every packet appropriately, and didn't require a game running. That meant I could run 1000's of bots on a regular computer instead of 2-4 games that soaked up all of the memory/CPU. Normally this wouldn't be possible, most bots required the game to be running to generate the maps. I made an API wrapped around a map generator and sold 1000 map generations for $1, this is what powered my bots and made them special!
<p style="text-align: center;" class="image-wrapper">
<img src="images/d2/ingame.jpg" alt="Diablo 2" style="max-width: 500px;">
</p>

Not only could the bot run without the client, that was pretty cool, but also the bot required 0 configuration. Normally, you'd have to edit some .ini or something similar outlining your character, where to put items, what skills to use, some kind of script to do attacks in a smart way (i.e. for ranged attacks position yourself far away).
## Diablo II Automation Progression

What my bot did, instead of reading some .ini file, was look directly at your character and infer a good build! This was like Heroku for Diablo II bots. You just pointed my bot at your character and it took over. If you had, for example, the "lighting bolt" spell maxed out, the bot would assume the "RangedAttack" pattern and stay at a decent distance while staying in line of sight. If you had no items or skills, the bot would smartly be able to at least punch the monsters!
I got to make a ton of automation tools for this game:

* started with [AutoIt](http://autoitscript.com) bots that moved based
on the pixels on the screen
* an AutoIt OCR (which I'll cover in another article later) that helped
me pickup nice items
* bots that no longer used pixels, instead memory and packet injection


<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/xqemOAJQBOU?rel=0" frameborder="0" allowfullscreen></iframe>
<p style="text-align: center;">
packet injecting bot
</p>

One of the other cool pieces of this bot was the task queue based module system. Every action in the game was fired off by some module, and executed by being pulled off the task queue. For example, I had modules Mover, Killer, Item Pickup, and Chicken. Mover module could get it's own whole paragraph, but to summarize it used the non-client based map generation to stitch together all of the required maps to get from point A to point B. Meaning, you could ask the Mover module to go to the last place in the game from the first point in the game, and it could stitch every map together giving you all of the waypoints + quests required to get to that location.
But, the coolest bot I made was "clientless" meaning: it tracked the entire game
state itself, replied to every packet appropriately, and didn't require
a game running. That meant I could run 1000's of bots on a regular
computer instead of 2-4 games that soaked up all of the memory/CPU.
Normally this wouldn't be possible, most bots required the game to be
running to generate the maps. I made an API wrapped around a map
generator this is what powered my bots and made them special!

The task based queue was especially useful. Consider if you were moving from Point A to Point B and some monster smacks you to half health, how will the bot react? The Chicken module will add a "very high" priority task to get the hell out of that area!
This would have been impossible without the amazing reverse engineering techniques
in the Diablo II hacking community. There were entire public wikis
dedicated to definitions for each packet and memory structure. Pretty
cool stuff to be noodling on when you're still in highschool!

Other cool parts of this bot were: CD Key rotator for running many bots at once sharing a pool of keys, entire website payment gateway + API, and an undetectable maphack that can reveal the map on a completely separate computer.
## Undetectable maphack

I made a neat maphack to test out the map generation API:

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/pL7K58Cdo5Y?rel=0" frameborder="0" allowfullscreen></iframe>
<p style="text-align: center;">
Maphack
</p>

This maphack was novel in that it didn't do anything inside the game
that changed memory or hooked into anything in a strange way. It simply
got the map seed (so it could run on a totally different computer) and
generated all the maps in the game, then stitching each together.

Also, the maphack could do some not-so-undetectable things like hook
into the game and inject "teleport this way" packets until you reach
the destination.

## Finally, clientless bot

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/9epvPv-mD1Y?rel=0" frameborder="0" allowfullscreen></iframe>
<p style="text-align: center;">
Bot pathing around the map
</p>


Not only could the bot run without the client, that was pretty cool, but
also the bot required 0 configuration. Normally, you'd have to edit some
.ini or something similar outlining your character, where to put items,
what skills to use, some kind of script to do attacks in a smart way
(i.e. for ranged attacks position yourself far away).

What my bot did, instead of reading some .ini file, was look directly at
your character and infer a good build! This was like Heroku for Diablo
II bots. You just pointed my bot at your character and it took over. If
you had, for example, the "lighting bolt" spell maxed out, the bot would
assume the "RangedAttack" pattern and stay at a decent distance while
staying in line of sight. If you had no items or skills, the bot would
smartly be able to at least punch the monsters!

One of the other cool pieces of this bot was the task queue based module
system. Every action in the game was fired off by some module, and
executed by being pulled off the task queue. For example, I had modules
Mover, Killer, Item Pickup, and Chicken. Mover module could get it's own
whole paragraph, but to summarize it used the non-client based map
generation to stitch together all of the required maps to get from
point A to point B. Meaning, you could ask the Mover module to go to the
last place in the game from the first point in the game, and it could
stitch every map together giving you all of the waypoints + quests
required to get to that location.

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/kGcE9SBIJ68?rel=0" frameborder="0" allowfullscreen></iframe>
<p style="text-align: center;">
Bot picking stuff up
</p>

The task based queue was especially useful. Consider if you were moving
from Point A to Point B and some monster smacks you to half health, how
will the bot react? The Chicken module will add a "very high" priority
task to get the hell out of that area!

Other cool parts of this bot were: CD Key rotator for running many bots
at once sharing a pool of keys, entire website payment gateway + API,
and some pretty impressive API performance using fancy caching techniques
with IO pooling.

The whole project was built in about 2 months with C#, PHP and JS!

10 changes: 5 additions & 5 deletions content/How Im using RiotJS and Django REST Framework.md
Expand Up @@ -2,14 +2,14 @@ Title: How I'm using RiotJS and Django REST Framework
Date: 2016-3-23 15:10
Category: web development
Tags: python, web development, riotjs, django, django rest framework, drf
Summary: Yo man, what lib you using these days, Angular? React? Vue? Skrible? SomeOtherMadeUpNameJS? What about another one: RiotJS!? <p align="center" class="image-wrapper"><img src="images/riot.png" class="img-responsive" alt="RiotJS"></p> We'll take a high level look at the tools I'm using on my current projects for making frontend <-> backend work fast and elegantly, in my opinion ;)
Summary: Yo man, what lib you using these days, Angular? React? Vue? Skrible? SomeOtherMadeUpNameJS? What about another one: RiotJS!? <p style="text-align: center;" class="image-wrapper"><img src="images/riot.png" class="img-responsive" alt="RiotJS"></p> We'll take a high level look at the tools I'm using on my current projects for making frontend <-> backend work fast and elegantly, in my opinion ;)


Yo man, what lib you using these days, Angular? React? Vue? Skrible? SomeOtherMadeUpNameJS?

What about another one: RiotJS!?

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<a href="http://riotjs.com/"><img src="images/riot.png" class="img-responsive" alt="RiotJS"></a>
</p>

Expand Down Expand Up @@ -47,7 +47,7 @@ We'll take a high level look at the tools I'm using on my current projects for m
</todo>
```

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/neapolitan.jpg" alt="HTML/JS/CSS Neapolitan"><br>
</p>

Expand Down Expand Up @@ -159,7 +159,7 @@ router.register(r'addresses', views.AddressViewSet, 'addresses')

Now I have all of these endpoints available to modify/view Addresses, WITH documentation!

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/api_docs.png" alt="API Docs"><br>
</p>

Expand Down Expand Up @@ -253,7 +253,7 @@ looking for little communities centered around similar principles so I don't hav
and greatest way to solve the same CRUD problems we face every day. By the time I learned AngularJS a lot of people
had already jumped ship.

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/programmer.jpg" class="img-responsive" alt="Smart Programmer">
</p>

Expand Down
2 changes: 1 addition & 1 deletion content/Linux on Windows 10.md
Expand Up @@ -31,6 +31,6 @@ Finding I have to install glibc and gcc via brew first???



<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/valley_girl.jpg" class="img-responsive" alt="Valley Girl">
</p>
4 changes: 2 additions & 2 deletions content/My favorite pytest plugins.md
Expand Up @@ -41,13 +41,13 @@ scheduling tests via LoadScheduling

Changes our test output from this:

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/pytest-no-spec.png" alt="Pytest without spec output"><br>
</p>

To this:

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/pytest-spec.png" alt="Pytest Spec output"><br>
</p>

Expand Down
4 changes: 2 additions & 2 deletions content/Streaming Django Responses On Heroku.md
Expand Up @@ -14,7 +14,7 @@ Not enough people use this helper!

Here's a small example "Valley Girl" stream

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/valley_girl.jpg" class="img-responsive" alt="Valley Girl">
</p>

Expand All @@ -41,7 +41,7 @@ work for you. So, so handy!

Watch out for problems with your WSGI servers and buffering data.

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/buffering.jpg" class="img-responsive" alt="Buffering problems">
<i><small>Buffering problems</small></i>
</p>
Expand Down
14 changes: 7 additions & 7 deletions content/Top 5 best gaming documentaries of all time.md
Expand Up @@ -2,9 +2,9 @@ Title: Top 5 gaming documentaries of all time
Date: 2015-5-11 15:10
Category: gaming
Tags: gaming, competition, mindset
Summary: The best of gaming competitiveness, attitude, culture and raw skill. To me these are the documentaries I'll look back at like my dad looks back at Superbowl 1. <p align="center" class="image-wrapper"><img src="images/top_5_gaming_docs/brood_war.jpg" alt="StarCraft: Brood War"></p>
Summary: The best of gaming competitiveness, attitude, culture and raw skill. To me these are the documentaries I'll look back at like my dad looks back at Superbowl 1. <p style="text-align: center;" class="image-wrapper"><img src="images/top_5_gaming_docs/brood_war.jpg" alt="StarCraft: Brood War"></p>

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/top_5_gaming_docs/brood_war.jpg" alt="StarCraft: Brood War"><br>
</p>

Expand Down Expand Up @@ -59,7 +59,7 @@ and always promoting a positive attitude.
frameborder="0"
allowfullscreen>
</iframe>
<p align="center">
<p style="text-align: center;">
<i>"My Life of Starcraft"</i>
</p>

Expand All @@ -82,7 +82,7 @@ and disappointment we've all faced. Whether it's dealing with our own problems o
frameborder="0"
allowfullscreen>
</iframe>
<p align="center">
<p style="text-align: center;">
<i>"The King of Kong: Fistful of Quarters"</i>
</p>

Expand All @@ -105,7 +105,7 @@ they destroyed earlier, and then come back for dramatic close wins.
frameborder="0"
allowfullscreen>
</iframe>
<p align="center">
<p style="text-align: center;">
<i>"The Smash Brothers Documentary"</i>
</p>

Expand All @@ -129,7 +129,7 @@ hard work and tremendous sacrifice.
frameborder="0"
allowfullscreen>
</iframe>
<p align="center">
<p style="text-align: center;">
<i>"Word Wars"</i>
</p>

Expand All @@ -154,6 +154,6 @@ Dota 2 competitive scene. Millions of dollars are on the line!
frameborder="0"
allowfullscreen>
</iframe>
<p align="center">
<p style="text-align: center;">
<i>"Free to Play: The Movie (US)"</i>
</p>
2 changes: 1 addition & 1 deletion content/Transitioning from helpless to helpful.md
Expand Up @@ -12,7 +12,7 @@ I felt like writing this because I've just realized that I now hang out in [#dja
and actually spend most of my time giving back instead of taking. To me that's a huge achievement that deserves some
attention, at least.

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/im_helping.jpg" alt="I'm helping!"><br>
</p>

Expand Down
12 changes: 6 additions & 6 deletions content/best pycon 2014 videos.md
Expand Up @@ -28,7 +28,7 @@ I haven't watched every single Pycon video so please be sure to recommend your f
interesting ways to reverse engineering/research a huge codebase.

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/RZ4Sn-Y7AP8?rel=0" frameborder="0" allowfullscreen></iframe>
<p align="center">
<p style="text-align: center;">
<i>"Discovering Python"</i>
</p>

Expand All @@ -53,7 +53,7 @@ are looking out for my best interests. They want me to be happy and feel welcome
and do my best&mdash;no reason to worry!

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/1i8ylq4j_EY?rel=0" frameborder="0" allowfullscreen></iframe>
<p align="center">
<p style="text-align: center;">
<i>"It's Dangerous to Go Alone: Battling the Invisible Monsters in Tech - PyCon 2014"</i>
</p>

Expand All @@ -70,7 +70,7 @@ around with python! Imagine flying this into your family and friends via iPython
This also goes into quite a bit of arduino stuff which is something I am trying to get into, pretty interesting.

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/jJ1vjr1dDqw?rel=0" frameborder="0" allowfullscreen></iframe>
<p align="center">
<p style="text-align: center;">
<i>"Cheap Helicopters In My Living Room"</i>
</p>

Expand All @@ -90,7 +90,7 @@ I think this guy is a pretty good speaker to model yourself after. He was confid
really enjoyed this presentation.

<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/R8Xmeynf1T4?rel=0" frameborder="0" allowfullscreen></iframe>
<p align="center">
<p style="text-align: center;">
<i>"Cache me if you can: memcached, caching patterns and best practices"</i>
</p>

Expand All @@ -104,7 +104,7 @@ friendly. My favorite part was probably the flow chart "if you have less than 50


<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/O7IezJT9uSI?rel=0" frameborder="0" allowfullscreen></iframe>
<p align="center">
<p style="text-align: center;">
<i>"Enough Machine Learning to Make Hacker News Readable Again"</i>
</p>

Expand All @@ -123,6 +123,6 @@ What I thought stood out about her presentation was concrete ideas/details, like


<iframe width="640" height="360" class="youtube" src="https://www.youtube-nocookie.com/embed/4QOoAw6Su7M?rel=0" frameborder="0" allowfullscreen></iframe>
<p align="center">
<p style="text-align: center;">
<i>"Keynote"</i>
</p>
8 changes: 4 additions & 4 deletions content/chin up.md
Expand Up @@ -20,7 +20,7 @@ There are two types of metrics:
It is meant to be hosted locally/somewhere free, like [Heroku](http://heroku.com).


<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/chinup/input.png" alt="Input data every day to Chin Up" class="image-full-width">
</p>

Expand Down Expand Up @@ -83,7 +83,7 @@ numbers and statistics.

## Ease of use

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/chinup/pin_passcode.png" alt="django-pin-passcode screen">
</p>

Expand All @@ -93,7 +93,7 @@ It logs you in to the user you define after you enter a certain passcode compose

## Stats

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/chinup/stats.png" alt="highchart stats" class="image-full-width">
</p>

Expand All @@ -106,7 +106,7 @@ It logs you in to the user you define after you enter a certain passcode compose

## Correlations

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/chinup/correlations.png" alt="Correlations" class="image-full-width">
</p>

Expand Down
2 changes: 1 addition & 1 deletion content/coeur d alene web developers.md
Expand Up @@ -22,7 +22,7 @@ stay with my mum. I picked back up web development and here I am today about thr

## Why North Idaho?

<p align="center" class="image-wrapper">
<p style="text-align: center;" class="image-wrapper">
<img src="images/cda_web_dev/killarney_lake.jpg" alt="Killarney Lake" class="image-full-width"><br>
<i><small>Killarney Lake</small></i>
</p>
Expand Down

0 comments on commit f6ff29f

Please sign in to comment.