void UAnimGraphNode_BoneDrivenController::ValidateAnimNodeDuringCompilation(USkeleton* ForSkeleton, FCompilerResultsLog& MessageLog) { if (ForSkeleton->GetReferenceSkeleton().FindBoneIndex(Node.SourceBone.BoneName) == INDEX_NONE) { MessageLog.Warning(*LOCTEXT("NoSourceBone", "@@ - You must pick a source bone as the Driver joint").ToString(), this); } if (Node.SourceComponent == EComponentType::None) { MessageLog.Warning(*LOCTEXT("NoSourceComponent", "@@ - You must pick a source component on the Driver joint").ToString(), this); } if (ForSkeleton->GetReferenceSkeleton().FindBoneIndex(Node.TargetBone.BoneName) == INDEX_NONE) { MessageLog.Warning(*LOCTEXT("NoTargetBone", "@@ - You must pick a target bone as the Driven joint").ToString(), this); } const bool bAffectsTranslation = Node.bAffectTargetTranslationX || Node.bAffectTargetTranslationY || Node.bAffectTargetTranslationZ; const bool bAffectsRotation = Node.bAffectTargetRotationX || Node.bAffectTargetRotationY || Node.bAffectTargetRotationZ; const bool bAffectsScale = Node.bAffectTargetScaleX || Node.bAffectTargetScaleY || Node.bAffectTargetScaleZ; if (!bAffectsTranslation && !bAffectsRotation && !bAffectsScale) { MessageLog.Warning(*LOCTEXT("NoTargetComponent", "@@ - You must pick one or more target components on the Driven joint").ToString(), this); } Super::ValidateAnimNodeDuringCompilation(ForSkeleton, MessageLog); }
void USimpleConstructionScript::ValidateNodeVariableNames(FCompilerResultsLog& MessageLog) { UBlueprint* Blueprint = GetBlueprint(); check(Blueprint); TSharedPtr<FKismetNameValidator> ParentBPNameValidator; if( Blueprint->ParentClass != NULL ) { UBlueprint* ParentBP = Cast<UBlueprint>(Blueprint->ParentClass->ClassGeneratedBy); if( ParentBP != NULL ) { ParentBPNameValidator = MakeShareable(new FKismetNameValidator(ParentBP)); } } TSharedPtr<FKismetNameValidator> CurrentBPNameValidator = MakeShareable(new FKismetNameValidator(Blueprint)); TArray<USCS_Node*> Nodes = GetAllNodes(); int32 Counter=0; for (int32 NodeIndex=0; NodeIndex < Nodes.Num(); ++NodeIndex) { USCS_Node* Node = Nodes[NodeIndex]; if( Node && Node->ComponentTemplate && Node != DefaultSceneRootNode ) { // Replace missing or invalid component variable names if( Node->VariableName == NAME_None || Node->bVariableNameAutoGenerated_DEPRECATED || !FComponentEditorUtils::IsValidVariableNameString(Node->ComponentTemplate, Node->VariableName.ToString()) ) { FName OldName = Node->VariableName; // Generate a new default variable name for the component. Node->VariableName = GenerateNewComponentName(Node->ComponentTemplate->GetClass()); Node->bVariableNameAutoGenerated_DEPRECATED = false; if( OldName != NAME_None ) { FBlueprintEditorUtils::ReplaceVariableReferences(Blueprint, OldName, Node->VariableName); MessageLog.Warning(*FString::Printf(TEXT("Found a component variable with an invalid name (%s) - changed to %s."), *OldName.ToString(), *Node->VariableName.ToString())); } } else if( ParentBPNameValidator.IsValid() && ParentBPNameValidator->IsValid(Node->VariableName) != EValidatorResult::Ok ) { FName OldName = Node->VariableName; FName NewVariableName = FBlueprintEditorUtils::FindUniqueKismetName(Blueprint, OldName.ToString()); FBlueprintEditorUtils::RenameMemberVariable(Blueprint, OldName, NewVariableName ); MessageLog.Warning(*FString::Printf(TEXT("Found a component variable with a conflicting name (%s) - changed to %s."), *OldName.ToString(), *Node->VariableName.ToString())); } } } }
void UAnimGraphNode_ModifyBone::ValidateAnimNodeDuringCompilation(USkeleton* ForSkeleton, FCompilerResultsLog& MessageLog) { if (ForSkeleton->GetReferenceSkeleton().FindBoneIndex(Node.BoneToModify.BoneName) == INDEX_NONE) { MessageLog.Warning(*LOCTEXT("NoBoneToModify", "@@ - You must pick a bone to modify").ToString(), this); } if ((Node.TranslationMode == BMM_Ignore) && (Node.RotationMode == BMM_Ignore) && (Node.ScaleMode == BMM_Ignore)) { MessageLog.Warning(*LOCTEXT("NothingToModify", "@@ - No components to modify selected. Either Rotation, Translation, or Scale should be set to something other than Ignore").ToString(), this); } Super::ValidateAnimNodeDuringCompilation(ForSkeleton, MessageLog); }
void FKismetCompilerUtilities::ValidateEnumProperties(UObject* DefaultObject, FCompilerResultsLog& MessageLog) { check(DefaultObject); for (TFieldIterator<UProperty> It(DefaultObject->GetClass()); It; ++It) { const UByteProperty* ByteProperty = Cast<UByteProperty>(*It); if(ByteProperty && !ByteProperty->HasAnyPropertyFlags(CPF_Transient)) { const UEnum* Enum = ByteProperty->GetIntPropertyEnum(); if(Enum) { const uint8 EnumIndex = ByteProperty->GetPropertyValue_InContainer(DefaultObject); const int32 EnumAcceptableMax = Enum->NumEnums() - 1; if(EnumIndex >= EnumAcceptableMax) { MessageLog.Warning( *FString::Printf( *LOCTEXT("InvalidEnumDefaultValue_Error", "Default Enum value '%s' for class '%s' is invalid in object '%s' ").ToString(), *ByteProperty->GetName(), *DefaultObject->GetClass()->GetName(), *DefaultObject->GetName() ) ); } } } } }
void UAnimGraphNode_TwistCorrectiveNode::ValidateAnimNodeDuringCompilation(USkeleton* ForSkeleton, FCompilerResultsLog& MessageLog) { if (Node.Curve.Name == NAME_None) { MessageLog.Warning(TEXT("@@ has missing Curve Name."), this); } Super::ValidateAnimNodeDuringCompilation(ForSkeleton, MessageLog); }
void FUserDefinedStructureCompilerUtils::DefaultUserDefinedStructs(UObject* Object, FCompilerResultsLog& MessageLog) { if (Object && FStructureEditorUtils::UserDefinedStructEnabled()) { for (TFieldIterator<UProperty> It(Object->GetClass()); It; ++It) { if (const UProperty* Property = (*It)) { uint8* Mem = Property->ContainerPtrToValuePtr<uint8>(Object); if (!FStructureEditorUtils::Fill_MakeStructureDefaultValue(Property, Mem)) { MessageLog.Warning(*FString::Printf(*LOCTEXT("MakeStructureDefaultValue_Error", "MakeStructureDefaultValue parsing error. Object: %s, Property: %s").ToString(), *Object->GetName(), *Property->GetName())); } } } } }
static void CheckOutputsParametersInDelegateSignature(const UFunction* SignatureFunc, const UK2Node * DelegateNode, FCompilerResultsLog& MessageLog) { for (TFieldIterator<UProperty> PropIt(SignatureFunc); PropIt && (PropIt->PropertyFlags & CPF_Parm); ++PropIt) { UProperty* FuncParam = *PropIt; if (FuncParam->HasAllPropertyFlags(CPF_OutParm) && !FuncParam->HasAllPropertyFlags(CPF_ConstParm)) { const bool bIsArray = FuncParam->IsA<UArrayProperty>(); // array is always passed by reference, see FKismetCompilerContext::CreatePropertiesFromList const FString MessageStr = FString::Printf( *LOCTEXT("DelegatesDontSupportRef", "Event Dispatcher: No value will be return by reference. Parameter '%s'. Node '@@'").ToString(), *FuncParam->GetName()); if (bIsArray) { MessageLog.Note(*MessageStr,DelegateNode); } else { MessageLog.Warning(*MessageStr, DelegateNode); } } } }
void UK2Node_DynamicCast::ValidateNodeDuringCompilation(FCompilerResultsLog& MessageLog) const { Super::ValidateNodeDuringCompilation(MessageLog); UEdGraphPin* SourcePin = GetCastSourcePin(); if (SourcePin->LinkedTo.Num() > 0) { const UClass* SourceType = *TargetType; if (SourceType == nullptr) { return; } for (UEdGraphPin* CastInput : SourcePin->LinkedTo) { const FEdGraphPinType& SourcePinType = CastInput->PinType; if (SourcePinType.PinCategory != UEdGraphSchema_K2::PC_Object) { // all other types should have been rejected by IsConnectionDisallowed() continue; } UClass* SourceClass = Cast<UClass>(SourcePinType.PinSubCategoryObject.Get()); if ((SourceClass == nullptr) && (SourcePinType.PinSubCategory == UEdGraphSchema_K2::PSC_Self)) { if (UK2Node* K2Node = Cast<UK2Node>(CastInput->GetOwningNode())) { SourceClass = K2Node->GetBlueprint()->GeneratedClass; } } if (SourceClass == nullptr) { const FString SourcePinName = CastInput->PinFriendlyName.IsEmpty() ? CastInput->PinName : CastInput->PinFriendlyName.ToString(); FText const ErrorFormat = LOCTEXT("BadCastInput", "'%s' does not have a clear object type (invalid input into @@)."); MessageLog.Error( *FString::Printf(*ErrorFormat.ToString(), *SourcePinName), this ); continue; } if (SourceClass == SourceType) { const FString SourcePinName = CastInput->PinFriendlyName.IsEmpty() ? CastInput->PinName : CastInput->PinFriendlyName.ToString(); FText const WarningFormat = LOCTEXT("EqualObjectCast", "'%s' is already a '%s', you don't need @@."); MessageLog.Warning( *FString::Printf(*WarningFormat.ToString(), *SourcePinName, *TargetType->GetDisplayNameText().ToString()), this ); } else if (SourceClass->IsChildOf(SourceType)) { const FString SourcePinName = CastInput->PinFriendlyName.IsEmpty() ? CastInput->PinName : CastInput->PinFriendlyName.ToString(); FText const WarningFormat = LOCTEXT("UnneededObjectCast", "'%s' is already a '%s' (which inherits from '%s'), so you don't need @@."); MessageLog.Warning( *FString::Printf(*WarningFormat.ToString(), *SourcePinName, *SourceClass->GetDisplayNameText().ToString(), *TargetType->GetDisplayNameText().ToString()), this ); } else if (!SourceType->IsChildOf(SourceClass) && !FKismetEditorUtilities::IsClassABlueprintInterface(SourceType)) { FText const WarningFormat = LOCTEXT("DisallowedObjectCast", "'%s' does not inherit from '%s' (@@ would always fail)."); MessageLog.Warning( *FString::Printf(*WarningFormat.ToString(), *TargetType->GetDisplayNameText().ToString(), *SourceClass->GetDisplayNameText().ToString()), this ); } } } }