void SGameplayTagGraphPin::ParseDefaultValueData() { FString TagString = GraphPinObj->GetDefaultAsString(); UK2Node_CallFunction* CallFuncNode = Cast<UK2Node_CallFunction>(GraphPinObj->GetOuter()); FilterString.Empty(); if (CallFuncNode) { UFunction* ThisFunction = CallFuncNode->GetTargetFunction(); if (ThisFunction) { if (ThisFunction->HasMetaData(TEXT("GameplayTagFilter"))) { FilterString = ThisFunction->GetMetaData(TEXT("GameplayTagFilter")); } } } if (TagString.StartsWith(TEXT("(")) && TagString.EndsWith(TEXT(")"))) { TagString = TagString.LeftChop(1); TagString = TagString.RightChop(1); TagString.Split("=", NULL, &TagString); if (TagString.StartsWith(TEXT("\"")) && TagString.EndsWith(TEXT("\""))) { TagString = TagString.LeftChop(1); TagString = TagString.RightChop(1); } } if (!TagString.IsEmpty()) { FGameplayTag Tag = IGameplayTagsModule::Get().GetGameplayTagsManager().RequestGameplayTag(FName(*TagString)); TagContainer->AddTag(Tag); } }
FBlueprintCompiledStatement* FKCHandler_MathExpression::GenerateFunctionRPN(UEdGraphNode* CurrentNode, FKismetFunctionContext& Context, UK2Node_MathExpression& MENode, FBPTerminal* ResultTerm, TMap<UEdGraphPin*, UEdGraphPin*>& InnerToOuterInput) { UK2Node_CallFunction* CallFunctionNode = Cast<UK2Node_CallFunction>(CurrentNode); UFunction* Function = CallFunctionNode ? CallFunctionNode->GetTargetFunction() : nullptr; if (!CanBeCalledByMathExpression(Function)) { CompilerContext.MessageLog.Error(*FString::Printf(*LOCTEXT("WrongFunction_Error", "Function '%s' cannot be called inside Math Expression @@ - @@").ToString(), *GetNameSafe(Function)), CallFunctionNode, &MENode); return nullptr; } FBlueprintCompiledStatement* NewDetachedStatement = new FBlueprintCompiledStatement(); FBlueprintCompiledStatement& Statement = *NewDetachedStatement; Statement.FunctionToCall = Function; Statement.FunctionContext = nullptr; Statement.Type = KCST_CallFunction; Statement.LHS = ResultTerm; // required only for the first node check(CallFunctionNode); TArray<FBPTerminal*> RHSTerms; for (TFieldIterator<UProperty> It(Function); It && (It->PropertyFlags & CPF_Parm); ++It) { UProperty* Property = *It; if (Property && !Property->HasAnyPropertyFlags(CPF_ReturnParm | CPF_OutParm)) { UEdGraphPin* PinToTry = nullptr; { UEdGraphPin* PinMatch = CallFunctionNode->FindPin(Property->GetName()); const bool bGoodPin = PinMatch && FKismetCompilerUtilities::IsTypeCompatibleWithProperty(PinMatch, Property, CompilerContext.MessageLog, CompilerContext.GetSchema(), Context.NewClass); PinToTry = bGoodPin ? FEdGraphUtilities::GetNetFromPin(PinMatch) : nullptr; } FBPTerminal* RHSTerm = nullptr; { UEdGraphPin** OuterInputPtr = PinToTry ? InnerToOuterInput.Find(PinToTry) : nullptr; UEdGraphPin* OuterInputNet = (OuterInputPtr && *OuterInputPtr) ? FEdGraphUtilities::GetNetFromPin(*OuterInputPtr) : nullptr; FBPTerminal** OuterTerm = OuterInputNet ? Context.NetMap.Find(OuterInputNet) : nullptr; // Input is an outer term if (OuterTerm && *OuterTerm) { RHSTerm = *OuterTerm; } } if (!RHSTerm) { FBPTerminal** Term = PinToTry ? Context.NetMap.Find(PinToTry) : nullptr; const bool bValidTerm = Term && *Term; // Input is a literal term // Input is a variable if (bValidTerm && ((*Term)->bIsLiteral || (*Term)->AssociatedVarProperty)) { RHSTerm = *Term; } // Input is an InlineGeneratedParameter else if (bValidTerm) { ensure(!(*Term)->InlineGeneratedParameter); UEdGraphNode* SourceNode = PinToTry ? PinToTry->GetOwningNodeUnchecked() : nullptr; FBlueprintCompiledStatement* InlineGeneratedParameterStatement = GenerateFunctionRPN(SourceNode, Context, MENode, nullptr, InnerToOuterInput); if (InlineGeneratedParameterStatement) { Context.AllGeneratedStatements.Add(InlineGeneratedParameterStatement); RHSTerm = *Term; RHSTerm->InlineGeneratedParameter = InlineGeneratedParameterStatement; } } } if (RHSTerm) { RHSTerms.Add(RHSTerm); } else { CompilerContext.MessageLog.Error(*FString::Printf(*LOCTEXT("FindPinParameter_Error", "Could not find a pin for the parameter %s of %s on @@").ToString(), *GetNameSafe(Property), *GetNameSafe(Function)), CallFunctionNode); } } } Statement.RHS = RHSTerms; return &Statement; }