bool UK2Node_Variable::HasExternalBlueprintDependencies(TArray<class UStruct*>* OptionalOutput) const { UClass* SourceClass = GetVariableSourceClass(); UBlueprint* SourceBlueprint = GetBlueprint(); const bool bResult = (SourceClass && (SourceClass->ClassGeneratedBy != NULL) && (SourceClass->ClassGeneratedBy != SourceBlueprint)); if (bResult && OptionalOutput) { OptionalOutput->Add(SourceClass); } return bResult || Super::HasExternalBlueprintDependencies(OptionalOutput); }
bool UK2Node_Variable::RemapRestrictedLinkReference(FName OldVariableName, FName NewVariableName, const UClass* MatchInVariableClass, const UClass* RemapIfLinkedToClass, bool bLogWarning) { bool bRemapped = false; if (VariableReference.GetMemberName() == OldVariableName) { UClass* const VarClass = GetVariableSourceClass(); if (VarClass->IsChildOf(MatchInVariableClass)) { UEdGraphPin* VariablePin = GetValuePin(); if (VariablePin) { for (UEdGraphPin* OtherPin : VariablePin->LinkedTo) { if (OtherPin != nullptr && VariablePin->PinType.PinCategory == OtherPin->PinType.PinCategory) { // If any other pin we are linked to is a more restricted type, we need to do the remap. const UClass* OtherPinClass = Cast<UClass>(OtherPin->PinType.PinSubCategoryObject.Get()); if (OtherPinClass && OtherPinClass->IsChildOf(RemapIfLinkedToClass)) { if (VariableReference.IsSelfContext()) { VariableReference.SetSelfMember(NewVariableName); } else { VariableReference.SetExternalMember(NewVariableName, VarClass); } bRemapped = true; break; } } } } } } if (bRemapped && bLogWarning && GetBlueprint()) { FMessageLog("BlueprintLog").Warning( FText::Format( LOCTEXT("RemapRestrictedLinkReference", "{0}: Variable '{1}' was automatically changed to '{2}'. Verify that logic works as intended. (This warning will disappear once the blueprint has been resaved)"), FText::FromString(GetBlueprint()->GetPathName()), FText::FromString(MatchInVariableClass->GetName() + TEXT(".") + OldVariableName.ToString()), FText::FromString(MatchInVariableClass->GetName() + TEXT(".") + NewVariableName.ToString()) )); } return bRemapped; }
FName UK2Node_Variable::GetPaletteIcon(FLinearColor& ColorOut) const { FName ReturnIconName; if(VariableReference.IsLocalScope()) { ReturnIconName = GetVariableIconAndColor(VariableReference.GetMemberScope(GetBlueprintClassFromNode()), GetVarName(), ColorOut); } else { ReturnIconName = GetVariableIconAndColor(GetVariableSourceClass(), GetVarName(), ColorOut); } return ReturnIconName; }
void UK2Node_Variable::ReconstructNode() { // update the variable reference if the property was renamed UClass* const VarClass = GetVariableSourceClass(); if (VarClass) { bool bRemappedProperty = false; UClass* SearchClass = VarClass; while (SearchClass != NULL) { const TMap<FName, FName>* const ClassTaggedPropertyRedirects = UStruct::TaggedPropertyRedirects.Find( SearchClass->GetFName() ); if (ClassTaggedPropertyRedirects) { const FName* const NewPropertyName = ClassTaggedPropertyRedirects->Find( VariableReference.GetMemberName() ); if (NewPropertyName) { if (VariableReference.IsSelfContext()) { VariableReference.SetSelfMember( *NewPropertyName ); } else { VariableReference.SetExternalMember( *NewPropertyName, VarClass ); } // found, can break bRemappedProperty = true; break; } } SearchClass = SearchClass->GetSuperClass(); } if (!bRemappedProperty) { static FName OldVariableName(TEXT("UpdatedComponent")); static FName NewVariableName(TEXT("UpdatedPrimitive")); bRemappedProperty = RemapRestrictedLinkReference(OldVariableName, NewVariableName, UMovementComponent::StaticClass(), UPrimitiveComponent::StaticClass(), true); } } const FGuid VarGuid = VariableReference.GetMemberGuid(); if (VarGuid.IsValid()) { const FName VarName = UBlueprint::GetFieldNameFromClassByGuid<UProperty>(VarClass, VarGuid); if (VarName != NAME_None && VarName != VariableReference.GetMemberName()) { if (VariableReference.IsSelfContext()) { VariableReference.SetSelfMember( VarName ); } else { VariableReference.SetExternalMember( VarName, VarClass ); } } } Super::ReconstructNode(); }