void UATAnimNotifyState_Attack::NotifyEnd(USkeletalMeshComponent * MeshComp, UAnimSequenceBase * Animation) { if (MeshComp->GetWorld()->GetNetMode() == NM_DedicatedServer) { return; } AATCharacter* Pawn = Cast<AATCharacter>(MeshComp->GetOwner()); if (Pawn && bIsConsecutively && Pawn->AttackType > EAttackType::EAttack_None) { Pawn->Attack(EAttackType::EAttack_Consecutively, NextAnimation); } bIsConsecutively = false; Received_NotifyEnd(MeshComp, Animation); }
void UAnimNotifyState_TimedParticleEffect::NotifyEnd(USkeletalMeshComponent * MeshComp, class UAnimSequenceBase * Animation) { TArray<USceneComponent*> Children; MeshComp->GetChildrenComponents(false, Children); for(USceneComponent* Component : Children) { if(UParticleSystemComponent* ParticleComponent = Cast<UParticleSystemComponent>(Component)) { bool bSocketMatch = ParticleComponent->AttachSocketName == SocketName; bool bTemplateMatch = ParticleComponent->Template == PSTemplate; #if WITH_EDITORONLY_DATA // In editor someone might have changed our parameters while we're ticking; so check // previous known parameters too. bSocketMatch |= PreviousSocketNames.Contains(ParticleComponent->AttachSocketName); bTemplateMatch |= PreviousPSTemplates.Contains(ParticleComponent->Template); #endif if(bSocketMatch && bTemplateMatch && !ParticleComponent->bWasDeactivated) { // Either destroy the component or deactivate it to have it's active particles finish. // The component will auto destroy once all particle are gone. if(bDestroyAtEnd) { ParticleComponent->DestroyComponent(); } else { ParticleComponent->bAutoDestroy = true; ParticleComponent->DeactivateSystem(); } #if WITH_EDITORONLY_DATA // No longer need to track previous values as we've found our component // and removed it. PreviousPSTemplates.Empty(); PreviousSocketNames.Empty(); #endif // Removed a component, no need to continue break; } } } Received_NotifyEnd(MeshComp, Animation); }