UMulticastDelegateProperty* UK2Node_ActorBoundEvent::GetTargetDelegateProperty() { auto ActualEventSignatureClass = FActorBoundEventHelper::GetSignatureClass(this); if (!EventSignatureClass && ActualEventSignatureClass) { EventSignatureClass = ActualEventSignatureClass; } UMulticastDelegateProperty* TargetDelegateProp = Cast<UMulticastDelegateProperty>(FindField<UMulticastDelegateProperty>(EventSignatureClass, DelegatePropertyName)); // If we couldn't find the target delegate, then try to find it in the property remap table if (!TargetDelegateProp) { UMulticastDelegateProperty* NewProperty = Cast<UMulticastDelegateProperty>(FindRemappedField(EventSignatureClass, DelegatePropertyName)); if (NewProperty) { // Found a remapped property, update the node TargetDelegateProp = NewProperty; DelegatePropertyName = NewProperty->GetFName(); EventSignatureClass = Cast<UClass>(NewProperty->GetOuter()); CachedNodeTitle.MarkDirty(); } } return TargetDelegateProp; }
static UMulticastDelegateProperty* FindAndCheckDelegateProperty(FKismetFunctionContext& Context, UK2Node_BaseMCDelegate * DelegateNode, FCompilerResultsLog& MessageLog, const UEdGraphSchema_K2* Schema) { check(NULL != DelegateNode); UEdGraphPin* Pin = Schema->FindSelfPin(*DelegateNode, EEdGraphPinDirection::EGPD_Input); UStruct* DelegateScope = Pin ? Context.GetScopeFromPinType(Pin->PinType, Context.NewClass) : NULL; // Early out if we have no pin. That means the delegate is no longer valid, and we need to terminate gracefully if (!Pin || !DelegateScope) { MessageLog.Error(*LOCTEXT("NoDelegateProperty", "Event Dispatcher has no property @@").ToString(), DelegateNode); return NULL; } // Don't use DelegateNode->GetProperty(), because we don't want any property from skeletal class UClass* PropertyOwnerClass = CastChecked<UClass>(DelegateScope); UMulticastDelegateProperty* BoundProperty = NULL; for (TFieldIterator<UMulticastDelegateProperty> It(PropertyOwnerClass); It; ++It) { UMulticastDelegateProperty* Prop = *It; if (DelegateNode->GetPropertyName() == Prop->GetFName()) { BoundProperty = Prop; break; } } if (!BoundProperty) { FString const OwnerName = PropertyOwnerClass->GetName(); FString const PropName = DelegateNode->GetPropertyName().ToString(); FText const ErrorFormat = LOCTEXT("DelegateNotFound", "Could not find an event-dispatcher named \"%s\" in '%s'.\nMake sure '%s' has been compiled for @@"); MessageLog.Error(*FString::Printf(*ErrorFormat.ToString(), *PropName, *OwnerName, *OwnerName), DelegateNode); return NULL; } { // MulticastDelegateProperty from NewClass may have empty signature, but property from skeletal class should have it. const UFunction* OrgSignature = DelegateNode->GetDelegateSignature(); if(const UEdGraphPin* DelegatePin = DelegateNode->GetDelegatePin()) { const UFunction* PinSignature = FMemberReference::ResolveSimpleMemberReference<UFunction>(DelegatePin->PinType.PinSubCategoryMemberReference); if (!OrgSignature || !PinSignature || !OrgSignature->IsSignatureCompatibleWith(PinSignature)) { MessageLog.Error(*LOCTEXT("WrongDelegate", "Wrong Event Dispatcher. Refresh node @@").ToString(), DelegateNode); return NULL; } } CheckOutputsParametersInDelegateSignature(OrgSignature, DelegateNode, MessageLog); } return BoundProperty; }
UFunction* UK2Node_DelegateSet::GetDelegateSignature() { UMulticastDelegateProperty* DelegateProperty = FindField<UMulticastDelegateProperty>(DelegatePropertyClass, DelegatePropertyName); if( !DelegateProperty ) { // Attempt to find a remapped delegate property UMulticastDelegateProperty* NewProperty = Cast<UMulticastDelegateProperty>(FMemberReference::FindRemappedField(DelegatePropertyClass, DelegatePropertyName)); if( NewProperty ) { // Found a remapped property, update the node DelegateProperty = NewProperty; DelegatePropertyName = NewProperty->GetFName(); DelegatePropertyClass = Cast<UClass>(NewProperty->GetOuter()); } } return (DelegateProperty != NULL) ? DelegateProperty->SignatureFunction : NULL; }