A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DialogueK2Node_Select.cpp
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
3
4#include "EdGraphUtilities.h"
5#include "KismetCompiler.h"
6#include "BlueprintNodeSpawner.h"
7#include "BlueprintActionDatabaseRegistrar.h"
8#include "Kismet/KismetMathLibrary.h"
9#include "Kismet/KismetSystemLibrary.h"
10#include "EditorStyleSet.h"
11
13#include "DlgManager.h"
15
16#define LOCTEXT_NAMESPACE "DlgK2Node_Select"
17
18const FName UDialogueK2Node_Select::PIN_VariableName(TEXT("VariableName"));
19const FName UDialogueK2Node_Select::PIN_DefaultValue(TEXT("DefaultValue"));
20
22// FKCHandler_DialogueSelect
23// TODO(vampy): Figure out why having the same name for a handler crashes things on linux and only some times in Windows
24// For example if this is name FKCHandler_Select (like the normal K2Node_Select handler) the compiler confuses our node
25// for that node. The name should be irrelevant right? the handler is used as value in a TMap, right????
27{
28protected:
29 // Mutiple nodes possible? isn't this called only on this node
30 TMap<UEdGraphNode*, FBPTerminal*> BoolTermMap;
31
32public:
33 FKCHandler_DialogueSelect(FKismetCompilerContext& InCompilerContext) : FNodeHandlingFunctor(InCompilerContext)
34 {
35 }
36
37 void RegisterNets(FKismetFunctionContext& Context, UEdGraphNode* Node) override
38 {
39 FNodeHandlingFunctor::RegisterNets(Context, Node);
40 const UDialogueK2Node_Select* SelectNode = CastChecked<UDialogueK2Node_Select>(Node);
41
42 // Create the net for the return value manually as it's a special case Output Direction pin
43 {
44 UEdGraphPin* ReturnPin = SelectNode->GetReturnValuePin();
45 FBPTerminal* Term = Context.CreateLocalTerminalFromPinAutoChooseScope(ReturnPin, Context.NetNameMap->MakeValidName(ReturnPin));
46 Context.NetMap.Add(ReturnPin, Term);
47 }
48
49 // Create a terminal to determine if the compare was successful or not
50 FBPTerminal* BoolTerm = Context.CreateLocalTerminal();
51 BoolTerm->Type.PinCategory = UEdGraphSchema_K2::PC_Boolean;
52 BoolTerm->Source = Node;
53 BoolTerm->Name = Context.NetNameMap->MakeValidName(Node) + TEXT("_CmpSuccess");
54 BoolTermMap.Add(Node, BoolTerm);
55 }
56
57 void Compile(FKismetFunctionContext& Context, UEdGraphNode* Node) override
58 {
59 // Pseudocode of how this is compiled to:
60 // We have N option pins - Options[N]
61 //
62 // IndexValue = ConditionTerm
63 // ReturnValue = ReturnTerm
64 // PrevIfNotStatement = null
65 //
66 // for Option in Options:
67 // OptionValue = Value of Option
68 // CallConditionFunctionStatement = AddStatement `BoolTerm = ConditionFunction(IndexValue, OptionValue)`
69 //
70 // // where the previous statement jumps if it fails
71 // if PrevIfNotStatement is not null:
72 // PrevIfNotStatement.JumpTarget = CallConditionFunctionStatement
73 //
74 // // the target is set above
75 // IfNotStatement = AddStatement `GoToTargetIfNot(BoolTerm, JumpTarget=null)`
76 //
77 // // Add return option for this Option
78 // AddStatement `ReturnValue = OptionValue`
79 //
80 // PrevIfNotStatement = IfNotStatement
81 // // add some goto statements that allows us to to safely exit the loop
82 //
83 // // point goto statements to a noop at the end
84
85 // Cast the node and get all the input pins, the options we are selecting from
86 UDialogueK2Node_Select* SelectNode = CastChecked<UDialogueK2Node_Select>(Node);
87 const TArray<UEdGraphPin*> OptionPins = SelectNode->GetOptionPins();
88
89 // Get the kismet term for the (Condition or Index) that will determine which option to use
90 const UEdGraphPin* VariableNameConditionPin = FEdGraphUtilities::GetNetFromPin(SelectNode->GetVariableNamePin());
91 FBPTerminal** ConditionTerm = Context.NetMap.Find(VariableNameConditionPin);
92
93 // Get the kismet term for the return value
94 const UEdGraphPin* ReturnPin = SelectNode->GetReturnValuePin();
95 FBPTerminal** ReturnTerm = Context.NetMap.Find(ReturnPin);
96
97 // Get the kismet term for the default value
98 const UEdGraphPin* DefaultPin = FEdGraphUtilities::GetNetFromPin(SelectNode->GetDefaultValuePin());
99 FBPTerminal** DefaultTerm = Context.NetMap.Find(DefaultPin);
100
101 // Don't proceed if there is no return value or there is no selection
102 if (ConditionTerm == nullptr || ReturnTerm == nullptr || DefaultTerm == nullptr)
103 {
104 return;
105 }
106
107 // Get the function that determines how the condition is computed
108 UFunction* ConditionFunction = SelectNode->GetConditionalFunction();
109
110 // Find the local boolean for use in the equality call function below (BoolTerm = result of EqualEqual_NameName)
111 // Aka the result of the ConditionFunction
112 FBPTerminal* BoolTerm = BoolTermMap.FindRef(SelectNode);
113
114 // We need to keep a pointer to the previous IfNot statement so it can be linked to the next conditional statement
115 FBlueprintCompiledStatement* PrevIfNotStatement = nullptr;
116
117 // Keep an array of all the unconditional goto statements so we can clean up their jumps after the noop statement is created
118 TArray<FBlueprintCompiledStatement*> GotoStatementList;
119
120 // Loop through all the options
121 const int32 OptionsNum = OptionPins.Num();
122 for (int32 OptionIndex = 0; OptionIndex < OptionsNum; OptionIndex++)
123 {
124 UEdGraphPin* OptionPin = OptionPins[OptionIndex];
125
126 // Create a CallFunction statement with the condition function from the Select Node class
127 // The Previous option (PrevIfNotStatement) points to this CallConditionFunctionStatement
128 {
129 // This is our Condition function.
130 FBlueprintCompiledStatement& CallConditionFunctionStatement = Context.AppendStatementForNode(Node);
131 CallConditionFunctionStatement.Type = KCST_CallFunction;
132 CallConditionFunctionStatement.FunctionToCall = ConditionFunction;
133 CallConditionFunctionStatement.FunctionContext = nullptr;
134 CallConditionFunctionStatement.bIsParentContext = false;
135
136 // BoolTerm will be the return value of the condition statement
137 CallConditionFunctionStatement.LHS = BoolTerm;
138
139 // Compare index value == option value
140 // The condition passed into the Select node
141 CallConditionFunctionStatement.RHS.Add(*ConditionTerm);
142
143 // Create a literal/constant for the current option pin
144 FBPTerminal* LiteralTerm = Context.CreateLocalTerminal(ETerminalSpecification::TS_Literal);
145 LiteralTerm->bIsLiteral = true;
146
147 // Does the name of the input pin matches the VariableName Pin value?
148 LiteralTerm->Type.PinCategory = UEdGraphSchema_K2::PC_Name;
149 LiteralTerm->Name = OptionPin->PinName.ToString();
150
151 // Compare against the current literal
152 CallConditionFunctionStatement.RHS.Add(LiteralTerm);
153
154 // If there is a previous IfNot statement, hook this one to that one for jumping
155 if (PrevIfNotStatement)
156 {
157 CallConditionFunctionStatement.bIsJumpTarget = true;
158 PrevIfNotStatement->TargetLabel = &CallConditionFunctionStatement;
159 }
160 }
161
162 // Create a GotoIfNot statement using the BoolTerm from above as the condition
163 FBlueprintCompiledStatement* IfNotStatement = &Context.AppendStatementForNode(Node);
164 IfNotStatement->Type = KCST_GotoIfNot;
165 IfNotStatement->LHS = BoolTerm;
166
167 // Create an assignment statement
168 // If the option matches, make the return (terminal) be the value of our option
169 {
170 FBlueprintCompiledStatement& AssignStatement = Context.AppendStatementForNode(Node);
171 AssignStatement.Type = KCST_Assignment;
172 AssignStatement.LHS = *ReturnTerm;
173
174 // Get the kismet terminal from the option pin
175 UEdGraphPin* OptionPinToTry = FEdGraphUtilities::GetNetFromPin(OptionPin);
176 FBPTerminal** OptionTerm = Context.NetMap.Find(OptionPinToTry);
177 if (!OptionTerm)
178 {
179 Context.MessageLog.Error(*LOCTEXT("Error_UnregisterOptionPin", "Unregister option pin @@").ToString(), OptionPin);
180 return;
181 }
182 AssignStatement.RHS.Add(*OptionTerm);
183 }
184
185 // Create an unconditional goto to exit the node
186 FBlueprintCompiledStatement& GotoStatement = Context.AppendStatementForNode(Node);
187 GotoStatement.Type = KCST_UnconditionalGoto;
188 GotoStatementList.Add(&GotoStatement);
189
190 // If this is the last IfNot statement, hook the next jump target to be the default value
191 // as all the options are exhausted
192 if (OptionIndex == OptionsNum - 1)
193 {
194 FBlueprintCompiledStatement& AssignStatement = Context.AppendStatementForNode(Node);
195 AssignStatement.Type = KCST_Assignment;
196 AssignStatement.bIsJumpTarget = true;
197 AssignStatement.LHS = *ReturnTerm;
198 AssignStatement.RHS.Add(*DefaultTerm);
199
200 // Hook the IfNot statement's jump target to this assign statement
201 IfNotStatement->TargetLabel = &AssignStatement;
202 }
203
204 PrevIfNotStatement = IfNotStatement;
205 }
206
207 // Create a noop to jump to so the unconditional goto statements can exit the node after successful assignment
208 FBlueprintCompiledStatement& NopStatement = Context.AppendStatementForNode(Node);
209 NopStatement.Type = KCST_Nop;
210 NopStatement.bIsJumpTarget = true;
211
212 // Loop through the unconditional goto statements and fix their jump targets
213 for (FBlueprintCompiledStatement* GotoStatement : GotoStatementList)
214 {
215 GotoStatement->TargetLabel = &NopStatement;
216 }
217 }
218};
219
220UDialogueK2Node_Select::UDialogueK2Node_Select(const FObjectInitializer& ObjectInitializer)
221 : Super(ObjectInitializer)
222{
224 AdvancedPinDisplay = ENodeAdvancedPins::NoPins;
225}
226
228// Begin UEdGraphNode interface
230{
231 bReconstructNode = false;
232
235 const UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>();
236
237 // Params for all the pins, only the index is changed.
238 FCreatePinParams PinParams;
239
240 // Create the return value
241 {
242 PinParams.Index = INDEX_PIN_Return;
243 UEdGraphPin* ReturnPin = CreatePin(EGPD_Output, VariablePinType, UEdGraphSchema_K2::PN_ReturnValue, PinParams);
244 ReturnPin->bDisplayAsMutableRef = false;
245 }
246
247 // Create the variable name pin, the one the selections are based on
248 {
249 PinParams.Index = INDEX_PIN_VariableName;
250 UEdGraphPin* VariableNamePin = CreatePin(EGPD_Input, UEdGraphSchema_K2::PC_Name, PIN_VariableName, PinParams);
251 VariableNamePin->bDisplayAsMutableRef = false;
252 VariableNamePin->PinToolTip = TEXT("The Index/Condition Name that tells what option value to use.");
253 Schema->SetPinAutogeneratedDefaultValueBasedOnType(VariableNamePin);
254 }
255
256 // Create the default value pin
257 {
258 PinParams.Index = INDEX_PIN_Default;
259 UEdGraphPin* DefaultPin = CreatePin(EGPD_Input, VariablePinType, PIN_DefaultValue, PinParams);
260 DefaultPin->bDisplayAsMutableRef = false;
261 DefaultPin->PinToolTip = TEXT("The default value used if the Variable Name does not match any of the options above");
262 Schema->SetPinAutogeneratedDefaultValueBasedOnType(DefaultPin);
263 }
264
265 // Create the option pins at the end of the array
266 for (const FName& PinName : PinNames)
267 {
268 // NOTE: NO PinParams
269 UEdGraphPin* NewPin = CreatePin(EGPD_Input, VariablePinType, PinName);
270 NewPin->bDisplayAsMutableRef = false;
271 Schema->SetPinAutogeneratedDefaultValueBasedOnType(NewPin);
272 }
273
274 Super::AllocateDefaultPins();
275}
276
278{
279 const UEdGraphSchema_K2* Schema = GetDefault<UEdGraphSchema_K2>();
280
281 if (Pin != GetVariableNamePin())
282 {
283 // Set the return value
284 UEdGraphPin* ReturnPin = GetReturnValuePin();
285
286 // Recombine the sub pins back into the ReturnPin
287 if (ReturnPin->SubPins.Num() > 0)
288 {
289 Schema->RecombinePin(ReturnPin->SubPins[0]);
290 }
291 ReturnPin->PinType = Pin->PinType;
292
293 // Recombine all option pins back into their root
294 TArray<UEdGraphPin*> OptionPins = GetOptionPins();
295 for (UEdGraphPin* OptionPin : OptionPins)
296 {
297 // Recombine the sub pins back into the OptionPin
298 if (OptionPin->ParentPin == nullptr && OptionPin->SubPins.Num() > 0)
299 {
300 Schema->RecombinePin(OptionPin->SubPins[0]);
301 }
302 }
303
304 // Get the options again and set them
305 OptionPins = GetOptionPins();
306 for (UEdGraphPin* OptionPin : OptionPins)
307 {
308 if (OptionPin->PinType != Pin->PinType || OptionPin == Pin)
309 {
310 OptionPin->PinType = Pin->PinType;
311 }
312
313 if (!Schema->IsPinDefaultValid(OptionPin, OptionPin->DefaultValue, OptionPin->DefaultObject, OptionPin->DefaultTextValue).IsEmpty())
314 {
315 Schema->ResetPinToAutogeneratedDefaultValue(OptionPin);
316 }
317 }
318
319 // Recombine default pin
320 UEdGraphPin* DefaultPin = GetDefaultValuePin();
321 if (DefaultPin->ParentPin == nullptr && DefaultPin->SubPins.Num() > 0)
322 {
323 Schema->RecombinePin(DefaultPin->SubPins[0]);
324 }
325 DefaultPin->PinType = Pin->PinType;
326
327 bReconstructNode = true;
328 }
329}
330
331
333{
334 Super::NodeConnectionListChanged();
335
337 {
338 ReconstructNode();
339
340 UBlueprint* Blueprint = GetBlueprint();
341 if (!Blueprint->bBeingCompiled)
342 {
343 FBlueprintEditorUtils::MarkBlueprintAsModified(Blueprint);
344 Blueprint->BroadcastChanged();
345 }
346 }
347}
348
350{
351 return LOCTEXT("DlgSelectNodeTooltipInt", "Return the int variable based on the name");
352}
353
354FText UDialogueK2Node_Select::GetNodeTitle(ENodeTitleType::Type TitleType) const
355{
356 return LOCTEXT("DlgSelectInt", "Select Dialogue Int");
357}
358
359FSlateIcon UDialogueK2Node_Select::GetIconAndTint(FLinearColor& OutColor) const
360{
361 static FSlateIcon Icon(FEditorStyle::GetStyleSetName(), "GraphEditor.Select_16x");
362 return Icon;
363}
364// End UEdGraphNode interface
366
368// Begin UK2Node Interface
369FNodeHandlingFunctor* UDialogueK2Node_Select::CreateNodeHandler(FKismetCompilerContext& CompilerContext) const
370{
371 return static_cast<FNodeHandlingFunctor*>(new FKCHandler_DialogueSelect(CompilerContext));
372}
373
374bool UDialogueK2Node_Select::IsConnectionDisallowed(const UEdGraphPin* MyPin, const UEdGraphPin* OtherPin, FString& OutReason) const
375{
376 if (OtherPin && (OtherPin->PinType.PinCategory == UEdGraphSchema_K2::PC_Exec))
377 {
378 OutReason = LOCTEXT("ExecConnectionDisallowed", "Cannot connect with Exec pin.").ToString();
379 return true;
380 }
381
382 return Super::IsConnectionDisallowed(MyPin, OtherPin, OutReason);
383}
384
387{
388 Super::NotifyPinConnectionListChanged(Pin);
389
390 // Check for WildCard pins
391 if (Pin != GetVariableNamePin())
392 {
393 // Grab references to all option pins and the return pin
394 const TArray<UEdGraphPin*> OptionPins = GetOptionPins();
395 const UEdGraphPin* ReturnPin = GetReturnValuePin();
396 const UEdGraphPin* DefaultPin = GetDefaultValuePin();
397
398 // See if this pin is one of the wildcard pins
399 const bool bIsWildcardPin = (Pin == ReturnPin || Pin == DefaultPin || OptionPins.Find(Pin) != INDEX_NONE)
400 && Pin->PinType.PinCategory == UEdGraphSchema_K2::PC_Wildcard;
401
402 // If the pin was one of the wildcards we have to handle it specially
403 if (bIsWildcardPin)
404 {
405 // If the pin is linked, make sure the other wildcard pins match
406 if (Pin->LinkedTo.Num() > 0)
407 {
408 const UEdGraphPin* LinkPin = Pin->LinkedTo[0];
409
410 // Linked pin type differs, change this type, change type
411 if (Pin->PinType != LinkPin->PinType)
412 {
413 Pin->PinType = LinkPin->PinType;
414 PinTypeChanged(Pin);
415 }
416 }
417 }
418 }
419}
420
421void UDialogueK2Node_Select::GetMenuActions(FBlueprintActionDatabaseRegistrar& ActionRegistrar) const
422{
423 // actions get registered under specific object-keys; the idea is that
424 // actions might have to be updated (or deleted) if their object-key is
425 // mutated (or removed)... here we use the node's class (so if the node
426 // type disappears, then the action should go with it)
427 UClass* ActionKey = GetClass();
428
429 // to keep from needlessly instantiating a UBlueprintNodeSpawner, first
430 // check to make sure that the registrar is looking for actions of this type
431 // (could be regenerating actions for a specific asset, and therefore the
432 // registrar would only accept actions corresponding to that asset)
433 if (ActionRegistrar.IsOpenForRegistration(ActionKey))
434 {
435 UBlueprintNodeSpawner* NodeSpawner = UBlueprintNodeSpawner::Create(GetClass());
436 check(NodeSpawner);
437
438 ActionRegistrar.AddBlueprintAction(ActionKey, NodeSpawner);
439 }
440}
441
443{
444 return LOCTEXT("DlgGetMenuCategory", "Dialogue|Select");
445}
446
448{
449 // After ReconstructNode we must be sure that no additional reconstruction is required
450 bReconstructNode = false;
451
452 UEdGraphPin* ReturnPin = GetReturnValuePin();
453
454 // Wild card pin? set types depending on options
455 const bool bFillTypeFromConnected = ReturnPin && (ReturnPin->PinType.PinCategory == UEdGraphSchema_K2::PC_Wildcard);
456 if (bFillTypeFromConnected)
457 {
458 check(VariablePinType == ReturnPin->PinType.PinCategory);
459 FEdGraphPinType PinType = ReturnPin->PinType;
460
461 // Determine from Return pin type connection
462 if (ReturnPin->LinkedTo.Num() > 0)
463 {
464 PinType = ReturnPin->LinkedTo[0]->PinType;
465 }
466 else
467 {
468 // Determine from Default pin type connection
469 const UEdGraphPin* DefaultPin = GetDefaultValuePin();
470 if (DefaultPin && DefaultPin->LinkedTo.Num() > 0)
471 {
472 PinType = DefaultPin->LinkedTo[0]->PinType;
473 }
474 else
475 {
476 // Determine from one of the option pin types connections
477 const TArray<UEdGraphPin*> OptionPins = GetOptionPins();
478 for (const UEdGraphPin* Pin : OptionPins)
479 {
480 if (Pin && Pin->LinkedTo.Num() > 0)
481 {
482 PinType = Pin->LinkedTo[0]->PinType;
483 break;
484 }
485 }
486 }
487 }
488
489 ReturnPin->PinType = PinType;
490 PinTypeChanged(ReturnPin);
491 }
492
493 Super::PostReconstructNode();
494}
495
497// Begin own functions
499{
500 // The IndexPin (select by type) is always an String (FName), so only use that
501 const FName FunctionName = GET_FUNCTION_NAME_CHECKED(UKismetMathLibrary, EqualEqual_NameName);
502
503#if ENGINE_MINOR_VERSION >= 25
504 return FindUField<UFunction>(UKismetMathLibrary::StaticClass(), FunctionName);
505#else
506 return FindField<UFunction>(UKismetMathLibrary::StaticClass(), FunctionName);
507#endif
508}
509
510void UDialogueK2Node_Select::GetPrintStringFunction(FName& FunctionName, UClass** FunctionClass)
511{
512 FunctionName = GET_FUNCTION_NAME_CHECKED(UKismetSystemLibrary, PrintWarning);
513 *FunctionClass = UKismetSystemLibrary::StaticClass();
514}
515
517{
518 // Stop anything if the blueprint is loading, this can happen because we now have reference to blueprint UClasses (reflection system) from the UDlgDialogue
520 {
521 return false;
522 }
523
524 const FName ParticipantName = FDialogueBlueprintUtilities::GetParticipantNameFromNode(this);
525 if (ParticipantName == NAME_None && VariableType != EDlgVariableType::SpeakerState)
526 {
527 return false;
528 }
529
530 TArray<FName> NewPinNames;
531 switch (VariableType)
532 {
534 UDlgManager::GetAllDialoguesFloatNames(ParticipantName, NewPinNames);
535 break;
536
538 UDlgManager::GetAllDialoguesIntNames(ParticipantName, NewPinNames);
539 break;
540
542 UDlgManager::GetAllDialoguesNameNames(ParticipantName, NewPinNames);
543 break;
544
547 break;
548
549 default:
550 unimplemented();
551 }
552
553 // Size changed, simply copy
554 if (NewPinNames.Num() != PinNames.Num())
555 {
556 PinNames = NewPinNames;
557 return true;
558 }
559
560 // Find any difference, if any
561 for (int32 i = 0; i < NewPinNames.Num(); ++i)
562 {
563 if (NewPinNames[i] != PinNames[i])
564 {
565 PinNames = NewPinNames;
566 return true;
567 }
568 }
569
570 return false;
571}
572// End own functions
574
576// UDlgK2Node_SelectFloat
577// float variant
578UDialogueK2Node_SelectFloat::UDialogueK2Node_SelectFloat(const FObjectInitializer& ObjectInitializer)
579 : Super(ObjectInitializer)
580{
582}
583
585{
586 return LOCTEXT("DlgSelectNodeTooltipFloat", "Return the float variable based on the name");
587}
588
589FText UDialogueK2Node_SelectFloat::GetNodeTitle(ENodeTitleType::Type TitleType) const
590{
591 return LOCTEXT("DlgSelectFloat", "Select Dialogue Float");
592}
593
594
595// name variant
596UDialogueK2Node_SelectName::UDialogueK2Node_SelectName(const FObjectInitializer& ObjectInitializer)
597 : Super(ObjectInitializer)
598{
600}
601
603{
604 return LOCTEXT("DlgSelectNodeTooltipName", "Return the name variable based on the name");
605}
606
607FText UDialogueK2Node_SelectName::GetNodeTitle(ENodeTitleType::Type TitleType) const
608{
609 return LOCTEXT("DlgSelectName", "Select Dialogue Name");
610}
611
612
613// speaker state variant
615 : Super(ObjectInitializer)
616{
618}
619
621{
622 return LOCTEXT("DlgSelectNodeTooltipOnSpeakerState", "Return the selected input based on the speaker state");
623}
624
626{
627 return LOCTEXT("DlgSelectOnSpeakerState", "Select Dialogue SpeakerState");
628}
629
630#undef LOCTEXT_NAMESPACE
static FName GetParticipantNameFromNode(const UK2Node *Node)
static bool IsBlueprintLoadedForGraphNode(const UK2Node *Node)
TMap< UEdGraphNode *, FBPTerminal * > BoolTermMap
FKCHandler_DialogueSelect(FKismetCompilerContext &InCompilerContext)
void RegisterNets(FKismetFunctionContext &Context, UEdGraphNode *Node) override
void Compile(FKismetFunctionContext &Context, UEdGraphNode *Node) override
FText GetTooltipText() const override
FText GetNodeTitle(ENodeTitleType::Type TitleType) const override
UDialogueK2Node_SelectFloat(const FObjectInitializer &ObjectInitializer)
UCLASS(MinimalAPI, Meta=(Keywords = "Ternary If"))
void PinTypeChanged(UEdGraphPin *Pin) override
UEdGraphPin * GetVariableNamePin() const
UDialogueK2Node_Select(const FObjectInitializer &ObjectInitializer)
bool bReconstructNode
UPROPERTY(Transient)
FText GetMenuCategory() const override
bool IsConnectionDisallowed(const UEdGraphPin *MyPin, const UEdGraphPin *OtherPin, FString &OutReason) const override
UEdGraphPin * GetReturnValuePin() const
class FNodeHandlingFunctor * CreateNodeHandler(class FKismetCompilerContext &CompilerContext) const override
FText GetNodeTitle(ENodeTitleType::Type TitleType) const override
void GetMenuActions(FBlueprintActionDatabaseRegistrar &ActionRegistrar) const override
EDlgVariableType VariableType
UPROPERTY()
TArray< FName > PinNames
UPROPERTY()
static const FName PIN_VariableName
const TArray< UEdGraphPin * > GetOptionPins() const
static constexpr int32 INDEX_PIN_VariableName
FText GetTooltipText() const override
static constexpr int32 INDEX_PIN_Return
UEdGraphPin * GetDefaultValuePin() const
FSlateIcon GetIconAndTint(FLinearColor &OutColor) const override
virtual void NotifyPinConnectionListChanged(UEdGraphPin *Pin) override
static void GetPrintStringFunction(FName &FunctionName, UClass **FunctionClass)
static constexpr int32 INDEX_PIN_Default
static const FName PIN_DefaultValue
static UFunction * GetConditionalFunction()
void NodeConnectionListChanged() override
FText GetNodeTitle(ENodeTitleType::Type TitleType) const override
UDialogueK2Node_SelectName(const FObjectInitializer &ObjectInitializer)
FText GetTooltipText() const override
FText GetNodeTitle(ENodeTitleType::Type TitleType) const override
UDialogueK2Node_SelectOnSpeakerState(const FObjectInitializer &ObjectInitializer)
static void GetAllDialoguesNameNames(FName ParticipantName, TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
static void GetAllDialoguesIntNames(FName ParticipantName, TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
static void GetAllDialoguesFloatNames(FName ParticipantName, TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
static void GetAllDialoguesSpeakerStates(TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")