A Demo Project for the UnrealEngineSDK
Loading...
Searching...
No Matches
DialogueCondition_Details.cpp
Go to the documentation of this file.
1// Copyright Csaba Molnar, Daniel Butum. All Rights Reserved.
3
4#include "IDetailPropertyRow.h"
5#include "IDetailChildrenBuilder.h"
6
7#include "Nodes/DlgNode.h"
12#include "IPropertyUtilities.h"
14#include "DlgHelper.h"
18
19#define LOCTEXT_NAMESPACE "DialogueCondition_Details"
20
21
23// FDialogueCondition_Details
24void FDialogueCondition_Details::CustomizeHeader(TSharedRef<IPropertyHandle> InStructPropertyHandle,
25 FDetailWidgetRow& HeaderRow, IPropertyTypeCustomizationUtils& StructCustomizationUtils)
26{
27 StructPropertyHandle = InStructPropertyHandle;
29 PropertyUtils = StructCustomizationUtils.GetPropertyUtilities();
30
31 // Cache the Property Handle for some properties
32 ParticipantNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, ParticipantName));
33 OtherParticipantNamePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, OtherParticipantName));
34 ConditionTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, ConditionType));
35 CompareTypePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CompareType));
36 IntValuePropertyHandle = StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, IntValue));
37 check(ParticipantNamePropertyHandle.IsValid());
39 check(ConditionTypePropertyHandle.IsValid());
40 check(CompareTypePropertyHandle.IsValid());
41 check(IntValuePropertyHandle.IsValid());
42
43 // Register handler properties changes
44 ConditionTypePropertyHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &Self::OnConditionTypeChanged, true));
45 CompareTypePropertyHandle->SetOnPropertyValueChanged(FSimpleDelegate::CreateSP(this, &Self::OnCompareTypeChanged, true));
46
47 const bool bShowOnlyInnerProperties = StructPropertyHandle->GetProperty()->HasMetaData(META_ShowOnlyInnerProperties);
48 if (!bShowOnlyInnerProperties)
49 {
50 HeaderRow.NameContent()
51 [
52 StructPropertyHandle->CreatePropertyNameWidget()
53 ];
54 }
55}
56
58 TSharedRef<IPropertyHandle> InStructPropertyHandle,
59 IDetailChildrenBuilder& StructBuilder,
60 IPropertyTypeCustomizationUtils& StructCustomizationUtils
61)
62{
63 const bool bHasDialogue = Dialogue != nullptr;
64
65 // Add common ConditionStrength, ConditionType
66 StructBuilder.AddProperty(StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, Strength)).ToSharedRef());
67
68 // ConditionType
69 {
70 ConditionTypePropertyRow = &StructBuilder.AddProperty(ConditionTypePropertyHandle.ToSharedRef());
71
72 // Add Custom buttons
73 ConditionTypePropertyRow_CustomDisplay = MakeShared<FDialogueEnumTypeWithObject_CustomRowHelper>(
77 );
80 }
81
82 // ParticipantName
83 {
84 FDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT("ParticipantNameSearchKey", "Participant Name"));
85
86 ParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, ParticipantNamePropertyHandle);
87 ParticipantNamePropertyRow->SetTextPropertyPickListWidget(
89 .IsEnabled(InStructPropertyHandle->IsEditable())
90 .AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)
91 .OnTextCommitted(this, &Self::HandleTextCommitted)
92 .HasContextCheckbox(bHasDialogue)
93 .IsContextCheckBoxChecked(true)
94 .CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)
95 )
97 .Update();
98 }
99
100 // CallbackName (variable name)
101 {
102 const TSharedPtr<IPropertyHandle> CallbackNamePropertyHandle =
103 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CallbackName));
104 FDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT("CallBackNameSearchKey", "Variable Name"));
105
106 CallbackNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, CallbackNamePropertyHandle);
107 CallbackNamePropertyRow->SetTextPropertyPickListWidget(
109 .IsEnabled(InStructPropertyHandle->IsEditable())
110 .AvailableSuggestions(this, &Self::GetAllDialoguesCallbackNames)
111 .OnTextCommitted(this, &Self::HandleTextCommitted)
112 .HasContextCheckbox(bHasDialogue)
113 .IsContextCheckBoxChecked(false)
114 .CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueCallbackNames)
115 )
117 .Update();
118 }
119
120 // Operation
121 {
122 OperationPropertyRow = &StructBuilder.AddProperty(
123 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, Operation)).ToSharedRef()
124 );
126 }
127
128 // CompareType
129 {
130 CompareTypePropertyRow = &StructBuilder.AddProperty(
131 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CompareType)).ToSharedRef()
132 );
134 }
135
136 // OtherParticipantName
137 {
138 FDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT("ParticipantNameSearchKey", "Participant Name"));
139
140 ParticipantNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, OtherParticipantNamePropertyHandle);
141 ParticipantNamePropertyRow->SetTextPropertyPickListWidget(
143 .IsEnabled(InStructPropertyHandle->IsEditable())
144 .AvailableSuggestions(this, &Self::GetAllDialoguesParticipantNames)
145 .OnTextCommitted(this, &Self::HandleTextCommitted)
146 .HasContextCheckbox(true)
147 .IsContextCheckBoxChecked(true)
148 .CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueParticipantNames)
149 )
151 .Update();
152 }
153
154 // Other variable name
155 {
156 const TSharedPtr<IPropertyHandle> CallbackNamePropertyHandle =
157 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, OtherVariableName));
158 FDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT("CallBackNameSearchKey", "Variable Name"));
159
160 OtherVariableNamePropertyRow = MakeShared<FDialogueTextPropertyPickList_CustomRowHelper>(DetailWidgetRow, CallbackNamePropertyHandle);
161 OtherVariableNamePropertyRow->SetTextPropertyPickListWidget(
163 .IsEnabled(InStructPropertyHandle->IsEditable())
164 .AvailableSuggestions(this, &Self::GetAllDialoguesOtherVariableNames)
165 .OnTextCommitted(this, &Self::HandleTextCommitted)
166 .HasContextCheckbox(true)
167 .IsContextCheckBoxChecked(false)
168 .CurrentContextAvailableSuggestions(this, &Self::GetCurrentDialogueOtherVariableNames)
169 )
171 .Update();
172 }
173
174
175 // IntValue
176 {
177 FDetailWidgetRow* DetailWidgetRow = &StructBuilder.AddCustomRow(LOCTEXT("IntValueSearchKey", "Int Value"));
178 IntValuePropertyRow = MakeShared<FDialogueIntTextBox_CustomRowHelper>(DetailWidgetRow, IntValuePropertyHandle, Dialogue);
181 IntValuePropertyRow->Update();
182 }
183
184 // FloatValue
185 {
186 FloatValuePropertyRow = &StructBuilder.AddProperty(
187 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, FloatValue)).ToSharedRef()
188 );
190 }
191
192 // NameValue
193 {
194 NameValuePropertyRow = &StructBuilder.AddProperty(
195 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, NameValue)).ToSharedRef()
196 );
198 }
199
200 // bBoolValue
201 {
202 BoolValuePropertyRow = &StructBuilder.AddProperty(
203 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, bBoolValue)).ToSharedRef()
204 );
206 }
207
208 // bLongTermMemory
209 {
210 LongTermMemoryPropertyRow = &StructBuilder.AddProperty(
211 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, bLongTermMemory)).ToSharedRef()
212 );
214 }
215
216 // GUID
217 {
218 GUIDPropertyRow = &StructBuilder.AddProperty(
219 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, GUID)).ToSharedRef()
220 );
222 }
223
224 // CustomCondition
225 {
226 CustomConditionPropertyRow = &StructBuilder.AddProperty(
227 StructPropertyHandle->GetChildHandle(GET_MEMBER_NAME_CHECKED(FDlgCondition, CustomCondition)).ToSharedRef()
228 );
230
231 // Add Custom buttons
232 CustomConditionPropertyRow_CustomDisplay = MakeShared<FDialogueObject_CustomRowHelper>(CustomConditionPropertyRow);
234 CustomConditionPropertyRow_CustomDisplay->SetFunctionNameToOpen(
236 GET_FUNCTION_NAME_CHECKED(UDlgConditionCustom, IsConditionMet)
237 );
238 }
239
240 // Cache the initial values
243}
244
246{
247 // Update to the new type
248 uint8 Value = 0;
249 if (ConditionTypePropertyHandle->GetValue(Value) != FPropertyAccess::Success)
250 {
251 return;
252 }
253 ConditionType = static_cast<EDlgConditionType>(Value);
254
255 // Update the display names/tooltips
256 FText CallBackNameDisplayName = LOCTEXT("CallBackNameDisplayName", "Variable Name");
257 FText CallBackNameToolTip = LOCTEXT("CallBackNameToolTip", "The name of the checked variable");
258 FText BoolValueDisplayName = LOCTEXT("BoolValueDisplayName", "Return Value");
259 FText BoolValueToolTip = LOCTEXT("BoolValueToolTip", "SHOULD NOT BE VISIBLE");
260 // TODO remove the "equal" operations for float values as they are imprecise
261 FText FloatValueToolTip = LOCTEXT(
262 "FloatValueToolTip",
263 "The float value the VariableName is checked against (depending on the operation).\n"
264 "VariableName <Operation> FloatValue"
265 );
266 FText IntValueDisplayName = LOCTEXT("IntValueDisplayName", "Int Value");
267 FText IntValueToolTip = LOCTEXT(
268 "IntValueToolTip",
269 "The int value the VariableName is checked against (depending on the operation).\n"
270 "VariableName <Operation> IntValue"
271 );
272 FText GUIDDisplayName = LOCTEXT("GUIDDisplayName", "Node GUID");
273 FText GUIDToolTip = LOCTEXT(
274 "GUIDToolTip",
275 "The Corresponding GUID of the Node Index. (Set On Compile)"
276 );
277
279 switch (ConditionType)
280 {
282 CallBackNameDisplayName = LOCTEXT("ConditionEvent_CallBackNameDisplayName", "Condition Name");
283 CallBackNameToolTip = LOCTEXT("ConditionEvent_CallBackNameToolTip", "Name parameter of the event call the participant gets");
284 BoolValueToolTip = LOCTEXT("ConditionEvent_BoolValueToolTip", "Does the return result of the Event/Condition has this boolean value?");
285 break;
286
289 BoolValueToolTip = LOCTEXT("ConditionBool_BoolValueToolTip", "Whether the bool check is expected to be true or false in order to satisfy the condition");
290 break;
291
294 BoolValueToolTip = LOCTEXT("ConditionBool_BoolValueToolTip", "Whether the two Name is expected to be equal or not in order to satisfy the condition");
295 BoolValueDisplayName = LOCTEXT("BoolValueDisplayName", "Succeed on Equal");
296 break;
297
300 break;
301
304 break;
305
307 if (Dialogue)
308 {
309 FDialogueDetailsPanelUtils::SetNumericPropertyLimits<int32>(IntValuePropertyHandle, 0, Dialogue->GetNodes().Num() - 1);
310 }
311
312 IntValueDisplayName = LOCTEXT("ConditionNodeVisited_IntValueDisplayName", "Node Index");
313 IntValueToolTip = LOCTEXT("ConditionNodeVisited_IntValueToolTip", "Node index of the node we want to check the visited status");
314 BoolValueDisplayName = LOCTEXT("ConditionNodeVisited_BoolValueDisplayName", "Is Node Visited?");
315 BoolValueToolTip = LOCTEXT("ConditionNodeVisited_BoolValueToolTip", "Should the node be visited? True/False.");
316 break;
317
319 if (Dialogue)
320 {
321 FDialogueDetailsPanelUtils::SetNumericPropertyLimits<int32>(IntValuePropertyHandle, 0, Dialogue->GetNodes().Num() - 1);
322 }
323
324 IntValueDisplayName = LOCTEXT("ConditionHasSatisfiedChild_IntValueDisplayName", "Node Index");
325 IntValueToolTip = LOCTEXT("ConditionHasSatisfiedChild_IntValueToolTip", "Node index of the node we want to check");
326 BoolValueDisplayName = LOCTEXT("ConditionHasSatisfiedChild_BoolValueDisplayName", "Has?");
327 BoolValueToolTip = LOCTEXT("ConditionHasSatisfiedChild_BoolValueToolTip", "Should the node have satisfied child(ren)?");
328 break;
329
331 break;
332
333 default:
334 checkNoEntry();
335 }
336
337 CallbackNamePropertyRow->SetDisplayName(CallBackNameDisplayName)
338 .SetToolTip(CallBackNameToolTip)
339 .Update();
340
341 BoolValuePropertyRow->DisplayName(BoolValueDisplayName);
342 BoolValuePropertyRow->ToolTip(BoolValueToolTip);
343
344 IntValuePropertyRow->SetDisplayName(IntValueDisplayName);
345 IntValuePropertyRow->SetToolTip(IntValueToolTip);
346 IntValuePropertyRow->Update();
347 FloatValuePropertyRow->ToolTip(FloatValueToolTip);
348
349 GUIDPropertyRow->DisplayName(GUIDDisplayName);
350 GUIDPropertyRow->ToolTip(GUIDToolTip);
351
352 // Refresh the view, without this some names/tooltips won't get refreshed
353 if (bForceRefresh && PropertyUtils.IsValid())
354 {
355 PropertyUtils->ForceRefresh();
356 }
357}
358
360{
361 uint8 Value = 0;
362 if (CompareTypePropertyHandle->GetValue(Value) != FPropertyAccess::Success)
363 {
364 return;
365 }
366 CompareType = static_cast<EDlgCompare>(Value);
367
368 // Refresh the view, without this some names/tooltips won't get refreshed
369 if (bForceRefresh && PropertyUtils.IsValid())
370 {
371 PropertyUtils->ForceRefresh();
372 }
373}
374
376TArray<FName> FDialogueCondition_Details::GetCallbackNamesForParticipant(bool bCurrentOnly, bool bOtherValue) const
377{
378 TArray<FName> Suggestions;
379 TSet<FName> SuggestionSet;
380 const TSharedPtr<IPropertyHandle>& ParticipantHandle = bOtherValue ? OtherParticipantNamePropertyHandle : ParticipantNamePropertyHandle;
381 const FName ParticipantName = FDialogueDetailsPanelUtils::GetParticipantNameFromPropertyHandle(ParticipantHandle.ToSharedRef());
382
383 bool bReflectionBased = false;
384 if (bOtherValue)
385 {
386 bReflectionBased = CompareType == EDlgCompare::ToClassVariable;
387 }
388 else
389 {
394 }
395
396 switch (ConditionType)
397 {
400 if (bReflectionBased && Dialogue)
401 {
403 Dialogue->GetParticipantClass(ParticipantName),
404 FNYBoolProperty::StaticClass(),
405 Suggestions,
406 GetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses
407 );
408 }
409 else
410 {
411 if (bCurrentOnly && Dialogue)
412 {
413 Dialogue->GetBoolNames(ParticipantName, SuggestionSet);
414 Suggestions = SuggestionSet.Array();
415 }
416 else
417 {
418 UDlgManager::GetAllDialoguesBoolNames(ParticipantName, Suggestions);
419 }
420 }
421 break;
422
425 if (bReflectionBased && Dialogue)
426 {
428 Dialogue->GetParticipantClass(ParticipantName),
429 FNYFloatProperty::StaticClass(),
430 Suggestions,
431 GetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses
432 );
433 }
434 else
435 {
436 if (bCurrentOnly && Dialogue)
437 {
438 Dialogue->GetFloatNames(ParticipantName, SuggestionSet);
439 }
440 else
441 {
442 UDlgManager::GetAllDialoguesFloatNames(ParticipantName, Suggestions);
443 }
444 }
445 break;
446
449 if (bReflectionBased && Dialogue)
450 {
452 Dialogue->GetParticipantClass(ParticipantName),
453 FNYIntProperty::StaticClass(),
454 Suggestions,
455 GetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses
456 );
457 }
458 else
459 {
460 if (bCurrentOnly && Dialogue)
461 {
462 Dialogue->GetIntNames(ParticipantName, SuggestionSet);
463 }
464 else
465 {
466 UDlgManager::GetAllDialoguesIntNames(ParticipantName, Suggestions);
467 }
468 }
469 break;
470
473 if (bReflectionBased && Dialogue)
474 {
476 Dialogue->GetParticipantClass(ParticipantName),
477 FNYNameProperty::StaticClass(),
478 Suggestions,
479 GetDefault<UDlgSystemSettings>()->BlacklistedReflectionClasses
480 );
481 }
482 else
483 {
484 if (bCurrentOnly && Dialogue)
485 {
486 Dialogue->GetNameNames(ParticipantName, SuggestionSet);
487 }
488 else
489 {
490 UDlgManager::GetAllDialoguesNameNames(ParticipantName, Suggestions);
491 }
492 }
493 break;
494
497 default:
498 if (bCurrentOnly && Dialogue)
499 {
500 Dialogue->GetConditions(ParticipantName, SuggestionSet);
501 }
502 else
503 {
504 UDlgManager::GetAllDialoguesConditionNames(ParticipantName, Suggestions);
505 }
506 break;
507 }
508
509 if (SuggestionSet.Num() > Suggestions.Num())
510 {
511 Suggestions = SuggestionSet.Array();
512 }
513
514 FDlgHelper::SortDefault(Suggestions);
515 return Suggestions;
516}
517
518
519#undef LOCTEXT_NAMESPACE
static const TCHAR * META_ShowOnlyInnerProperties
#define CREATE_VISIBILITY_CALLBACK(_SelfMethod)
EDlgConditionType
UENUM(BlueprintType)
EDlgCompare
UENUM(BlueprintType)
EVisibility GetParticipantNameVisibility() const
EVisibility GetCallbackNameVisibility() const
void OnConditionTypeChanged(bool bForceRefresh)
TArray< FName > GetCurrentDialogueCallbackNames() const
TSharedPtr< IPropertyHandle > ConditionTypePropertyHandle
EVisibility GetFloatValueVisibility() const
TSharedPtr< FDialogueEnumTypeWithObject_CustomRowHelper > ConditionTypePropertyRow_CustomDisplay
TSharedPtr< FDialogueTextPropertyPickList_CustomRowHelper > CallbackNamePropertyRow
TArray< FName > GetAllDialoguesOtherVariableNames() const
TSharedPtr< IPropertyUtilities > PropertyUtils
void HandleTextCommitted(const FText &InSearchText, ETextCommit::Type CommitInfo) const
TSharedPtr< IPropertyHandle > StructPropertyHandle
TSharedPtr< IPropertyHandle > IntValuePropertyHandle
TSharedPtr< FDialogueTextPropertyPickList_CustomRowHelper > OtherVariableNamePropertyRow
TSharedPtr< FDialogueTextPropertyPickList_CustomRowHelper > ParticipantNamePropertyRow
void CustomizeChildren(TSharedRef< IPropertyHandle > StructPropertyHandle, IDetailChildrenBuilder &StructBuilder, IPropertyTypeCustomizationUtils &StructCustomizationUtils) override
TArray< FName > GetAllDialoguesCallbackNames() const
EVisibility GetOtherParticipantNameAndVariableVisibility() const
IDetailPropertyRow * ConditionTypePropertyRow
IDetailPropertyRow * LongTermMemoryPropertyRow
EVisibility GetLongTermMemoryVisibility() const
TSharedPtr< IPropertyHandle > CompareTypePropertyHandle
IDetailPropertyRow * CompareTypePropertyRow
TSharedPtr< FDialogueIntTextBox_CustomRowHelper > IntValuePropertyRow
EVisibility GetCustomConditionVisibility() const
void CustomizeHeader(TSharedRef< IPropertyHandle > StructPropertyHandle, FDetailWidgetRow &HeaderRow, IPropertyTypeCustomizationUtils &StructCustomizationUtils) override
TArray< FName > GetCallbackNamesForParticipant(bool bCurrentOnly, bool bOtherValue) const
TArray< FName > GetAllDialoguesParticipantNames() const
void OnCompareTypeChanged(bool bForceRefresh)
IDetailPropertyRow * CustomConditionPropertyRow
TSharedPtr< IPropertyHandle > OtherParticipantNamePropertyHandle
TSharedPtr< IPropertyHandle > ParticipantNamePropertyHandle
TArray< FName > GetCurrentDialogueParticipantNames() const
TSharedPtr< FDialogueObject_CustomRowHelper > CustomConditionPropertyRow_CustomDisplay
TArray< FName > GetCurrentDialogueOtherVariableNames() const
static void SortDefault(TArray< FName > &OutArray)
Definition DlgHelper.h:452
static void GetVariableNames(const UClass *ParticipantClass, const FNYPropertyClass *PropertyClass, ContainerType &OutContainer, const TArray< UClass * > &BlacklistedClasses)
UCLASS(Blueprintable, BlueprintType, Abstract, EditInlineNew)
const TArray< UDlgNode * > & GetNodes() const
UFUNCTION(BlueprintPure, Category = "Dialogue")
UClass * GetParticipantClass(FName ParticipantName) const
EDITOR function, it only works if the participant class is setup in the ParticipantsClasses array.
void GetBoolNames(FName ParticipantName, TSet< FName > &OutSet) const
UFUNCTION(BlueprintPure, Category = "Dialogue")
void GetNameNames(FName ParticipantName, TSet< FName > &OutSet) const
UFUNCTION(BlueprintPure, Category = "Dialogue")
void GetConditions(FName ParticipantName, TSet< FName > &OutSet) const
UFUNCTION(BlueprintPure, Category = "Dialogue")
void GetFloatNames(FName ParticipantName, TSet< FName > &OutSet) const
UFUNCTION(BlueprintPure, Category = "Dialogue")
void GetIntNames(FName ParticipantName, TSet< FName > &OutSet) const
UFUNCTION(BlueprintPure, Category = "Dialogue")
static void GetAllDialoguesNameNames(FName ParticipantName, TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
static void GetAllDialoguesBoolNames(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 GetAllDialoguesConditionNames(FName ParticipantName, TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
static void GetAllDialoguesFloatNames(FName ParticipantName, TArray< FName > &OutArray)
UFUNCTION(BlueprintPure, Category = "Dialogue|Data")
static FName GetParticipantNameFromPropertyHandle(const TSharedRef< IPropertyHandle > &ParticipantNamePropertyHandle)
static UDlgDialogue * GetDialogueFromPropertyHandle(const TSharedRef< IPropertyHandle > &PropertyHandle)
static void ResetNumericPropertyLimits(const TSharedPtr< IPropertyHandle > &PropertyHandle)
USTRUCT(Blueprintable)