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):
(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.
(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 )
Quest progression event
Re: Quest progression
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:
Or, if you don't want to put a script on the Dialogue Manager, assign a delegate to QuestLog.SetQuestEntryStateOverride. Example:
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;
}
}
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;
}
}
Re: Quest progression event
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
I'll try it now and see how does that work!! Thank you
Re: Quest progression event
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).
Re: Quest progression event
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
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
Re: Quest progression event
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:
Then your scene scripts can hook into it like this:
Code: Select all
public class MyQuestEventScript : MonoBehaviour // on Dialogue Manager
{
public event System.EventHandler<string> questStateChanged = delegate {};
void OnQuestStateChanged(string quest)
{
questStateChanged(quest);
}
}
Code: Select all
void OnEnable()
{
DialogueManager.instance.GetComponent<MyQuestEventScript>().questStateChanged += HandleQuestState;
}
void OnDisable()
{
DialogueManager.instance.GetComponent<MyQuestEventScript>().questStateChanged -= HandleQuestState;
}
void HandleQuestState(string quest)
{
//...
}
Re: Quest progression event
Hey, that look even better!!!!
I'll go that way, looks cleaner and even more flexible (And avoids the risk to loss delegate reference)
I'll go that way, looks cleaner and even more flexible (And avoids the risk to loss delegate reference)