Dialogue Plugin

The plugin’s data can be gathered and translated by UE4 localization system.

Hey there! I really need help. I’ve been working on this small tiny problem for almost two days now, and I’m ready to pull my hair out.

So, I have a parent npc character, and that npc character has children. Now, that parent npc character, has a simple system that allows me to select which dialogue I want that character to play.
Now, I have a quest system, (mission component) and I have successfully merged that with this amazing dialogue system.
One problem.
The parent NPC character has the dialogue selected, (by creating a instance editable variable in the dialogue spot where you create the widget) and I go into the game, talk to the npc, and get the quest. but when I come back, it still plays the same dialogue (and still turns in the quest lol).
I want it to switch the dialogue another dialogue so the player can have a different conversation with the NPC. But I’ve seriously tried EVERYTHING I know how to do to ABSOLUTELY no avail. So is there a way to do this, but in a way that I can easily switch out other NPC childrens dialogue? (from the same parent NPC)
And I only want to do this in BP not c++.
Is there a way??
Please help!!!
Just ask if you need more specifics or something.
Thanks!

Hey all!

First off, I want to say that this plugin is SUPER freakin awesome and I’m so glad it exists. Second, I’m having some problems that I hope can be fixed with like two button clicks.
So, I’m using this plugin for a project and I’m having troubles making a build of the game. I’m using UE 4.25 for the project and I’m getting these errors when I make a build and it causes the build to fail. I tried to include everything that I could think of that would help. As far as I know, I get an error called Error: Unknown Error and multiple other errors saying something about deleting the plugin, which I never did at any point during the project. I’m not sure if this is on me and I did something wrong while trying to use the plugin or if this is a Unreal problem. Any help would be appreciated.

Hey. I wish you’d have contacted me by email sooner, I don’t go on the forums very often.
Looks like you simply want to change the dialogue variable on the NPC. Have you watched the second video tutorial on conditions and events? Using a dialogue event, you can change anything in the game.

Frankly, looks like something that might happen if you have multiple instances of UE4 open, or you ran out of disk space, or something like that. It’s not related to the dialogue plugin, the plugin just happened to be in the log as part of files that can’t be processed for some reason.
Try deleting the following folders in your project: intermediate, saved, binaries, deriveddatacache. Then go into every plugin and delete their “binaries” and “intermediate” folders as well.
Then rebuild everything.

First of all I’d like to thank you for making such a great plugin. I really find that it is very powerful, once you get some good events and conditions going.
I’m currently trying to make events to fade-to-black, then change some things in the scene, and fade back in.

However, I seem to be running into the problem that I can’t run any timed events.
Is there a way to make events run in order and wait for each other to finish?

As an example: If I add an event that has a 5 second delay node in it and add another event after it that prints “I just waited 5 seconds”, it will print the message and start the delay node at the same time.

I hope you can help :slight_smile:

Please show the code that executes incorrectly. For example, the following code executes in the correct order, with a correct delay:

https://i.gyazo./65b8bb1f1eddd7fe052b0f62a3f57214.png

Can someone explain how to make this wonderful project work for a more common type of GAME such as third person type of gameplay. I am having trouble using this plugin in my thirdperson game

Thanks for replying!
I did some more research into how events work in UE4, and I think that what I’m asking might not be possible. As I understand it, events are fired and there’s no way to check if they have completed from the place where you called them.

What I would like to do is run events in sequence:

  1. Do something (example: move character)
  2. Delay 2 seconds
  3. Do something else (example: play sound)
  4. Show next node

This way I would be able to work in a more modular way, where I can add delays where I want.
If this isn’t possible, I’ll just have to make more complex events that aren’t reusable whenever I want to work with delays.

It’s possible to do if you tweak the plugin a little bit.
Before doing it, make sure that the plugin has been duplicated into the project (paragraph 7.4 of the documentation), and that the Widgets have been duplicated into the project (paragraph 3.1 of the documentation).

Here’s where the DialogueEvents are executed in the Widget:

https://i.gyazo./b7e8b24a13097a256c963cf52875e447.png

This leads us into C++, where we’ll see the following code:

https://i.gyazo./7744d96acc5e78aa0dff82e1c81792c5.png

So all we have to do is re-implement this piece of code in blueprints and add a delay when necessary.

Go into Dialogue.h and add **BlueprintReadOnly **into the Event’s UPROPERTY like this:

https://i.gyazo./6b08a267b57cac09c429a5003396b2e0.png

Recompile. Open the project and create a DialogueEvent called “DelayEvent”. Give it a float parameter called “Delay”, mark it instance editable as usual.

Go into MyDialogueWidget and create a variable of type float called “delayNextEvent”. Then create a blueprint event called “ExecuteEvents” and give it the following code:

https://i.gyazo./e193669866ec548148b46313493db840.png

Now replace “RunEventsForNode” with your new blueprint event:

https://i.gyazo./42228d2c6b95e75b85f41f1a76f4865e.png

That’s it. Now you can have the following setup:

https://i.gyazo./05aab6c0001f33ec38ecf7917a5e11d6.png

A small “gotcha” is that if you have a setup that does this:

  • do A
  • wait 2 secs
  • do B
  • wait 3 secs
  • do C
    then in reality, you will need to set the second delay to FIVE and not THREE.

If you do this:

  • print A
  • delay 2 secs
  • print B
  • delay 5 secs
  • print C
  • print D
    then you’ll immediately have A and D printed, then two seconds later you’ll have B, and then three more seconds later you’ll have C.

But now that I’ve exposed the delay functionality to you, you can rewrite it to make it cumulative if you want.

As for when a dialogue node should move on to the next node automatically (instead of displaying a Continue button), I can tell you where it’s handled if you want, although if you look at the DialogueWidget main graph, it’s not difficult to find. Adding a delay there, and then moving on to the next node should be easy to do, but let me know if you need help with that. We’d have to discuss some specifics and edge cases, though.

It all depends on your game. I’m going to assume for a second that your third person game has a crosshair, and you want to “talk” to the NPC when the NPC is in your crosshair AND not further than 2 meters away from your character.

This system would involve Linetraces on Tick, and a basic understanding of what class inheritance is. The simplest would be for your NPCs to inherit from one parent NPC class, and when you do a Linetrace, you check if it casts to an NPC. The more correct approach would be to have a Blueprint Interface, because talking is just a particular case of “using”, like opening a book, or looking inside a chest, but this is a more “advanced” way.
Anyway, to do a Linetrace, you’ll need some basic understanding of how to set up Collision Channels.

If you don’t have a crosshair in your game, but simply want to talk to the closest NPC to your character, you’d need to place a collision sphere around your character, and then detect when an NPC enters your sphere. This also involves collision channels.

If you have a mouse based control scheme, then it’s all much easier, and a working example can be found in the demo project linked on the marketplace page.

I’m not trying to be evasive about answering your question, but game logic in a broad sense is just not part of the dialogue system. Your particular problem requires an interaction system. Incidentally, there are some interaction systems on the marketplace, so I’d recommend looking into them, or getting on Udemy and watching a couple of tutorials on the subjects I’ve mentioned to get a better grasp on the engine.
Let me know if you have any questions.

UE 4.26.0 has a bug, where Rich Text Blocks inside a Retainer Box display garbage. And Dialogue Plugin relies on just that hierarchy. So I can either release a perfectly fine version of the plugin that simply doesn’t display rich text correctly in 4.26.0, or delay the release until a hotfix? I don’t want to cut out the rich text functionnality just for a short while, and then bring it back in. So I don’t know…

Here’s an example of the problem.
It should display:

https://i.gyazo./c17b7ed29d29132d1d20ba9746a603c1.png

It actually displays:

https://i.gyazo./3cd4733b4f1577bf34adf967cf34eb5d.png

I have reported the bug. When the issue appears on the tracker, I’m inviting you all to vote it up. I’ll put a link here.

I’ve released the 4.26 version, it features a comments system as described on the previous page. No news about the engine bug that breaks rich text yet.
Don’t migrate for now if you’re using rich text.

Thank you so much for the detailed explanation on how to implement the delay functionality in C++.
I’m also really impressed with how fast you made the plugin available for 4.26. I’m loving the comment bubbles!

Hi, love the plugin so far and it seems very straightforward and easy to use, thank you. I am having an issue with calling inside created Dialogue events though. When I want to cast to a placed NPC from within an event (to turn on an attached light bulb, for example) what should I aim to call for? I’m somewhat newer to Unreal so I apologize if this is a basic question. I tried to do a straight CastTo node, but it fails to cast (confirmed with print strings). Calling All Actors of Class doesn’t work because, while I can call the actor, I can’t Get anything specific from there, such as the light bulb.
What would be the correct method to talk to placed NPCs in the world from Dialogue Events?

Hello,

I have an initial dialogue with 3 questions, immediately I would like only one to appear. after that i wanted to set a boolean at the end of it and that when returning to Npc it would show only option B or C (if the boolean return true or false).

I try but I didnt figure how to work, do I need put a condition in each node?

And that within each option B or C there would be response variations like “Yes / Yeah / Yep /” each time you back and talk with same Npc. with randomly show some of the asnwers, how I can do that?

And why not a discord server?

Thanks in advanced!

How close the dialog without need choose an answer in some cases? Not always. Like NPC say something and the dialogs closes after 2 seconds.

I’m not getting any remote functionality with this plug-in at all. When I push the bottom face button on the gamepad the only thing that happens is the next button keeps getting highlighted brighter and brighter. Even the left click on the mouse isn’t working when I click the next button. The dialogue widget won’t go away.You definitely need a discord channel.

Responded to your email.

A lot to unpack here.
For your first question where you want A, but then on your next revisit you only want B or C, you have multiple ways to do that.
Way #1: the condition on B and C should be “if A was visited and if B should be displayed”, and same with C. By “and” I mean the node should simply have two conditions.
And the condition on A should be “A wasn’t visited?”.
So you use three bools in total in this case, or maybe just one enum if that works for you.
Way #2: have your answer to A lead to a similar node, but it would only have B and C as answers, with appropriate conditions for each.
Up to you which approach to use, both would work.

As for how to implement a random “Yeah/Yes/Yep”, you can use the Text Variables. You type in %yes% into the node, and then define what it should return - you generate a random number and “Switch” on it. More on that in the documentation, paragraph “5. Variables in text”.

You can use a Dialogue Event. In this event, simply call a “Remove from Parent” on the dialogue widget reference. The reference has to be saved into a variable when you “create widget of type”. You can do it in Character, Controller, Player State or wherever it is that you create the dialogue widget.

I prefer email for work, discord for personal stuff.

Hello, I’ve been having this problem while packaging my project for linux :

“ERROR: Missing precompiled manifest for ‘DialoguePlugin’. This module was most likely not flagged for being included in a precompiled build - set ‘PrecompileForTargets = PrecompileTargetsType.Any;’ in DialoguePlugin.build.cs to override.
PackagingResults: Error: Missing precompiled manifest for ‘DialoguePlugin’. This module was most likely not flagged for being included in a precompiled build - set ‘PrecompileForTargets = PrecompileTargetsType.Any;’ in DialoguePlugin.build.cs to override.”

The plugin is residing in the engine and I have tried setting ‘PrecompileForTargets = PrecompileTargetsType.Any;’ in DialoguePlugin.build.cs.
I’m still receiving the same error.