Page 1 of 2

Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Wed Sep 28, 2022 8:56 pm
by Jamez0r
Hi Tony! Hope you are doing well!

TL;DR: If a conversation is already active, is there a way to jump directly to a DialogueEntry if I know its ID#?

My Situation: My game is 2 player online co-op. The "host" player is the one that controls the conversation, and I just want it to be replicated on the non-host players side. Instead of sending network-messages from the host to the non-host every time "continue" is pressed (which could possibly get out of sync and never recover, if there are issues), what I'd like to do is for the host player to send the ID# of the DialogueEntry every time it progresses to a new DialogueEntry in the conversation.

So on the non-host player's end, they would initially get a network-message to start the Conversation. Then every time the host-player progresses, the non-host player would receive a network-message with the DialogueEntry ID# that the host progressed to.

Is there a built-in way for an active conversation to go directly to that DialogueEntry, given the ID#? I poked around in the code for a while and couldn't find it.

Thanks a lot for the help!

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Wed Sep 28, 2022 9:34 pm
by Tony Li
Hi,

Use the C# method DialogueManager.conversationController.GotoState(). Example:

Code: Select all

// Jump the active conversation to a specific conversation ID and entry ID:
var entry = DialogueManager.masterDatabase.GetDialogueEntry(conversationID, entryID);
var state = DialogueManager.conversationModel.GetState(entry);
DialogueManager.conversationController.GotoState(state);
Related examples that might be relevant: How To: Interrupt Conversation

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Wed Sep 28, 2022 11:09 pm
by Jamez0r
Tony Li wrote: Wed Sep 28, 2022 9:34 pm Hi,

Use the C# method DialogueManager.conversationController.GotoState(). Example:

Code: Select all

// Jump the active conversation to a specific conversation ID and entry ID:
var entry = DialogueManager.masterDatabase.GetDialogueEntry(conversationID, entryID);
var state = DialogueManager.conversationModel.GetState(entry);
DialogueManager.conversationController.GotoState(state);
Related examples that might be relevant: How To: Interrupt Conversation
Thanks so much for the help Tony!

I have two quick follow-up questions if you don't mind ;)

1) For the host-player who needs to notify the non-host player every time they progress to a new DialogueEntry, would the best place for me to inject some custom code be at ConversationController.GoToState(ConversationState state)? Seems like that function is being called every time I progress through a conversation.
Edit: Hmm, I can't seem to reference my code from within ConversationController.cs. Is that something with AssemblyDefinitions possibly? :?

2) If I am in the ConversationState.GoToState(ConversationState state) function, and thus have that "state", how can I get the DialogueEntryID for that state, so that I can send that ID to the non-host player? Is that possible?

Figured that one out the moment after I posted it, lol, sorry! (state.subtitle.dialogueEntry.id)

Thanks again!!

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Thu Sep 29, 2022 8:05 am
by Tony Li
Looks like you already have a solution, but I would use an OnConversationLine() method in a script on the host.

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Thu Sep 29, 2022 9:37 pm
by Jamez0r
Tony Li wrote: Thu Sep 29, 2022 8:05 am Looks like you already have a solution, but I would use an OnConversationLine() method in a script on the host.
Thanks again Tony! I see how the "Conversation Messages" work now, so I ended up making good use of them :D

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Fri Sep 30, 2022 8:22 am
by Tony Li
Glad to help!

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Tue Oct 04, 2022 3:58 pm
by Jamez0r
Tony Li wrote: Fri Sep 30, 2022 8:22 amGlad to help!
Hey Tony, another related follow-up question if you don't mind :)

In my conversations, I often have "pass-through" entries which just have "Continue()" in the Sequencer so it automatically goes to the next entry. Also on a few rare occasions I'll have a couple commands in the Sequencer with the final one being a "Continue()@XXX".

On my non-host player, I would like to block ANY "Continue()" sequence commands from being processed. So the non-host player will sit at any dialogueEntry regardless of whether it has "Continue()" in the sequence even if it doesn't have any actual dialogue text. I ONLY want it to go to another dialogueEntry when it receives a network-message to do so.

I'm having difficulty figuring out where to inject my code to block the "Continue()" getting processed. I believe there are multiple places that might process it:

1) I see that ConversationView.cs has "ShouldShowSubtitle(Subtitle subtitle)" which checks if the sequence is solely "Continue()", and then I assume if so, it goes directly to the next dialogueEntry? I tried adding my check for "IS_NETWORKED_NONHOST" here, but despite the logs showing my "(2) ShouldShowSubtitle resulted in true" log, the conversation still proceeded to the next dialogueEntry immediately/automatically. Maybe it is automatically 'continuing' because of a check further down the road in the processing?

Code: Select all

private bool ShouldShowSubtitle(Subtitle subtitle)
        {
            if ((subtitle != null) && (settings != null) && (settings.subtitleSettings != null))
            {
                if (DialogueManager.IS_NETWORKED_NONHOST == false && (subtitle.formattedText.noSubtitle || //ADDED NONHOST CHECK
                    string.Equals(subtitle.sequence, "None()") || string.Equals(subtitle.sequence, "None();") ||
                    string.Equals(subtitle.sequence, "Continue()") || string.Equals(subtitle.sequence, "Continue();")))
                {
                    Debug.Log("(1) ShouldShowSubtitle resulted in false");
                    return false;
                }
                if ((subtitle.speakerInfo.characterType == CharacterType.NPC) && settings.GetShowNPCSubtitlesDuringLine())
                {
                    Debug.Log("(2) ShouldShowSubtitle resulted in true");
                    return true;
                }
                if ((subtitle.speakerInfo.characterType == CharacterType.PC) && settings.GetShowPCSubtitlesDuringLine())
                {
                    Debug.Log("(3) ShouldShowSubtitle resulted in settings check");
                    return !(_lastModeWasResponseMenu && settings.GetSkipPCSubtitleAfterResponseMenu());
                }
            }
            Debug.Log("(4) ShouldShowSubtitle resulted in default false");
            return false;
        }
2) If the Sequencer has multiple commands and the final one is something like "Continue()@XXX", how can I intercept/block this? I thought maybe in AbstractDialogueUI's "OnContinueConversation()" method I could intercept/block it, but that doesn't seem to be getting called?

Is there any universal way I could block Continue() from working at all, so that the non-host only traverses a conversation from receiving network-messages that call GoTo(state)? (Note: I do want the non-host to process any 'Script' functions, even on these pass-through dialogueEntries)

P.S. Another way I thought might potentially work would be to have a function for "OnConversationLine(Subtitle subtitle)" callback that simply removes any occurances of Continue() directly from the subtitle.sequence. Would you advise for or against that?

Thanks a lot for the help, and hope it wasn't too confusing!

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Tue Oct 04, 2022 4:20 pm
by Tony Li
I was going to suggest using an OnConversationLine(Subtitle) method to remove Continue() from sequences. Alternatively, you could use the method to set the entire sequence to "None()" on the other client and assume that network synchronization will handle whatever the primary client is causing to happen in the game.

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Tue Oct 04, 2022 11:46 pm
by Jamez0r
Tony Li wrote: Tue Oct 04, 2022 4:20 pm I was going to suggest using an OnConversationLine(Subtitle) method to remove Continue() from sequences. Alternatively, you could use the method to set the entire sequence to "None()" on the other client and assume that network synchronization will handle whatever the primary client is causing to happen in the game.
Thank you Tony, making great progress!

Re: Jumping directly to DialogueEntry via ID #, while mid-conversation?

Posted: Thu Oct 06, 2022 2:24 pm
by Jamez0r
Tony Li wrote: Tue Oct 04, 2022 4:20 pm I was going to suggest using an OnConversationLine(Subtitle) method to remove Continue() from sequences. Alternatively, you could use the method to set the entire sequence to "None()" on the other client and assume that network synchronization will handle whatever the primary client is causing to happen in the game.
Thanks again Tony, everything is working great so far, so I think I have my final question! :lol:

I'm using the built-in Script command for setting Variables during a conversation. On the Host-Player, I'm trying to figure out where I can inject some code so that I can send an RPC to the Non-Host-Player any time the "Variable" Script command is called.

I saw that there is some example code that is similar to what I'm looking to do (LuaNetworkCommands.cs) but we do stuff like 'increment a Number variable by 1" when using the built-in "Variable" script command, which doesn't seem possible with custom made commands -> so I'm hoping to just find the right spot to 'intercept' the built-in "Variable" Script command and send an RPC to the Non-Host-Player there.

Does that seem possible? I was having trouble finding where the built-in "Variable" script's execution code is.

Thanks for all the help!!