What's new
  • Visit Rebornbuddy
  • Visit Panda Profiles
  • Visit LLamamMagic
  • Visit Resources
  • Visit Downloads
  • Visit Portal

xzjv

Community Developer
Joined
Mar 17, 2014
Messages
1,243
Reaction score
46
Getting started guide for people interested in fixing broken bounties or adding new ones.

Get set up


Using a proper coding tool is not required, you can do it in notepad. But i strongly recommend you use Visual Studio with Resharper.

Visual studio can be obtained for free here: https://www.visualstudio.com/en-us/products/free-developer-offers-vs.aspx

If you're going to be doing a lot of work with SVN i recommend TortoiseSVN https://tortoisesvn.net/

Grab the source

Developer Trunk SVN:
https://www.assembla.com/spaces/bulba-s-adventurer/subversion/source/HEAD/trunk


Configure Solution

Make sure you can build, if not then first check that the references are all up to date, remove DemonBuddy.exe and re-add them from a DB directory. Check the build script and update if necessary where it will be copying the build to.


1. Find the Bounty you're after or create a new entry.

The bounty 'profiles' so to speak are located in the file. Game\Quests\BountyDataFactory.cs

Most of them are defined fairly simply. An entry looks like this

Code:
            // A2 - Clear the Eastern Channel (433005)
            Bounties.Add(new BountyData
            {
                QuestId = 433005,
                Act = Act.A2,
                WorldId = 433001,
                QuestType = BountyQuestType.ClearZone,
                Coroutines = new List<ISubroutine>
                    {
                        new EnterLevelAreaCoroutine (433005, 59486, 432997, 1037011047, 176007),
                        new EnterLevelAreaCoroutine (433005, 432997, 433001, 1037011048, 176007, true),
                        new ClearLevelAreaCoroutine (433005)
                    }
            });


  • There are quite a few so the best way is to search/find through the file using the Id or the name of the bounty you want.
  • There are many bounties that are commented out, this is almost always because they were bugged and failing a lot.

Note: Some bounties you might not be able to find because they are created as a 'DynamicBounty' which just means that parts of the bounty change every time you see them. These are listed by Id in the 'DynamicBountyDirectory' at the top of BountyDataFactory.cs. There are four bounties currently using this system, they are: CursedShrines, BoundShaman, BlackKingsLegacy and PlagueOfBurrowers. Essentially they are run from a generic template that can handle the variable aspects.

Note: you can dump all quests to find quest-ids by having DB open and pressing CTRL+5 while the Diablo3 window has focus. The info will show up in the DB log window.

2. Editing a Bounty

The Coroutines property contains the logic that will get run while on the bounty. The easiest way to put these together is use the buttons on the Adventurer tab in DB main window to generate them while walking yourself through completing the bounty manually.

For example this is making a bounty for "Kill Demonika the Wicked.'


  • Go to the bounty area "Tower of the Damned Level 1"
  • Go to Adventurer Tab,
  • Click "MoveToMapMarker" button.

Log Shows "new MoveToMapMarkerCoroutine(346230, 79401, 236772676),"
In this case it's a specific monster that needs to be killed, so the marker will take you to it.

Then the bounty also requires to kill X units in the level. So...

  • Click "ClearLevelArea" button.

Log Shows "new ClearLevelAreaCoroutine(346230),"

The final Bounty looks like this.

Code:
            // A3 - Kill Demonika the Wicked (346230)
            Bounties.Add(new BountyData
            {
                QuestId = 346230,
                Act = Act.A3,
                WorldId = 79401,
                QuestType = BountyQuestType.KillMonster,
                Coroutines = new List<ISubroutine>
                    {
                        new KillUniqueMonsterCoroutine (346230,79401, 220783, 236772676),
                        new ClearLevelAreaCoroutine (346230)
                    }
            });

Note: The button 'EnterLevelArea' will require that you be close to the portal before it will log the information.

Regarding Waypoints:


In most cases the waypoint is figured out automagically, if it's not getting it correct. You can add a property "WaypointLevelAreaId" with the levelAreaId after using the waypoint from the map. This method allows the waypoint numbers to change whenever a new area is added or moved without having to update hundreds of hardcoded waypoint numbers.


3. Testing a Bounty

You will need to make sure that the bounty is working by running it many times and watching the bot. To do that, add the questId to a profile with a RunBounty tag. This lets you keep recreating games and run only the specific bounties you want.

Code:
<Profile>
  <Name>Adventurer Specific Bounty</Name>
  <KillMonsters>True</KillMonsters>
  <PickupLoot>True</PickupLoot>
  <GameParams act="OpenWorld" resumeFromSave="False" isPrivate="True" numGames="1" />
  <Order>
	<RunBounty questId="359116"/>
	<RunBounty questId="448270"/>
	<RunBounty questId="346184"/>
    <LeaveGame reason="Done"/>
  </Order>
</Profile>
 
Hey xzjv!

Man, very nice and instructive topic! Congrats for that!!!

Firstly, I am new into botting and specially into anything related to I.T. (though I have really good logical skills), so forgive me if I ask obvious or ridiculous questions. Secondly, english isn't my first language, so again forgive me any mistakes.

As I read this topic I got inspired to learn on how to configure a coroutine, since my bot can't run ACT V effectively. I just tried to write the code and see if I got it right.

My goal is to "fix" the unsupported bounties. The one that I chose to test was the [Adventurer] Unsupported bounty: 359911 - Bounty: Treasure Room. Mainly I have to find 3 nephalem switchs and open a resp. chest. Is it possible to make the bot run this event or is it unsopported exactly because it can't be fixed?

Anyway, I tried to do as instructed and I came up with a code. Could you please review it and tell me if I'm on the right way? I still haven't tried to test it (for me it will be the next step after I learn how to code the routine).

// A5 - Bounty: Treasure Room (359911)
Bounties.Add(new BountyData
{
QuestId = 359911,
Act = Act.A5,
WorldId = 283552, // Enter the final worldId here (I'm confused here. What do I actually have to put here? The ID of the last map that I have to go or the first one that I teleport to?? For example, I am on Pand Fortress 2 and i gotta go to the third level. Which ID do I have to put? Lvl 2 (Current Level Area 271271) or Lvl 3 (Current Level Area 349787)
QuestType = BountyQuestType.SpecialEvent,
Coroutines = new List<ISubroutine>
{
// x1_Catacombs_Nephalem_Event_Switch (368515) Distance: 38.87638

// Should I repeat the line below three times (for 3 switches)?

new MoveToActorCoroutine(359911, 283552, 368515),
new InteractWithGizmoCoroutine(359911, 283552, 368515, 0, 5),

// x1_Catacombs_chest_rare_treasureRoom (356908) Distance: 15.66636

new MoveToActorCoroutine(359911, 283552, 356908),
new InteractWithGizmoCoroutine(359911, 283552, 356908, 0, 5),
}
});

I wanna try to help the community as much as I can!

Thanks!!
 
Last edited:
In worldid u should write id of world where u completed bounty.
A5 - Bounty: Treasure Room (359911) is bugged cuz trinity(?) tries to open locked door and just stucks. Maybe it can be blacklisted but i think all doors in this catacombs have same ids.

And biggest problem in A5 is kill malthael, cuz this bounty appears like 50% of time.
 
Last edited:
AFAICT the WorldId should be the last map in the bounty where you actually do the objectives. To navigate through multiple levels it looks like you use EnterLevelAreaCoroutine with the info from the EnterLevelArea button after finding each portal.
 
I am trying to fix some bounties also. After watching the bot I can say that many problems seem to be from trinity. Often the bot simply ignores the bounty waypoint, I even saw him pass 10ft from the bounty entrance and leave the area. Another problem is with bounties where you need to clear an area. The bot ignores the clear area timer, leaves the area to kill npcs that are not involved in the bounties and never return. Will try to document these with logs and better descriptions.
 
Is it possible to make the bot run this event or is it unsopported exactly because it can't be fixed?

Some are more complicated than others, I tried to fix a bunch of them when i took over that were previously attempted and commented out by TB. Some (most?) of these ended up having strange issues that prevented them from working. There's a fine line with fixing vs blacklisting because if you blacklist too many then it sits there restarting the act for ages wasting time trying to find a good set.

For example there's one in A2 where you have to find a scene in Dulgur Oasis with some stones you need to interact with or whatever. The bot could find the scene but was unable to get a path properly to get inside of it, he'd sit at the bottom of the area when the entrance was around the other side. That sort of thing requires changes to the coroutines or new coroutines written to be written to increase the situations we can handle. In this case, the ability to walk around a scene to a specific spot.

Another example is Maltheal someone mentioned, the main problem is navigating the Death Gates when trying to find him. DB cannot figure out a path properly through death gates. There is some code in Adventurer to handle it and it appears to have bugs; or maybe Trinity is doing something to get in the way; its also a problem in rifts when they appear some times. I'll need to spend some time and figure it out at some point.
 
Last edited:
What to do with changes? How do we submit the changes so they're added to Adventurer?
 
thanks for this post. i was just thinking about to study the lines and fix some of the bounties.

one more thing though. Wouldn't it be nice if we could all share our own fixed bounties here?
 
after spending hours of watching bot doing act V bounties. i think the navigation system and death gate are the issues that cause act v to fail. especially death gate. i'd say 75% of bounties with death gate would fail, because bot would just sit at corner and wait for inactivity to kick in.
 
Thanks so much for this guide. I am a complete noob with programing, but I find this pretty easy to follow. I have cleared up a few bounties so far.

I noticed the same things on deathgates. I also noticed though that I had a goblin it was trying to go kamikaze on, so I put that to normal. It seemed to progress at that point. Then I noticed it getting stuck in a viscous deathgate loop of sorts. It kept running back and forth. Anything in Pademonium seems like its a no go till the function with deathgates is fixed. If there is something I could change on my end, please let me know. Would love to be able to do act 5 bounties while I "zzzzz".

edit: Quick question, on Act V Kill Urzael, I changed it to this:

// A5 - Bounty: Kill Urzael (359919)
Bounties.Add(new BountyData
{
QuestId = 359919,
Act = Act.A5,
WorldId = 308446, // Enter the final worldId here
QuestType = BountyQuestType.KillBossBounty,
//WaypointNumber = 52,
Coroutines = new List<ISubroutine>
{
new EnterLevelAreaCoroutine(263494, 308446, -1689330047, 367633),
new ClearLevelAreaCoroutine(263494),
}
});

and removed 359919 which was in ClearLevelAreaCoroutine and EnterLevelAreaCoroutine. This seemed to fix my problem on this bounty for instance, but not sure why exactly. The logic behind me removing it/changing it was because it was trying to move down to another location that was blocked. It just stood there dying to Urzael. So, I removed the first set of numbers, which looked like it was the last place it visits, and changed it to the number before that in EnterLevelAreaCoroutine and replaced the same number in ClearLevelAreaCoroutine. Am I right in my thinking here? Or did I just get lucky?
 
Last edited:
seems this bounty is wrong.
it is fly to antother place.

plz check it .

// A2 - Bounty: Kill Bonesplinter (346034)
Bounties.Add(new BountyData
{
QuestId = 346034,
Act = Act.A2,
WorldId = 70885, // Enter the final worldId here
QuestType = BountyQuestType.KillMonster,
Coroutines = new List<ISubroutine>
{
new MoveToMapMarkerCoroutine(346034, 70885, 1417206738),
new MoveToPositionCoroutine(70885, new Vector3(1197, 1293, 184)),
new ClearLevelAreaCoroutine(346034),
}
});
 
i check the waynumber.
the right one is 23

but the wrong one is 22.

but after i mod it and click start.

game restart..
 
Back
Top