Quest progression event

Announcements, support questions, and discussion for the Dialogue System.
Post Reply
User avatar
Haytam95
Posts: 23
Joined: Sun Mar 15, 2020 5:56 pm

Quest progression event

Post by Haytam95 »

Hi!

I'm using Dialogue System quest system in order to make my level progress. Each level have some quests that are active and each sub state should perform some changes to the level.

For example, at the first level, the character spawns in first view perspective and have restricted movement (Also the bed where is have the collider disabled):

Image
(This is, Quest A state 1 for example)

When the character interacts with a specific object, then I execute the Lua code to complete state 1 and set the state 2 as active. In state two, the character view should be third person, have free movement and the bed collision be re-enabled.

Image
(This is Quest A state 2)

So the question: Is there any event that tells me when a Quest entry is updated?


Thank you (And thank you too for helping me with my rewired question, I didn't wanted to answer there to avoid bump :) )
User avatar
Tony Li
Posts: 22143
Joined: Thu Jul 18, 2013 1:27 pm

Re: Quest progression

Post by Tony Li »

Hi,

If you want everything in one script, you could add a script to the Dialogue Manager that has an OnQuestStateChange or OnQuestSEntryStateChange method. Example:

Code: Select all

void OnQuestStateChange(string quest)
{
    switch (quest)
    {
        case "Bedroom Quest":
            if (QuestLog.GetQuestEntryState(quest, 1) == QuestState.Active)
            {
                // Set first person with restricted movement.
            }
            else if (QuestLog.GetQuestEntryState(quest, 2) == QuestState.Active)
            {
                // Set third person; enable bed collider.
            }
            break;
    }
}
Or, if you don't want to put a script on the Dialogue Manager, assign a delegate to QuestLog.SetQuestEntryStateOverride. Example:

Code: Select all

QuestLog.SetQuestEntryStateOverride = OnSetQuestEntryState;

void OnSetQuestEntryState(string quest, int entry, string stateString)
{
    var state = QuestLog.StringToState(stateString);
    QuestLog.DefaultSetQuestEntryState(quest, entry, state);
    switch (quest)
    {
        case "Bedroom Quest":
            // similar to example above.
            break;
    }
}
User avatar
Haytam95
Posts: 23
Joined: Sun Mar 15, 2020 5:56 pm

Re: Quest progression event

Post by Haytam95 »

Tony that's great! The second example is exactly what I need (as Dialogue System manager is in a singleton)

I'll try it now and see how does that work!! Thank you
User avatar
Tony Li
Posts: 22143
Joined: Thu Jul 18, 2013 1:27 pm

Re: Quest progression event

Post by Tony Li »

Glad to help! Keep in mind that it's a delegate, not an event, so you can only assign one handler to it. If you set the delegate to null, it will revert to the default behavior only (i.e., only call QuestLog.DefaultSetQuestEntryState).
User avatar
Haytam95
Posts: 23
Joined: Sun Mar 15, 2020 5:56 pm

Re: Quest progression event

Post by Haytam95 »

Right, it's nice to know that!

I only will have one "LevelProgress" script per scene, so I think it should work nice.

If sometime I need to have more than one script to handle quests, I could broadcast an event from Dialogue System with a custom script and subscribe to it if needed. Right? Using this same tecnique :)
User avatar
Tony Li
Posts: 22143
Joined: Thu Jul 18, 2013 1:27 pm

Re: Quest progression event

Post by Tony Li »

Yes, do can certainly do that. Or you could add a script to the Dialogue Manager that adds a C# event that your scene scripts can register for. Example:

Code: Select all

public class MyQuestEventScript : MonoBehaviour // on Dialogue Manager
{
    public event System.EventHandler<string> questStateChanged = delegate {};
    
    void OnQuestStateChanged(string quest)
    {
        questStateChanged(quest);
    }
}
Then your scene scripts can hook into it like this:

Code: Select all

void OnEnable()
{
    DialogueManager.instance.GetComponent<MyQuestEventScript>().questStateChanged += HandleQuestState;
}
void OnDisable()
{
    DialogueManager.instance.GetComponent<MyQuestEventScript>().questStateChanged -= HandleQuestState;
}
void HandleQuestState(string quest)
{
    //...
}
User avatar
Haytam95
Posts: 23
Joined: Sun Mar 15, 2020 5:56 pm

Re: Quest progression event

Post by Haytam95 »

Hey, that look even better!!!!

I'll go that way, looks cleaner and even more flexible (And avoids the risk to loss delegate reference)
Post Reply