Behavior Override Guide
Sometimes the information provided in the WoW Questlog is insufficient for QuestBotAlternative to figure out what to do.
The behavior overrides are your primary method to tell it what to do.
- Behavior Overrides are .xml files placed into the Bots/QuestBotAlternative/BehaviorOverride directory, in any subdirectory structure and filenames you like.
Any .xml files are found and used to change QBA's behavior (ie, the filenames don't matter).
- The behavior file updates & modifies the quest information with its own details.
If a quest objective already has the correct ID, Hotspots or any other detail, then there's no need to include that in the behavior file.
- The file is parsed by the C# LINQ XML parser, so the format needs to be valid.
Example Behavior File:
<BehaviorOverride>
<Quest id="26956" name="I Ain't Sayin' You a Gourd-Digger..." > <Objectives> <Objective index="0" ID="205054" type="CollectItem" /><!-- was 44489 --> <Objective index="1" ID="205053" type="CollectItem" /><!-- was 44488 --> <Objective index="2" ID="205052" type="CollectItem" /><!-- was 44487 --> </Objectives> </Quest> </BehaviorOverride>
<BehaviorOverride>
<Quest id="26956" />
</BehaviorOverride>
Override Guide With Pretty Pictures!
My character kept standing at range, trying to use a quest item, when she should have moved up to interact range and simply clicked on the target.
1. Stop the bot!2. Gather information about the quest.
2a. Using the HB developer's tools, I checked the entry id of the target we were supposed to heal (it was 50047).
2b. I noticed that we should only heal those that are sparkling, so thought I should add that to the quest details too (the aura id was 93096).
3. Next I went to the HB logfile to help me create a Behavior Override file, I searched for "Fear No Evil" (including the quotes), but I noticed the result I found was corrupt (this happens when HB is slow at reading the details from WoW's memory).
4. So I kept searching and found a proper example shortly afterwards:
5. I created a new Behavior Override file, and named it appropriately.
HonorBuddy/Bots/QuestBotAlternative/BehaviorOverride/Elwyn Forest/28812 - Fear No Evil.xml
(the name doesn't actually matter, but it is good to keep things organized)6. I copied the sample xml into the file, and removed everything unnecessary:6a. First I started with this:
6b. The override only needs to keep things that we want to change. We don't need to change the Starting Item Id (aka, quest item), Area Id, target ID, Type, Count, any of the AreaPoints, nor the Handin Location. So lets remove it all!
6c. So we end up with:
7. I checked the list of Behavior Handlers, and modified the file to force it to use the Interact handler, then hit save.
8. Then Tested it.
Complete Behavior File:
<BehaviorOverride>
<Quest id="..." name="..." StartingItemId="..." area_id="..." IsCompleted="False" action="..." >
<Objectives action="..."><Objective index="0" ID="..." type="..." count="..." handler="..." handler_options="...,sequence=1" IgnoreCombat="False" DuringCombat="False" PersistCombat="False" Interruptible="False" conditions="..." OnTaxi="False" >
<AreaPoints action="...">
<Hotspot X="..." Y="..." Z="..." />...etc...
<Hotspot X="..." Y="..." Z="..." />
</AreaPoints>
</Objective>
<Objective index="2" ID="..." type="..." count="..." handler="..." handler_options="...,sequence=2" IgnoreCombat="False" DuringCombat="False" PersistCombat="False" Interruptible="False" conditions="..." OnTaxi="False" ><AreaPoints action="...">
<Hotspot X="..." Y="..." Z="..." />
...etc...
<Hotspot X="..." Y="..." Z="..." />
</AreaPoints>
</Objective>
...
<Objective index="n" ID="..." type="..." count="..." handler="..." handler_options="...,sequence=3" IgnoreCombat="False" DuringCombat="False" PersistCombat="False" Interruptible="False" conditions="..." OnTaxi="False" ><AreaPoints action="...">
<Hotspot X="..." Y="..." Z="..." />
...etc...
<Hotspot X="..." Y="..." Z="..." />
</AreaPoints>
</Objective>
</Objectives>
<HandinLocation check_objectives="False" handler="...">
<Hotspot X="..." Y="..." Z="..." />
<Item entry="..." />
</HandinLocation>
</Quest>
</BehaviorOverride>
<Quest> | |||
id | required (uint) |
this id specifies which quest the override is for it matches wow's internal quest ids, and also matcheswebsites like http://www.wowhead.com/quest=26956 multiple ids can be provided in a comma separated list (id="1234,1235,1236") |
|
name | ignored, but recommended (string) |
simply to make reading the behavior file easier | |
StartingItemId | ignored (uint) |
this is the id of the item relating to the quest informative purposes only |
|
area_id | optional (uint) |
the id of the zone the quest is for | |
action | optional (string) |
action="blacklist" to completely blacklist a quest. this quest doesn't exist to QuestBotAlternative. condition handlers like QuestsLeftInAreaId won't even know it exists in your questlog (Conditions) note, that if you blacklist a completed quest and QuestBotAlternative comes across the quest handin it will still try to hand it in, and may get very confused thinking its a pickup quest instead. |
<Objectives> | |||
action | optional (string) |
normally objectives are matched against their index id. if the index id doesn't exist a new fake objective is created. action="replace" allows you to delete Blizzard's objectives and completely replace them with your own instead. usually this is used as a last resort before flipping the table and blacklisting a quest. note: if you match the original quest index id's, your fake objectives will still be marked complete when the real objective would have been. normally you would want this to happen, but if you don't you should use different index numbers that didn't exist to begin with, start at 5 or something. |
<Objective> | |||
index | required (uint) |
this index id specifies which objective's details you wish to override where possible, Blizzard's quest index is used, however there are cases where their index is not unique objective completedness is sent and stored separately, using the index also. so you should do your best to match your override objective details to Blizzard's index (note how the ID's in the example above aren't in order because of this fact) if you specify an index that doesn't exist a new fake objective is added to the quest. note - this objective will never be automatically marked complete. hint: see conditions. |
|
ID | required (most of the time) (uint) |
most quest objectives involve an ID (aka entry) in some way. ID represents the id of an item to pickup, the id of an object to interact with, the id of a mob to kill or loot, the id of a game object to click on .... etc. in most cases the ID needs to be found in the game world (you can use the HB developer tools to find them). if it matches something you're carrying the objective will probably be ignored. Multiple IDs can be supplied to match multiple targets at once. Separated by a comma. eg: <objective ... ID="1234,1235,1236,1239" handler="Kill"> |
|
type | optional (string) |
see Quest Objective Types type matches Blizzard's/HB's quest objective type. when handlers are asked if they can help do this quest they usually refer to the objective type first. unfortunately Blizzard almost always sets this to KillMob or CollectItem, so it is largely useless. |
|
count | optional (uint) |
count allows overriding the quest objective's count for situations where you need to change X in pickup X food or kill X mobs, etc. | |
handler | optional (string) |
see Behavior Handlers the handler option allows you to force an objective to be handled by a specific handler, instead of chosen automatically this is very powerful and allows you to force QuestBotAlternative to handle quests in whichever specific way you require note, the handler still has to agree that it can do the objective. see Behavior Handlers and specifically each handlers requirements |
|
handler_options | optional (string) |
see Behavior Handlers some handlers allow you to set options to modify their behavior when handling this quest objective. the sequence=n option is available with all objectives (even if you didn't force a handler). It adds an extra condition to the objective so that it won't be considered until the previous sequence has been handled. |
|
auraId | optional (uint) |
several handlers act only if a certain auraId exists on you or the target (depending on context) but you probably want to use conditions instead |
|
IgnoreCombat | optional (bool) |
any queue entries currently getting processed for this quest objective will ignore combat completely. temporarily disables your CC (dangerous! you could die!) the handler will almost always set this for you if it is necessary. suggest you probably only ever need this except in few very special circumstances. |
|
DuringCombat | optional (bool) |
combat usually blocks any queue entries from running. this option means the queue entries will get processed during combat, even while your CC is getting run the handler will almost always set this for you if it is necessary. suggest you probably only ever need this except in few very special circumstances. |
|
PersistCombat | optional (bool) |
normally any combat will clear the queue (except for IgnoreCombat and DuringCombat), and your CC will take over. this option allows any queue items created for this objective to resume after CC. the handler will almost always set this for you if it is necessary. suggest you probably only ever need this except in few very special circumstances. |
|
Interruptible | optional (bool) |
normally nothing else (except combat) is done until the queue is empty. this option allows any queue items created for this objective to be replaced if other nearby stuff to do is found. the handler will almost always set this for you if it is necessary. suggest you probably only ever need this except in few very special circumstances. |
|
conditions | optional (string) |
see Conditions this <Objective> will be completely ignored if your conditions don't evaluate to be true. can be used to process objectives with prerequisites, or in order, or only once you have a buff, or any number of options. conditions are very powerful, but potentially very costly. the cpu power required to process each condition is quite high, so don't use them if you don't have to. |
|
OnTaxi | optional (bool) |
Honorbuddy normally does nothing whilst on a taxi, but a few rare quests require you to drop bombs/etc while flying on a taxi mount. OnTaxi objectives are only checked while on a taxi, never otherwise. Also, all other objectives are ignored while on a taxi. |
<AreaPoints> | |||
action | optional (string) |
AreaPoints represent those blue areas on the map where you go to do this quest. normally behavior override AreaPoint Hotspots are added to the objective's already existing Hotspots, action="replace" can be used to replace them instead. |
<Hotspot> | |||
XYZ | required | Hotspots match HonorBuddy's Hotspot xml format. Hint: in the developer tool double click on your current location hotspot, it will add the hotspot to the HB log window, and you can easily copy paste from there. |
<HandinLocation> | |||
handler | optional (string) |
normally quest handin is trivial, but in some cases you may need to use a handler to do a special action for you. a example of this is when the quest giver has a gopssip option before he lets you hand in a quest. handler="NPCGossip" will fix that. |
|
check_objectives | optional (bool) |
normally quest handin is trivial, but in some very rare circumstances you want QuestBotAlternative to check over the objectives (and as such look for a handler) to be able to handin a quest. |
<Hotspot> | |||
XYZ | required | Hotspots match HonorBuddy's Hotspot xml format. Hint: in the developer tool double click on your current location hotspot, it will add the hotspot to the HB log window, and you can easily copy paste from there. |
<Item> | |||
entry |
required (uint) |
entry represents the id of an item used to handin a quest. often this is an item you click to summon a quest giver who spawns right next to you. once summoned QuestBotAlternative automatically detects their presence and hands in / picks up any available quests. |
- The mixed case and weird naming convention is messy and will be fixed one day. Has happened because some of the parameters match Blizzard's name for the attribute, some match the names in HonorBuddy, and some match mine. Conveniently, each of these use a different naming convention.
Making Your Own:
Comments are disabled for this space. In order to enable comments, Messages tool must be added to project.
You can add Messages tool from Tools section on the Admin tab.