diff --git a/Source/ComboInput/Private/Events/K2Node_ComboAction.cpp b/Source/ComboInput/Private/Events/K2Node_ComboAction.cpp index 6b8383d..1a508aa 100644 --- a/Source/ComboInput/Private/Events/K2Node_ComboAction.cpp +++ b/Source/ComboInput/Private/Events/K2Node_ComboAction.cpp @@ -26,16 +26,47 @@ #define LOCTEXT_NAMESPACE "K2Node_ComboAction" -#define COMBO_ACTION_ACTIVATED_PIN_NAME TEXT("Activated") -#define COMBO_ACTION_RELEASED_PIN_NAME TEXT("Released") #define COMBO_ACTION_OBJECT_PIN_NAME TEXT("ComboAction") +void ForEachEventPinName(TFunctionRef PinLambda) +{ + UEnum *EventEnum = StaticEnum(); + for (int32 i = 0; i < EventEnum->NumEnums() - 1; ++i) + { + if (!EventEnum->HasMetaData(TEXT("Hidden"), i)) + { + PinLambda(EComboActionTriggerEvent(EventEnum->GetValueByIndex(i)), *EventEnum->GetNameStringByIndex(i)); + } + } +} + void UK2Node_ComboAction::AllocateDefaultPins() { - CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, COMBO_ACTION_ACTIVATED_PIN_NAME); - CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, COMBO_ACTION_RELEASED_PIN_NAME); - CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Object, UComboAction::StaticClass(), COMBO_ACTION_OBJECT_PIN_NAME); + const UEdGraphSchema_K2 *Schema = GetDefault(); + + this->AdvancedPinDisplay = ENodeAdvancedPins::Hidden; + + ForEachEventPinName([this](EComboActionTriggerEvent Event, FName PinName) + { + static const UEnum *EventEnum = StaticEnum(); + + UEdGraphPin *NewPin = this->CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Exec, PinName); + NewPin->PinToolTip = EventEnum->GetToolTipTextByIndex(EventEnum->GetIndexByValue(static_cast(Event))).ToString(); + NewPin->bAdvancedView = (Event > EComboActionTriggerEvent::Activated); + }); + + UEdGraphPin *ComboActionPin = this->CreatePin(EGPD_Output, UEdGraphSchema_K2::PC_Object, UComboAction::StaticClass(), COMBO_ACTION_OBJECT_PIN_NAME); + ComboActionPin->bAdvancedView = true; + + Schema->SetPinAutogeneratedDefaultValueBasedOnType(ComboActionPin); + + if (this->ComboAction) + { + ComboActionPin->DefaultObject = const_cast(Cast(this->ComboAction)); + ComboActionPin->DefaultValue = this->ComboAction->GetName(); + Schema->ConstructBasicPinTooltip(*ComboActionPin, LOCTEXT("ComboActionPinDescription", "The combo action that caused this event to fire"), ComboActionPin->PinToolTip); + } Super::AllocateDefaultPins(); } @@ -128,49 +159,43 @@ void UK2Node_ComboAction::ExpandNode(FKismetCompilerContext &CompilerContext, UE { Super::ExpandNode(CompilerContext, SourceGraph); - UEdGraphPin *ComboActionActivatedPin = this->FindPin(COMBO_ACTION_ACTIVATED_PIN_NAME); - UEdGraphPin *ComboActionReleasedPin = this->FindPin(COMBO_ACTION_RELEASED_PIN_NAME); + const UEdGraphSchema_K2 *Schema = CompilerContext.GetSchema(); - struct EventPinData + // Create a temporary variable to copy Key in to + UK2Node_TemporaryVariable *ComboActionObjectVar = CompilerContext.SpawnIntermediateNode(this, SourceGraph); + ComboActionObjectVar->VariableType.PinCategory = UEdGraphSchema_K2::PC_Object; + ComboActionObjectVar->VariableType.PinSubCategoryObject = UComboAction::StaticClass(); + ComboActionObjectVar->AllocateDefaultPins(); + + // Establish active pins + struct ActivePinData { - EventPinData(UEdGraphPin *InPin, EComboActionTriggerEvent InEvent) { this->Pin = InPin; this->TriggerEvent = InEvent; } - UEdGraphPin *GetPin() const { return this->Pin; } - const EComboActionTriggerEvent &GetTriggerEvent() { return this->TriggerEvent; } - private: + ActivePinData(UEdGraphPin *InPin, EComboActionTriggerEvent InTriggerEvent) : Pin(InPin), TriggerEvent(InTriggerEvent){} UEdGraphPin *Pin; EComboActionTriggerEvent TriggerEvent; }; - TArray ActivePins; - if ((ComboActionActivatedPin != nullptr) && (ComboActionActivatedPin->LinkedTo.Num() > 0)) + TArray ActivePins; + ForEachEventPinName([this, &ActivePins, &CompilerContext](EComboActionTriggerEvent Event, FName PinName) { - ActivePins.Add(EventPinData(ComboActionActivatedPin, EComboActionTriggerEvent::Activated)); - } - if ((ComboActionReleasedPin != nullptr) && (ComboActionReleasedPin->LinkedTo.Num() > 0)) - { - ActivePins.Add(EventPinData(ComboActionReleasedPin, EComboActionTriggerEvent::Released)); - } - - const UEdGraphSchema_K2 *Schema = CompilerContext.GetSchema(); - - // If more than one is linked we have to do more complicated behaviors - //if (ActivePins.Num() > 1) - //{ - // Create a temporary variable to copy Key in to - UK2Node_TemporaryVariable *ComboActionObjectVar = CompilerContext.SpawnIntermediateNode(this, SourceGraph); - ComboActionObjectVar->VariableType.PinCategory = UEdGraphSchema_K2::PC_Object; - ComboActionObjectVar->VariableType.PinSubCategoryObject = UComboAction::StaticClass(); - ComboActionObjectVar->AllocateDefaultPins(); - - for (auto PinIt = ActivePins.CreateIterator(); PinIt; ++PinIt) + UEdGraphPin *InputActionPin = this->FindPin(PinName, EEdGraphPinDirection::EGPD_Output); + if (InputActionPin && InputActionPin->LinkedTo.Num() > 0) { - UEdGraphPin *EachPin = (*PinIt).GetPin(); + ActivePins.Add(ActivePinData(InputActionPin, Event)); + } + }); + for(const ActivePinData &PinData : ActivePins) + { + UEdGraphPin *ComboActionPin = PinData.Pin; + + if (ComboActionPin->LinkedTo.Num() > 0) + { // Create the combo action event - UK2Node_ComboActionEvent *ComboActionEvent = CompilerContext.SpawnIntermediateEventNode(this, EachPin, SourceGraph); + UK2Node_ComboActionEvent *ComboActionEvent = CompilerContext.SpawnIntermediateEventNode(this, ComboActionPin, SourceGraph); ComboActionEvent->CustomFunctionName = FName(*FString::Printf(TEXT("ComboActionEvent_%s_%s"), *this->GetActionName().ToString(), *ComboActionEvent->GetName())); ComboActionEvent->ComboAction = this->ComboAction; - ComboActionEvent->TriggerEvent = (*PinIt).GetTriggerEvent(); + ComboActionEvent->TriggerEvent = PinData.TriggerEvent; ComboActionEvent->EventReference.SetExternalDelegateMember(FName(TEXT("ComboActionHandlerDynamicSignature__DelegateSignature"))); ComboActionEvent->bInternalEvent = true; ComboActionEvent->AllocateDefaultPins(); @@ -180,35 +205,17 @@ void UK2Node_ComboAction::ExpandNode(FKismetCompilerContext &CompilerContext, UE ComboActionObjectInitialize->AllocateDefaultPins(); Schema->TryCreateConnection(ComboActionObjectVar->GetVariablePin(), ComboActionObjectInitialize->GetVariablePin()); Schema->TryCreateConnection(ComboActionObjectInitialize->GetValuePin(), ComboActionEvent->FindPinChecked(COMBO_ACTION_OBJECT_PIN_NAME)); + // Connect the events to the assign key nodes Schema->TryCreateConnection(Schema->FindExecutionPin(*ComboActionEvent, EGPD_Output), ComboActionObjectInitialize->GetExecPin()); // Move the original event connections to the then pin of the key assign - CompilerContext.MovePinLinksToIntermediate(*EachPin, *ComboActionObjectInitialize->GetThenPin()); + CompilerContext.MovePinLinksToIntermediate(*ComboActionPin, *ComboActionObjectInitialize->GetThenPin()); // Move the original event variable connections to the intermediate nodes CompilerContext.MovePinLinksToIntermediate(*this->FindPin(COMBO_ACTION_OBJECT_PIN_NAME), *ComboActionObjectVar->GetVariablePin()); } - //} - //else if (ActivePins.Num() == 1) - //{ - // UEdGraphPin *ComboActionPin = ActivePins[0].GetPin(); - // EComboActionTriggerEvent ComboActionTriggerEvent = ActivePins[0].GetTriggerEvent(); - - // if (ComboActionPin->LinkedTo.Num() > 0) - // { - // UK2Node_ComboActionEvent *ComboActionEvent = CompilerContext.SpawnIntermediateEventNode(this, ComboActionPin, SourceGraph); - // ComboActionEvent->CustomFunctionName = FName(*FString::Printf(TEXT("ComboActionEvent_%s_%s"), *this->GetActionName().ToString(), *ComboActionEvent->GetName())); - // ComboActionEvent->ComboAction = this->ComboAction; - // ComboActionEvent->TriggerEvent = ComboActionTriggerEvent; - // ComboActionEvent->EventReference.SetExternalDelegateMember(FName(TEXT("ComboActionHandlerDynamicSignature__DelegateSignature"))); - // ComboActionEvent->bInternalEvent = true; - // ComboActionEvent->AllocateDefaultPins(); - - // CompilerContext.MovePinLinksToIntermediate(*ComboActionPin, *Schema->FindExecutionPin(*ComboActionEvent, EGPD_Output)); - // CompilerContext.MovePinLinksToIntermediate(*this->FindPin(COMBO_ACTION_OBJECT_PIN_NAME), *ComboActionEvent->FindPin(COMBO_ACTION_OBJECT_PIN_NAME)); - // } - //} + } } void UK2Node_ComboAction::GetMenuActions(FBlueprintActionDatabaseRegistrar &ActionRegistrar) const