void ACharacter::ApplyDamageMomentum(float DamageTaken, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser) { UDamageType const* const DmgTypeCDO = DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>(); float const ImpulseScale = DmgTypeCDO->DamageImpulse; if ( (ImpulseScale > 3.f) && (CharacterMovement != NULL) ) { FHitResult HitInfo; FVector ImpulseDir; DamageEvent.GetBestHitInfo(this, PawnInstigator, HitInfo, ImpulseDir); FVector Impulse = ImpulseDir * ImpulseScale; bool const bMassIndependentImpulse = !DmgTypeCDO->bScaleMomentumByMass; // limit Z momentum added if already going up faster than jump (to avoid blowing character way up into the sky) { FVector MassScaledImpulse = Impulse; if(!bMassIndependentImpulse && CharacterMovement->Mass > SMALL_NUMBER) { MassScaledImpulse = MassScaledImpulse / CharacterMovement->Mass; } if ( (CharacterMovement->Velocity.Z > GetDefault<UCharacterMovementComponent>(CharacterMovement->GetClass())->JumpZVelocity) && (MassScaledImpulse.Z > 0.f) ) { Impulse.Z *= 0.5f; } } CharacterMovement->AddImpulse(Impulse, bMassIndependentImpulse); } }
void ACharacter::ApplyDamageMomentum(float DamageTaken, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser) { UDamageType const* const DmgTypeCDO = DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>(); float const ImpulseScale = DmgTypeCDO->DamageImpulse; if ( (ImpulseScale > 3.f) && (CharacterMovement != NULL) ) { FHitResult HitInfo; FVector ImpulseDir; DamageEvent.GetBestHitInfo(this, PawnInstigator, HitInfo, ImpulseDir); FVector Impulse = ImpulseDir * ImpulseScale; bool const bMassIndependentImpulse = !DmgTypeCDO->bScaleMomentumByMass; CharacterMovement->AddMomentum(Impulse, HitInfo.ImpactPoint, bMassIndependentImpulse); } }