Guide updated on 04/06/2019
I have made a new quest builder to help simplify this process. It uses the DOLToolbox which some of you may be familiar with. The link to it can be found here - DOLToolbox with reward quest builder
Or you can view and compile the open source for this at Los Ojos DOLToolbox fork You will need the latest version of the 1.124 repo for this to work.
This is a guide to create reward type quests similar to that on Live. This is only relative to my 1.124 repo and has been updated to reflect the latest version available of the repo so please have that before starting. The quest system is a work in process but currently supports several features.
A few of the features can be seen in the picture above such as quest goals, quest targets on the map, mulitple rewards, and quest items in journal.
In this guide I will go over the database table stucture and give an example quest.
Upon running the repo with your database, a few new tables will be created. 'DataQuestRewardQuest' - holds all the relevant data for the quest, and 'CharacterXDQRewardQ' which
holds the current goals and progress of a particular quest for a player.
If you are familiar with the dataquest table on offical DOL repo, you will notice alot of similarities here and many of the columns take the same input. Important note: If a field can be left blank, do not type 'null' yourself. Either leave it blank, or let your database editor enter the null field.
ID - unique auto generated number given to a quest.
QuestName - The name of the quest, to be displayed in the journal and quest offer/finish window.
StartNPC - The start name of the NPC who the player begins the quest with. Case sensitive.
StartRegionID - The region number the start NPC is in. (RegionID and ZoneID is not always the same)
StoryText - The initial text displayed in the 'offer' window when a player tries to begin the quest. This supports personalized text such as <Player>, <Class>, and <Race>.
Summary - The summary of the quest 'story' Will be displayed at the bottom of the quest offer window. This is also the text shown in the journal.
QuestGoals - Quest goals for the quest. This is the text that will be displayed in the journal for the goal, followed by a ; and the step number for when this goal is given. Each further goal is separated by a single pipe |.
If multiple goals are given the same step number they will be available at the same time. The last goal must be Interact Finish goaltype and must be the last step in the quest.
For example, if a quest had 4 goals - two for step 1, one for step 2, and one for the final step 3. The format would be:
Kill 3 bandit hopefuls;1|Kill 3 bandit recruits;1|Kill the bandit Leader;2|Return to Sir Jerem for your reward;3
GoalType - The goal type, in consecutive order, separated by a single pipe | Goal types currently supported are 3 - kill target goal, 4 - interact goal, 5 - interact finish goal, and 6 - interact deliver goal. Every quest MUST end with an interact finish goal type.
Following the example above it would be as follows: 3|3|3|5
GoalRepeatNo - How many times a goal must be repeated until its achieved. Must be set for each goal, separated by a single pipe | For example, if it was set to 3, then the journal would say 0/3 when the quest begins. Interact goals should ALWAYS be set to 1.
Following the example above it would be as follows: 3|3|1|5
GoalTargetName - The goal targets name, case sensitive, separated by a single pipe |. Following the example above it would be as follows: bandit hopeful|bandit recruit|bandit leader|Sir Jerem
GoalTargetText - Text that can be displayed for an 'interact' goal. 'Interact finish' goal text is done elsewhere. Can be left blank, but if its used then single pipes | need to be entered for each goal so it can be parsed correctly. For example, a 3 goal quest that is
a kill goal, interact goal with text, and then an interact finish goal would be entered as: pipe for kill goal -> |some text here to display on interact| <- pipe for interact finish goal
StepCount - The total number of steps in the quest. (Not the number of goals) Using the example above which has 4 goals, but only 3 steps. So this value would be 3
FinishName - The NPC the player interact finishes with, case sensitive. Always required for these reward quests.
AdvanceText - Not used, leave blank. Placeholder for now.
CollectItemTemplate - Used to display and item in the journal window when a player completes a step. Can be left blank. The items model icon will be shown, so its basically a dummy item for asthetics. If the goaltype is 6 - InteractDeliver the dummy icon will be in the journal as soon as
the goal is given to the player. For example, if a collect item was needed on the 3rd goal of a 4 goal quest the format would be as follows: ||bandit_ear|. So there is 2 pipes for the first two steps, followed by the item id_nb, followed by another pipe for the 4th step.
Eventually I will add support for these items to be used in special ways for quest steps. (A packet is sent when the item icon is clicked).
MaxCount - Maximum times a player can complete the quest.
MinLevel - Minimum player level that quest is offered to player.
MaxLevel - Maximum player level that quest is offered to player.
RewardMoney - Money reward in copper given to player when quest is finished.
RewardXP - Experience given to player when quest is finished.
RewardCLXP - Champion experience given to player when quest is finished.
RewardRP - Realm points given to player when quest is finished.
RewardBP - Bounty points given to player when quest is finished.
OptionalRewardItemTemplates - Optional rewards offered to player when quest is finished. Can be left blank. The number of rewards that can be chosen to be entered first, followed by the items Id_nb, then separated by a single pipe |
For example, the option of 1 item from a choice of 3 would be: 1first_item|second_item|third_item
FinalRewardItemTemplates - Item rewards for completing the quest. Item's Id_nb is used, using a single pipe | multiple rewards.
FinishText - The test displayed in the quest finish window. Shown on the 'interact finish' goal. Every quest ends with this goal. This is how the player receives their rewards. This cannot be blank/null
QuestDependency - Quests that must be completed before this quest is offered to the player. This is the quest name, case sensitive. (I will probably change this to QuestID to make it simpler)
AllowClasses - Class ID this quest is offered to, separated by a single pipe | Leave blank for all classes allowed.
ClassType - The classtype used for loading custom scripting on certain goals, this will be explained in a separate tutorial. Can be left blank.
XOffSet - The 'X' co-ordinate from the /loc command for the goals location.(Do not use the /gloc command) This will be shown on the players map. Each goal should be done and separated by a single pipe |
YOffSet - The 'Y' co-ordinate from the /loc command for the goals location.
ZoneID - The zoneID for this goals /loc - Not the regionID. Separated by a single pipe |
Clear as mud? Ok now I will include an example quest to try and shed some more light onto this.
ID - 3
Name - Recruiting Nothing But Trouble
StartName - Rheda
StartRegionID - 1
StoryText - I remember what it was like to be a reckless youth. I think we all had our moments when we were younger. I try to tolerate the antics of out local mischievous youth the best I can. Adults that encourage that kind of behavior, however, really upsets me. Youth are impressionable by nature, and adults that take advantage of that need to be taught a lesson.
Take the bandits in the forest, for example. Most of them are a bunch of young thugs with nothing better to do, without an apprenticeship to keep them out of trouble. A few of them, though, are young adults who recruit the teens of our town, for the sole purpose of causing trouble. Just last week, some of them vandalized the rear of Elvar's smithy with brownie's blood. And, one of them stole one of my best swords!
Something needs to be done about them. I know Sir Dorian is coordinating efforts to flush them out of the forest; perhaps you can do something to help?
Summary - One of the bandit recruits still has Rheda's sword. Defeat bandit recruits until you find her sword. Return to Rheda in Cotswold once you find it.
QuestGoals - Defeat 3 bandit recruits;1|Defect 1 bandit recruiter;2|Return the stolen sword to Rheda in Cotswold;3
GoalType - 3|3|5
GoalRepeatNo - 3|1|1
GoalTargetName - bandit recruit|bandit recruiter|Rheda
GoalTargetText - (NULL)
StepCount - 3
FinishName - Rheda
AdvanceText - (NULL)
CollectItemTemplate - |rhedasword|
MaxCount - 1
MinLevel - 3
MaxLevel - 10
RewardMoney - 385
RewardXP - 550
RewardCLXP - (NULL)
RewardRP - (NULL)
RewardBP - (NULL)
OptionalRewardItemTemplates - 1recruits_short_sword|recruits_dirk|recruits_staff|recruits_club|recruits_mace
FinalRewardItemTemplates - (NULL)
FinishText - Ah hah! My sword! I guess this means you had an encounter with those bandits then? Well. I'm glad to see you relatively unscathed!\n\nHere is a reward as a token of my appreciation.\n\nGood day, <Player>!
QuestDependency - Dredge Up A Pledge
AllowClasses - (NULL)
ClassType - (NULL)
XOffSet - 14900|15700|11150
YOffSet - 19500|19300|27360
ZoneID - 0|0|0