Now for the fun stuff! Quest objectives are the criteria that must be satisfied in order to let your player complete the quest. Each quest can have multiple objectives. You can also have no objectives if you want to control the quest state externally. If you just want a quest to have no objectives, but auto complete as soon as you pick it up, what you really should use is the Quest Events, and bind your event to the In Progress quest state.
Quest Objectives are tracked using the Quest Tracking UI and the Quest Log. Objective data also has the ability to save objective progress (if you tell it to), take a look at the Collect & Defeat examples.
Each quest objective in the Quest Data Table also gives you a text field to use as the label to describe the objective.
Create your own Objectives
Navigate to the Blueprints/QuestObjectives folder, and make a child of the AC_QuestObjective actor component.
There are 3 events, and 2 functions you need to override to create your own objective:
Objective Global Variables
The following global variables are available for all objectives, to use them you would pass the variable and your value through the Quest’s ObjectiveData field:
Included Quest Objectives
Travel Objective (AC_QuestObjective_Travel)
This objective can be used when you want the player to travel to an actor in your world. This objective requires the tag key, the value should be a tag that also appears on the object actor in your world.
The travel objective also requires the radius key, which is a float value used to set the radius of the Sphere Collision used to detect that the player is close enough to the objective actor. This value is in unreal units (cm).
The How to Make a Quest chapter of this documentation will walk you through creating a quest using this objective type.
Collect Objective (AC_QuestObjective_Collect)
This objective can be used when you want the player to collect items in your world by pressing E when they are near them. This objective is expecting the tag key, as well as a count key, which is an integer, of the total number of items with the tag the player must collect. Upon collecting an item, the actor is destroyed.
Interact Objective (AC_QuestObjective_Interact)
This objective can be used when you want the player to interact with a single actor in your world by pressing E when they are next to it. This objective requires the tag key, and you can optionally provide a secondary tag called cutscene that will play a Level Sequence in your world with an Actor Tag containing this value, upon interacting with the target.
Defeat Objective (AC_QuestObjective_Defeat)
This objective works a lot like the collect objective, requiring the tag key, as well as a count of the required targets to be defeated. The key difference is how this objective criteria is satisfied. This objective spawns an actor that will attach to targets, and when it detects them being destroyed it will mark the objective complete.
To simulate defeating actors in our demo world we have attached an attack function to our right click through our PlayerController. This function applies damage to nearby actors. Our example actor Blueprints/QuestObjectives/Defeat/ BP_QuestObjective_DefeatPawnSample only purpose is to detect receiving the damage, and then destroys itself.
The defeat objective’s indicator is what is tracking and handling the event when it detects that its target is destroyed.
Inventory Objective (AC_QuestObjective_Inventory)
This objective gives you a place to integrate your inventory and item systems if you wish to have a quest objective that requires the player to hand items over to an actor in your world.
When the quest window builds, it will check to see if this objective exists, if it does it will add a special button to the quest window that lets the player give the items through it. When this button is clicked on the UI it will then connect back to this objective component to check and make sure the items are in your inventory. If they are, it will then complete the quest and tell the component to take the items.
All the points of entry related to items and inventory are placeholders for you to integrate your item system into. This quest system does not include an Inventory and Item system, but if you need one I do have one available on the marketplace.
This objective will use the key and values in the QuestData variable as your ItemRowName (key) and the required quantity (value). The checkInventory function will iterate through all of these key value pairs and run the getInventoryItemQuantity function against them. If you need to use the QuestData for anything else you will need to add logic to your getInventoryItemQuantity to ignore the tags you are using for non-inventory requirements.
Before you can use this objective you must edit the functions getInventoryItemQuantity and takeInventory to work with your systems.
The QuantityTester variable is only used in the demo world to debug testing this feature without an inventory system, you can safely remove this variable once you integrate your system. In our demo world this variable is set by the button that appears when you accept the repeatable quest on the black platform.
This objective will not be completed until the objects are handed to the actor through the quest window.
If you want to make a quest objective that completes when the items are found in your inventory this is logic you will have to write in based on your inventory system.

Please be warned though that you will need to actively monitor your inventory either through timers or events. You also need to be able to account for the objective being marked as completed, then the player removing items from their inventory before they are turned in. This is a big can of worms, and marking the criteria on complete when the player turns over the items was the easiest implementation of this that is both effective, but also low overhead.
One thing you might still want to do is spawn a quest objective indicator over the NPC you turn the items into. By default one will not be spawned, because with this objective I am really just creating you the starting points and I am not trying to assume too much about how your inventory system might work. Take a look at the interact, collect and defeat objectives if you want to see how spawning the objective indicator logic works, it should be easy to adapt to this inventory objective.