Before you can make a quest you need to first integrate this asset into your project. If you have not completed the quick setup guide please complete that before continuing to this part.
Step by step make a quest video tutorial:

Notice: The video above is a different tutorial then the text below.
Let's make another quest, a deeper breakdown.
There are two parts to making a quest. The first part involves adding our data to our data table. The second part involves tagging our actors in our level that we will use as starting point, end point, and objectives for our quest. We are going to be bouncing back and forth between both parts as we go through this.
To get started navigate to the Blueprints/Variables/DataTable folder and open up DT_Quests. As you can see there is a lot to work with here, but keep in mind not everything is required, in fact most of it is optional.
The rows you see in this data table already are the ones for my demo levels. You can clear all of those out, or leave them there as a reference.
RowName
To create a new quest, we need to first create a new row in this data table. Click the + Add button on the toolbar to create a new row. Pick a name for your row. Each row name must be unique. This is the identifier the system will use when referencing your quest throughout this asset.
For my example I am using the row name my_first_quest since it is unique and easy to remember. It is good to keep it simple, because when we come back in a few months to add or fix something we will be able to get around a lot quicker knowing what exactly we are referencing.
QuestType
Next select a QuestType, to get you started I have included a Main Story Quest, Side Quest, and Repeatable Quest types. To make your own, or to edit these visit the Quest Types Documentation.
The key differences between the included quest types is mostly visual. The Quest Indicators, and Quest Window color theme. The repeatable quest has the additional functionality added to it, to handle making the quest available again once it is finished.
For this tutorial I am going to leave it on the Main Story Quest type which uses the most traditional gold looking coloring to the indicator and quest window.
Level Name
This is the level our quest starts in, make sure it matches your level name, it is not case sensitive. If you change your level name you will want to update this value.
We use this field mostly as a way to optimize, so we don’t have to work with every quest in our table every time we do something involving iterating through them all. If you find yourself changing level names a lot you may want to adjust the code to use a switch, select or map to handle linking your string in this field to the correct level in your game.
If your quest starts in one level, and turns in or has objectives in another level you will also want to enable the CrossLevelQuest boolean. You can learn more about this variable in the Cross Level Quests chapter.
StartAtActorTag & CompleteAtActorTag
The two ActorTag variables are how you will tell the quest system where the quest can be started at, and where it can be completed at. You can have multiple starting points, and multiple ending points for each quest. You can also have multiple quests on one actor.
Place an actor in your world, it can be any type of actor, or even just a static mesh. Then on the details panel add an Actor Tag, this is where we want to start our quest at, so I am going to call mine my_first_quest-start. Make sure you name it something nice and easy that way in the future you can easily identify what it is for. Now set this value as the StartAtActorTag in the field on your data table.
I want my quest starter to also be the turn in location, so to do that we can reuse the tag we just used, or simply add another tag. I like to use a unique tag for pickup and turnin so I am going to add another tag to my actor, this time I am calling it my_first_quest-turnin. That way if I decide to add another actor later as the turn in point, I can just deal with the tags without having to change anything in the Data Table.
Set the CompleteAtActorTag field on our data table to this value as well.
Let’s test it out, go ahead and start your game. You should see a quest available indicator over top of your actor. If you do not see it, pause here, and resolve the issue before continuing. If you see it you should be able to walk up to and press E to interact with the actor to show the quest window. You should also be able to accept the quest, but you will not be able to complete it just yet since we have not added any objectives to it yet.
If your quest indicator is lopsided, it is because it is orienting itself to the transform of your actor by default, so if your actor is rotated a weird way, the indicator will follow. Some people might like it this way, but if you want to adjust yours, you will need to do an extra step, see the Tweaking Scale, Rotation, and Offset section of the Quest Indicator documentation to learn how to adjust it.
Prerequisites
You can have other quests as prerequisites (to make quest chains) as well as create your own numeric conditions for integration with your own game, such as player level.
You will need multiple quests (or other custom logic) before you can use this part of the system. To learn everything you need to know about quest prequisites visit the Quest Prerequisites chapter of this documentation.
The included demo world also uses quest prerequisites for the Main Story / Timmy quest line.
QuestRewards
For rewards, we have a number of options, and I have created some easy to use tap in points for each one, so you can easily integrate your own item and xp systems.
For this first quest I am going to give the player 1,000 experience points, and 50 gold upon completing it, just so we have something nice to look at in our quest window and quest log. You can also add guaranteed item rewards, as well as options for the player to choose a single reward. You can learn more about all types of rewards and how to integrate them with your game in the QuestRewards section of this documentation.
Texts
This is where we store all the text related to this quest. Each quest has a QuestTitle which is shown in many different places in the UI. There is also a ShortDescription which is shown on the quest log as an extra helper, the LongDescription which is where the bulk of your quest text should go, and finally the StateMessages.
Quest StateMessages let you define a custom text message that is shown based on the current state of the quest. In the UI state messages are used as a form of dialogue from the actor the player is interacting with (whatever spawned the quest window).
StateMessages are only visible if the indicator is set up to show for that specific state. By default that includes, available, in progress, ready to turn in, and failed. The QuestStates chapter will go over how to change this.
Objectives
This is how we define what we want our player to do in order to be able to satisfy the requirements of the quest. Each quest can have multiple objectives, and your progress for each is saved in the provided examples.
Each objective has a QuestHandler (which is a child of the AC_QuestObjective component) and a a string to string map for your key / value data. This was designed this way so you can create your own objectives. The examples I have included should be enough to cover some of the most common types.
For this example let’s keep it simple and just make the player travel to a distance near an actor in our world. Decide what actor you want to use as your objective and drop it in your world if it is not already there.
Next, return to the data table and create a new objective on our quest. Select the AC_QuestObjective_Travel component. The Travel component has 2 required variables tag & radius.
The first, tag, is how we identify in our world what actor we are using as our objective. The other, radius, is the maximum distance we must be from that actor for it to mark the objective as complete.
We use the ObjectiveData variable to feed these variables and values into our Travel component. Go ahead and add 2 elements to your ObjectiveData map, for the first enter the key as tag, and for its value come up with a tag that you will place on the actor in your level, for mine I am going with my_first_quest-objective because it is easy to recognize what it is for from just looking at the actor list.
For the second element in the ObjectiveData map add the key radius, with the value of let’s say 500. This value is in centimeters and comes out to 5 meters in unreal units.
Go ahead and add the tag you entered in the data table as an Actor Tag on your actor in your world. I went with my_first_quest-objective for mine so I am now adding it to the actor, with the exact same name.
Let’s also go ahead and test it out.
Now you should already have the quest in progress, since on our last test we accepted the quest. This is because my quest system has quest state and objective saving built into it. I’ll show you how to restart finished quests at the end of this tutorial, but for now you can go ahead and just drop this quest from our quest log since it is in progress. By default the quest log is bound to L, go ahead and open it up and click the drop button.
After dropping the quest we should see the indicator reappear on our quest giver. Go ahead and pick the quest back up, then run to your new actor that you are using as your objective. The quest objective should complete when you move within your radius of the actor, and since this is currently our only objective the quest state should shift to Ready to Turn In, and you should see the turn in indicator on the actors we defined with our CompleteAtActorTag. Go ahead and turn the quest in to complete it.
If you are standing within the radius when you accept the quest, you will need to run out of it, then run back in for it to trigger. This is something you will want to keep in mind when setting the value of your radius in the data table. Ther radius you enter is being applied to the sphere radius of a sphere collision, the overlap event of this sphere collision is what triggers the objective to complete.
You can add multiple objectives for quests, and I’ve included a number of examples to help you get started. Included are examples for traveling to, interacting with, picking up, defeating, and giving items.
Keep in mind objectives are not intended to be replacement for quest chains. You should not map out your entire main story quest in one quest with 100 objectives. Instead you should be creating multiple quests, that each have a prerequisite of the previous, and has its own related objectives. Keep it simple, the player likes to feel the progression, completing quests is like candy to the brain… give them the opportunity to complete many instead of just a few big ones.
Visit the Quest Objectives chapter in this documentation to learn everything about quest objectives using my system.
Although our sample quest is complete, there is still a little bit more to cover.
OnStateChange
The OnStateChange variable on the data table is a very powerful tool that can be used to add in your own logic when a quest shifts from one state to another. For my system I am calling these QuestEvents, and I’ve included a couple examples of events to get you started, such as giving a quest item, playing a cutscene, spawning, and destroying actors in the world.
You can also make these onStateChange events re-trigger on begin play, which is something you may need if you create an event that opens up a door the player needs to travel through.
If the player’s game restarts, and they come back in, they are going to expect that door to still be open, if it isn’t they will be stuck. Retriggering on state change events is very easy to do, and you can learn all about it, and all the other fun stuff related to Quest Events in that section of the documentation.
OnDropQuest
The OnDropQuest variable is how you can undo events performed by your onStateChange variable when the player decides to drop a quest from the Quest Log.
For example, you may want to use this to remove a quest item you gave to the player when they accepted the quest, or perhaps close a door you opened when they started the quest.
CrossLevelQuest
If your quest starts in one level, and turns in or has objectives in another level you will also want to enable the CrossLevelQuest boolean. You can learn more about this variable in the Cross Level Quests chapter.
Resetting a Quest State after Completion
By this point you should have completed your first quest, if you want to test it again after adding more objectives to it you will need to reset the state of the quest.
You are going to most likely want to create some debug key bindings to cycle the state of the quests. You can see how this works by examining the push button logic on the quest state tester in my demo world. You can use this logic to change any quest to any state, even if you are in the middle of a quest chain and just want to retest the current part.
Restarting All Quests
In my demo level I also have a button you can step on which will rest all the quests in the game for you. You can use this button in your level as a debug tool if you really want, but the logic behind this is just calling the ResetPlayerQuestStates function on the AC_Quest_PlayerState component.
If you want to make a keybinding to do the reset I suggest adding it to your AC_Quest_PlayerController Key Bindings event graph. This component has a reference to the player state quest component in it and ready to go, you just need to add a key binding, then hit that function.
Now whenever you press this keybinding, or step on this button it will reset all of your quest states, giving you an easy way to try them all again without having to mess with save game files on your filesystem.
One thing you will want to keep in mind when resetting quests this way is that it is only intended for debugging, this should not be function at runtime for your player. One thing resetting quests will not do is undo any logic in your level that may have occured during one of the events. The best way to reset this is to just restart the game after you reset the quest states.
There you have it, adding your first quest using my quest system. Keep in mind we are just scratching the surface here, there is much more to it, dive into the other chapters of this documentation to learn more, and if you have any questions or find any bugs please reach out and let me know.