How to change quest state when a scene loads

Announcements, support questions, and discussion for the Dialogue System.
Post Reply
AoF
Posts: 241
Joined: Sun May 12, 2019 8:36 pm

How to change quest state when a scene loads

Post by AoF »

This was really hard for me to figure out on my own, so I'm posting this because it may help others. Here's how you can set a quest's entry state from a scene loading:

Code: Select all

using PixelCrushers.DialogueSystem;
using UnityEngine;

public class Field : MonoBehaviour
{
    public DialogueSystemTrigger visitedFieldTrigger;

    public void OnApplyPersistentData()
    {
        Debug.LogWarning("Called");
        QuestLog.SetQuestEntryState("Plant some crops!", 1, QuestState.Success);
        Debug.LogWarning("Call finished");
    }

    public void OnEnable()
    {
        PersistentDataManager.RegisterPersistentData(this.gameObject);
    }

    public void OnDisable()
    {
        PersistentDataManager.RegisterPersistentData(this.gameObject);
    }
}

If you simply put OnApplyPersistentData in a Start(), it would be overwritten because the saved Lua state would get loaded AFTER that. For the same reason, this won't work if you do it in an "On Scene Load" from the save system events script. Putting it in OnApplyPersistentData makes the code run after the Lua state is loaded.
AoF
Posts: 241
Joined: Sun May 12, 2019 8:36 pm

Re: How to change quest state when a scene loads

Post by AoF »

OK, I do have a follow up question to this though. If I hit play, that first scene doesn't trigger the OnApplyPersistentData. I'm having to write a hacky solution (the Invoke) like this:

Code: Select all

    private bool executed = false;

    void Start()
    {
        Invoke("ExecuteIfNoPersistentData", 1f); // because when you load a scene, it doesn't load data, only if you move to a new scene
    }

    public void ExecuteIfNoPersistentData()
    {
        OnApplyPersistentData();
    }

    public void OnApplyPersistentData()
    {
        if (!executed)
        {
            executed = true;
            QuestLog.SetQuestEntryState("Plant some crops!", 1, QuestState.Success);
        }
    }

    public void OnEnable()
    {
        PersistentDataManager.RegisterPersistentData(this.gameObject);
    }

    public void OnDisable()
    {
        PersistentDataManager.RegisterPersistentData(this.gameObject);
    }
I just want to execute a piece of code after a scene loads without it being overwritten by save data. How do I do that?
User avatar
Tony Li
Posts: 22056
Joined: Thu Jul 18, 2013 1:27 pm

Re: How to change quest state when a scene loads

Post by Tony Li »

Here's how do it without code:

1. Add an empty GameObject to the scene. (Or use an existing GameObject if you prefer.)

2. Add a Dialogue System Trigger.
  • Set the trigger dropdown to OnUse.
  • Select Add Action > Run Lua Code.
  • Set the Lua Code field to:

    Code: Select all

    SetQuestEntryState("Plant some crops!", 1, "success")
3. Add a Timed Event component to the same GameObject.
  • Set Mode to Frames.
  • Set Frames to 2 (i.e., one higher than your Dialogue Manager's Save System component's Frames To Wait For Apply Data).
  • Tick Activate On Start.
  • Configure the OnTimeReached() event to call the Dialogue System Trigger's OnUse() method.
AoF
Posts: 241
Joined: Sun May 12, 2019 8:36 pm

Re: How to change quest state when a scene loads

Post by AoF »

Thank you! That's much better than my solution :)
AoF
Posts: 241
Joined: Sun May 12, 2019 8:36 pm

Re: How to change quest state when a scene loads

Post by AoF »

While trying this, I noticed there's no way to say, "nevermind, I don't want a Lua action." What i mean is, there's no X box to delete the Lua action after I've created it:

Let me know if there's a preferred method of reporting things like this. I'm just piggybacking off this thread because it's somewhat related.
User avatar
Tony Li
Posts: 22056
Joined: Thu Jul 18, 2013 1:27 pm

Re: How to change quest state when a scene loads

Post by Tony Li »

If you leave that inspector and come back to it, the Lua Code action will be gone if the Lua Code field is left blank. But that's a good point. I'll add an 'x' button in the next version to make it explicit.
AoF
Posts: 241
Joined: Sun May 12, 2019 8:36 pm

Re: How to change quest state when a scene loads

Post by AoF »

Cool, thanks!
Post Reply