Project Diablo 2 d2bs guide (! patched since January 21, 2021)

NOTE:
This guide became outdated and pd2bs discord channel contains newer data.
Unfortunately even that project wasn’t maintained by @richard, for season 4 and more.



Hello all

I was asked about the possibilities of a Bot or Hacks for “Project Diablo2” so I wanted to make a Guide so that all of you have the same Information and possibilities.

Honestly it still required and requires some experience with Kolbot, D2BS and JavaScript to get everything working so please dont expect to just download a file and start botting.
But if you follow the instructions below you will be able to bot with your PD2 Champs on the official PD2 Servers.

Goals:

  1. Run Kolbot in 1.14D as a automated Killer
    If you want a program to kill targets and loot relevant stuff you can use Kolbot in its final Version on a diablo2 1.14D Installation. Go through the following steps to get Kolbot working:
  • Install fresh Diablo2 in english language

  • Make sure to patch that installation of D2 to 1.14D (By connecting to the battle.net or any other way)

  • Copy only the “patch_d2.mpq” from you PD2 installation into the directory of the fresh D2 1.14D

  • Get the Kolbot Version for Diablo 1.14D (E.g. By pulling from https://github.com/blizzhackers/kolbot)

  • In the configuration of Kolbot (execute D2Bot.exe) you have to create a Profile with the “Game.exe” of the of the D2 Version 1.14D directory as Game Path / Target. Also dont forget to add the Parameter “-w” and make the common Kolbot adjustments

  • To let Kolbot connect to the PD2 Realm (without editing the Realms choosable in Kolbot by default) you can edit the IP of the realms in the RegEdit under “Computer\HKEY_CURRENT_USER\Software\Battle.net\Configuration”. Open the “Diablo II Battle.net gateways” entry and set the ip of the realms to “35.225.107.249”.

  • Adjustments on the D2BS Files:

    D2BotLead.dbj: Add the following code after line 554. Where “gs 4” stands for the game description which is choosing the game server (europe) in PD2.

    var gsControl = getControl(1,432,268,333,20);
    if(gsControl)
    {
    gsControl.setText(“gs 4”);
    }

    Storage.js: Change the following lines to set the bigger storage sizes of PD2:

    this.StashY = me.gametype === 0 ? 4 : 8; => this.StashY = 15;
    this.Inventory = new Container(“Inventory”, 10, 4, 3); => this.Inventory = new Container(“Inventory”, 10, 8, 3);
    this.Stash = new Container(“Stash”, 6, this.StashY, 7); => this.Stash = new Container(“Stash”, 10, this.StashY, 7);

    Class.Charname.js: To make use of the bigger inventory in PD2 we also have to adjust the config file for our character to something like this:

    Config.Inventory[0] = [1,1,1,1,1,1,1,1,1,1];
    Config.Inventory[1] = [1,1,1,1,1,1,1,1,1,1];
    Config.Inventory[2] = [1,1,1,1,1,1,1,1,1,1];
    Config.Inventory[3] = [1,1,1,1,1,1,1,1,1,1];
    Config.Inventory[4] = [0,0,0,0,0,0,0,0,0,0];
    Config.Inventory[5] = [0,0,0,0,0,0,0,0,0,0];
    Config.Inventory[6] = [0,0,0,0,0,0,0,0,0,0];
    Config.Inventory[7] = [0,0,0,0,0,0,0,0,0,0];

    If you also made the other “common” adjustments to Kolbot as in vanilla you should be able to run the bot with your PD2 Character on the PD2 Realm now.

    Dont forget to add the new items into your PickSystem for maximum efficiency :wink:

  1. Run Kolbot in 1.14D in manual Mode for Maphack and Pickit
    There is an explanation on how to use Kolbots maphack and pickit in a manual mode here:
    https://github.com/blizzhackers/documentation/blob/master/kolbot/ManualPlay.md/#manual-playing
    If you follow these steps and make the adjusments within the Kolbot installation explained in Goal 1 you are able to play your PD2 character on the PD2 Realm in the vanilla Client. This has a few disadvantages compared to the launcher but I liked using that for leveling and baalruns.

    Note: I made two Kolbot profiles linked to the same Diablo2 1.14D installation and two Class.Charname.js files. One for botting and one for manual play. So I only had to change the Class.Charname.js and the Kolbot profile to switch between botting and manual play.

  2. Run D2BS with the PD2 Launcher for Maphack and Pickit
    This is a bit more complicated. I try to make it short:
    The “old” Version of D2BS 1.3.3 is working with the PD2 launcher. If you set this up you have to copy or rewrite the scripts you need to make use of D2BS. I did so and it took some time to got Pickit working.
    But: D2BS 1.3.3 does not export the SendPacket() Method. Without this method the picking functionality is not as fast as in the later versions. So the manual mode of the new Kolbot is picking up faster than the pickit you can build with the old D2BS 1.3.3. If someone is still interested in this topic I can give some hints on how to build maphack and (slower)pickit for the PD2 launcher.

New Items:
To Pick up the new Items you have to add the new items to the Kolbot PickIt system.
In a first step you have to add the ids into the “NTItemAlias.dbl”. Honestly I was to lazy to look them up so I estimated the ids and until now I found stackable HighRunes, DC Components, WordlStoneShards and the other new stuff.
My approach is to add 100 ids for 100 new items and give them a unique name:

NTIPAliasClassID[“wss”] = 659; NTIPAliasClassID[“worldstoneshard”] = 659;
NTIPAliasClassID[“n00”] = 660; NTIPAliasClassID[“new00”] = 660;
NTIPAliasClassID[“n01”] = 661; NTIPAliasClassID[“new01”] = 661;
NTIPAliasClassID[“n02”] = 662; NTIPAliasClassID[“new02”] = 662;
NTIPAliasClassID[“n03”] = 663; NTIPAliasClassID[“new03”] = 663;
NTIPAliasClassID[“n04”] = 664; NTIPAliasClassID[“new04”] = 664;
NTIPAliasClassID[“n05”] = 665; NTIPAliasClassID[“new05”] = 665;
NTIPAliasClassID[“n06”] = 666; NTIPAliasClassID[“new06”] = 666;
NTIPAliasClassID[“n07”] = 667; NTIPAliasClassID[“new07”] = 667;
NTIPAliasClassID[“n08”] = 668; NTIPAliasClassID[“new08”] = 668;
NTIPAliasClassID[“n09”] = 669; NTIPAliasClassID[“new09”] = 669;
NTIPAliasClassID[“n10”] = 670; NTIPAliasClassID[“new10”] = 670;
NTIPAliasClassID[“n11”] = 671; NTIPAliasClassID[“new11”] = 671;
NTIPAliasClassID[“n12”] = 672; NTIPAliasClassID[“new12”] = 672;
NTIPAliasClassID[“n13”] = 673; NTIPAliasClassID[“new13”] = 673;
NTIPAliasClassID[“n14”] = 674; NTIPAliasClassID[“new14”] = 674;
NTIPAliasClassID[“n15”] = 675; NTIPAliasClassID[“new15”] = 675;
NTIPAliasClassID[“n16”] = 676; NTIPAliasClassID[“new16”] = 676;
NTIPAliasClassID[“n17”] = 677; NTIPAliasClassID[“new17”] = 677;
NTIPAliasClassID[“n18”] = 678; NTIPAliasClassID[“new18”] = 678;
NTIPAliasClassID[“n19”] = 679; NTIPAliasClassID[“new19”] = 679;
NTIPAliasClassID[“n20”] = 680; NTIPAliasClassID[“new20”] = 680;
NTIPAliasClassID[“n21”] = 681; NTIPAliasClassID[“new21”] = 681;
NTIPAliasClassID[“n22”] = 682; NTIPAliasClassID[“new22”] = 682;
NTIPAliasClassID[“n23”] = 683; NTIPAliasClassID[“new23”] = 683;
NTIPAliasClassID[“n24”] = 684; NTIPAliasClassID[“new24”] = 684;
NTIPAliasClassID[“n25”] = 685; NTIPAliasClassID[“new25”] = 685;
NTIPAliasClassID[“n26”] = 686; NTIPAliasClassID[“new26”] = 686;
NTIPAliasClassID[“n27”] = 687; NTIPAliasClassID[“new27”] = 687;
NTIPAliasClassID[“n28”] = 688; NTIPAliasClassID[“new28”] = 688;
NTIPAliasClassID[“n29”] = 689; NTIPAliasClassID[“new29”] = 689;
NTIPAliasClassID[“n30”] = 690; NTIPAliasClassID[“new30”] = 690;
NTIPAliasClassID[“n31”] = 691; NTIPAliasClassID[“new31”] = 691;
NTIPAliasClassID[“n32”] = 692; NTIPAliasClassID[“new32”] = 692;
NTIPAliasClassID[“n33”] = 693; NTIPAliasClassID[“new33”] = 693;
NTIPAliasClassID[“n34”] = 694; NTIPAliasClassID[“new34”] = 694;
NTIPAliasClassID[“n35”] = 695; NTIPAliasClassID[“new35”] = 695;
NTIPAliasClassID[“n36”] = 696; NTIPAliasClassID[“new36”] = 696;
NTIPAliasClassID[“n37”] = 697; NTIPAliasClassID[“new37”] = 697;
NTIPAliasClassID[“n38”] = 698; NTIPAliasClassID[“new38”] = 698;
NTIPAliasClassID[“n39”] = 699; NTIPAliasClassID[“new39”] = 699;
NTIPAliasClassID[“n40”] = 700; NTIPAliasClassID[“new40”] = 700;
NTIPAliasClassID[“n41”] = 701; NTIPAliasClassID[“new41”] = 701;
NTIPAliasClassID[“n42”] = 702; NTIPAliasClassID[“new42”] = 702;
NTIPAliasClassID[“n43”] = 703; NTIPAliasClassID[“new43”] = 703;
NTIPAliasClassID[“n44”] = 704; NTIPAliasClassID[“new44”] = 704;
NTIPAliasClassID[“n45”] = 705; NTIPAliasClassID[“new45”] = 705;
NTIPAliasClassID[“n46”] = 706; NTIPAliasClassID[“new46”] = 706;
NTIPAliasClassID[“n47”] = 707; NTIPAliasClassID[“new47”] = 707;
NTIPAliasClassID[“n48”] = 708; NTIPAliasClassID[“new48”] = 708;
NTIPAliasClassID[“n49”] = 709; NTIPAliasClassID[“new49”] = 709;
NTIPAliasClassID[“n50”] = 710; NTIPAliasClassID[“new50”] = 710;
NTIPAliasClassID[“n51”] = 711; NTIPAliasClassID[“new51”] = 711;
NTIPAliasClassID[“n52”] = 712; NTIPAliasClassID[“new52”] = 712;
NTIPAliasClassID[“n53”] = 713; NTIPAliasClassID[“new53”] = 713;
NTIPAliasClassID[“n54”] = 714; NTIPAliasClassID[“new54”] = 714;
NTIPAliasClassID[“n55”] = 715; NTIPAliasClassID[“new55”] = 715;
NTIPAliasClassID[“n56”] = 716; NTIPAliasClassID[“new56”] = 716;
NTIPAliasClassID[“n57”] = 717; NTIPAliasClassID[“new57”] = 717;
NTIPAliasClassID[“n58”] = 718; NTIPAliasClassID[“new58”] = 718;
NTIPAliasClassID[“n59”] = 719; NTIPAliasClassID[“new59”] = 719;
NTIPAliasClassID[“n60”] = 720; NTIPAliasClassID[“new60”] = 720;
NTIPAliasClassID[“n61”] = 721; NTIPAliasClassID[“new61”] = 721;
NTIPAliasClassID[“n62”] = 722; NTIPAliasClassID[“new62”] = 722;
NTIPAliasClassID[“n63”] = 723; NTIPAliasClassID[“new63”] = 723;
NTIPAliasClassID[“n64”] = 724; NTIPAliasClassID[“new64”] = 724;
NTIPAliasClassID[“n65”] = 725; NTIPAliasClassID[“new65”] = 725;
NTIPAliasClassID[“n66”] = 726; NTIPAliasClassID[“new66”] = 726;
NTIPAliasClassID[“n67”] = 727; NTIPAliasClassID[“new67”] = 727;
NTIPAliasClassID[“n68”] = 728; NTIPAliasClassID[“new68”] = 728;
NTIPAliasClassID[“n69”] = 729; NTIPAliasClassID[“new69”] = 729;
NTIPAliasClassID[“n70”] = 730; NTIPAliasClassID[“new70”] = 730;
NTIPAliasClassID[“n71”] = 731; NTIPAliasClassID[“new71”] = 731;
NTIPAliasClassID[“n72”] = 732; NTIPAliasClassID[“new72”] = 732;
NTIPAliasClassID[“n73”] = 733; NTIPAliasClassID[“new73”] = 733;
NTIPAliasClassID[“n74”] = 734; NTIPAliasClassID[“new74”] = 734;
NTIPAliasClassID[“n75”] = 735; NTIPAliasClassID[“new75”] = 735;
NTIPAliasClassID[“n76”] = 736; NTIPAliasClassID[“new76”] = 736;
NTIPAliasClassID[“n77”] = 737; NTIPAliasClassID[“new77”] = 737;
NTIPAliasClassID[“n78”] = 738; NTIPAliasClassID[“new78”] = 738;
NTIPAliasClassID[“n79”] = 739; NTIPAliasClassID[“new79”] = 739;
NTIPAliasClassID[“n80”] = 740; NTIPAliasClassID[“new80”] = 740;
NTIPAliasClassID[“n81”] = 741; NTIPAliasClassID[“new81”] = 741;
NTIPAliasClassID[“n82”] = 742; NTIPAliasClassID[“new82”] = 742;
NTIPAliasClassID[“n83”] = 743; NTIPAliasClassID[“new83”] = 743;
NTIPAliasClassID[“n84”] = 744; NTIPAliasClassID[“new84”] = 744;
NTIPAliasClassID[“n85”] = 745; NTIPAliasClassID[“new85”] = 745;
NTIPAliasClassID[“n86”] = 746; NTIPAliasClassID[“new86”] = 746;
NTIPAliasClassID[“n87”] = 747; NTIPAliasClassID[“new87”] = 747;
NTIPAliasClassID[“n88”] = 748; NTIPAliasClassID[“new88”] = 748;
NTIPAliasClassID[“n89”] = 749; NTIPAliasClassID[“new89”] = 749;
NTIPAliasClassID[“n90”] = 750; NTIPAliasClassID[“new90”] = 750;
NTIPAliasClassID[“n91”] = 751; NTIPAliasClassID[“new91”] = 751;
NTIPAliasClassID[“n92”] = 752; NTIPAliasClassID[“new92”] = 752;
NTIPAliasClassID[“n93”] = 753; NTIPAliasClassID[“new93”] = 753;
NTIPAliasClassID[“n94”] = 754; NTIPAliasClassID[“new94”] = 754;
NTIPAliasClassID[“n95”] = 755; NTIPAliasClassID[“new95”] = 755;
NTIPAliasClassID[“n96”] = 756; NTIPAliasClassID[“new96”] = 756;
NTIPAliasClassID[“n97”] = 757; NTIPAliasClassID[“new97”] = 757;
NTIPAliasClassID[“n98”] = 758; NTIPAliasClassID[“new98”] = 758;
NTIPAliasClassID[“n99”] = 759; NTIPAliasClassID[“new99”] = 759;

Afterwards one can add the relevant items to his .nip files so that the bot knows to pick them up.
Therefore I made a new “RunesAndNew.nip” and added the filename to my Class.Charname.js as it is done in vanilla Kolbot. The new .nip contains the names of the dummy entries as you can see here:

[name] == worldstoneshard
[Name] == new00
[Name] == new01
[Name] == new02
[Name] == new03
[Name] == new04
[Name] == new05
[Name] == new06
[Name] == new07
[Name] == new08
[Name] == new09
[Name] == new10
[Name] == new11
[Name] == new12
[Name] == new13
[Name] == new14
//[Name] == new15 // Stapelbarer Makelloser Amethyst
[Name] == new16
//[Name] == new17 // Stapelbarer Makelloser Topas
[Name] == new18
//[Name] == new19 // Stapelbarer Makelloser Sapphir
[Name] == new20
[Name] == new21
[Name] == new22
//[Name] == new23 // Stapelbarer Makelloser Rubin
[Name] == new24
//[Name] == new25 // Stapelbarer Makelloser Diamant
[Name] == new26
//[Name] == new27 // Stapelbarer Makelloser Totenkopf
[Name] == new28
//[Name] == new29 // Stapelbare EL Rune
//[Name] == new30 // Stapelbare ELd Rune
//[Name] == new31 // Stapelbare Tir Rune
//[Name] == new32 // Stapelbare Nef Rune
//[Name] == new33 // Stapelbare ETH Rune
//[Name] == new34 // Stapelbare Ith Rune
//[Name] == new35 // Stapelbare Tal Rune
//[Name] == new36 // Stapelbare Ral Rune
//[Name] == new37 // Stapelbare Ort Rune
//[Name] == new38 // Stapelbare THul Rune
//[Name] == new39 // Stapelbare AMN Rune
//[Name] == new40 // Stapelbare Sol Rune
//[Name] == new41 // Stapelbare Shael Rune
//[Name] == new42 // Stapelbare Dol Rune
[Name] == new43
//[Name] == new44 // Stapelbare IO Rune
[Name] == new45
[Name] == new46
[Name] == new47
//[Name] == new48 // Stapelbare Lem Rune
[Name] == new49
[Name] == new50
[Name] == new51
[Name] == new52
[Name] == new53
[Name] == new54
[Name] == new55
[Name] == new56
[Name] == new57
[Name] == new58
[Name] == new59
[Name] == new60
[Name] == new61
[Name] == new62
[Name] == new63
[Name] == new64
[Name] == new65
[Name] == new66
[Name] == new67
[Name] == new68
[Name] == new69
[Name] == new70
[Name] == new71
[Name] == new72
[Name] == new73
[Name] == new74
[Name] == new75
[Name] == new76
[Name] == new77
[Name] == new78
[Name] == new79
[Name] == new80
[Name] == new81
[Name] == new82
[Name] == new83
[Name] == new84
[Name] == new85
[Name] == new86
[Name] == new87
[Name] == new88
[Name] == new89
[Name] == new90
[Name] == new91
[Name] == new92
[Name] == new93
[Name] == new94
[Name] == new95
[Name] == new96
[Name] == new97
[Name] == new98
[Name] == new99

Warden / Bot detection:
PD2 Is checking your activity. I do not have to discuss that (as done in the d3jsp.org forum)!
After a night of botting I got a private ingame message from a moderator who asked me a few questions and told me I was reported for being online for a long time. Hence I would strongly recommend not to exaggerate botting. A few (3-4) hours a day are more than enough to find the gear you need for your character and trade a bit.

A big Thanks goes to " GosH " from d3jsp for the hint regarding the not existing version check of PD2

I wish you all a good quarantine and a healthy year.
Have a good time :slight_smile:

3 Likes

Hey there thank you for creating this guide, Im having some trouble getting some entityids and skillids. Might you have the time to help me out with this? I messaged you on discord, at your earliest convenience. Thank you!

Great guide! really appreciate the time and effort put into this.

Great guide. Seems like it’s gonna be quite helpful given the amount of questions regarding kolbot on PD2.

Note: I made two Kolbot profiles linked to the same Diablo2 1.14D installation and two Class.Charname.js files. One for botting and one for manual play. So I only had to change the Class.Charname.js and the Kolbot profile to switch between botting and manual play.

Regarding above, you can name the Class.Charname.js → Profilename.js, this way you don’t have to rename configs between switching profiles.

More info here: https://github.com/blizzhackers/documentation/blob/master/kolbot/CharacterConfig.md/#character-config-filename-options

1 Like

Thanks for the great response and the hint regarding the config names

1 Like

I did all the steps, but my stash doesn’t change in game (tried single player), and when I log into PD2 servers game crashes when i make a game.

worked great till patch …

So it seems that PD2 has a good anti-bot division :wink:
At least Goal “3. Run D2BS with the PD2 Launcher” is still working.
So it would be an easy thing to use or rewrite the bot mechanics for D2BS 1.3.3

Anyone wants to help?

1 Like

What a coincidence that they just fixed it after release of the guide. :upside_down_face:

I would like to help out, not sure i’m skilled enough but I will try. Can we connect somehow?

1 Like

damn they were fast patching it

back to bnet i guess lol

yea same here back to east ladder till we get a work around

Hi Reallyor,
I would like to setup D2BS 1.3.3 for maphack and Pickit. Can you give me a tutorial on how to do it or your discord so we can discuss?

I just want map hack dont mind doin my own mf just hate being blind

I am sry guys.
I am not playing or botting pd2 anymore. If you really want mh or pickit this is a very good start to learn to code (javascript). Grab d2bs 1.3.3 and get it to work with your pd2 client or an instance of diablo 1.13c with the patch.mpq from pd2. Afterwards you can read into the d2bs specification and make your own code for a mh or pickit. You can also find some help if you look (or copy) code from the existing kolbot scripts.

Stand up and become a programmer instead of asking for assistance makes you a part of the community :wink:

1 Like

Hi

I installed a fresh version of Diablo 2 und copied the patch_d2.mpq file from PD2 in the new directory. I also adjusted the IP in RegEdit but then I get the following message:

Unable to Identify Version
Battle.net is unable to properly identify your application version.

What did I do wrong?

Hey
The guide is outdated.

New information and files are shared within discord:

Have fun

1 Like

PSA:: If you join the discord make sure it is on a new discord account

PD2 Discord mods will check if you join PD2BS Discord or any Discord who is focused on Diablo 2 Botting / Maphacks and randomly ban you from the Official PD2 Discord.

How do I get it to connect to PD2 realm? I keep getting “attempt to access invalid address”

I re-opened this topic even the main post was patched 2 years ago.