void ABaseCharacter::ApplyPhysicsToTheRagdolledBody(FDamageEvent const& DamageEvent)
{
	if (bRagdolledAfterDeath)
	{
		USkeletalMeshComponent* Mesh3P = GetMesh();
		if (Mesh3P)
		{
			/* Apply physics impulse on the bone of the enemy skeleton mesh we hit (ray-trace damage only) */
			if (DamageEvent.IsOfType(FPointDamageEvent::ClassID))
			{
				FPointDamageEvent PointDmg = *((FPointDamageEvent*)&DamageEvent);

				// TODO: Use DamageTypeClass->DamageImpulse
				Mesh3P->AddImpulseAtLocation(PointDmg.ShotDirection * 12000, PointDmg.HitInfo.ImpactPoint, PointDmg.HitInfo.BoneName);

			}
			if (DamageEvent.IsOfType(FRadialDamageEvent::ClassID))
			{
				FRadialDamageEvent RadialDmg = *((FRadialDamageEvent const*)(&DamageEvent));

				Mesh3P->AddRadialImpulse(RadialDmg.Origin, RadialDmg.Params.GetMaxRadius(), 100000 /*RadialDmg.DamageTypeClass->DamageImpulse*/, ERadialImpulseFalloff::RIF_Linear);
			}
		}
	}
}
Esempio n. 2
0
void UDestructibleComponent::ReceiveComponentDamage(float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser)
{
	UDamageType const* const DamageTypeCDO = DamageEvent.DamageTypeClass ? DamageEvent.DamageTypeClass->GetDefaultObject<UDamageType>() : GetDefault<UDamageType>();
	if (DamageEvent.IsOfType(FPointDamageEvent::ClassID))
	{
		FPointDamageEvent const* const PointDamageEvent = (FPointDamageEvent*)(&DamageEvent);
		ApplyDamage(DamageAmount, PointDamageEvent->HitInfo.ImpactPoint, PointDamageEvent->ShotDirection, DamageTypeCDO->DestructibleImpulse);
	}
	else if (DamageEvent.IsOfType(FRadialDamageEvent::ClassID))
	{
		FRadialDamageEvent const* const RadialDamageEvent = (FRadialDamageEvent*)(&DamageEvent);
		ApplyRadiusDamage(DamageAmount, RadialDamageEvent->Origin, RadialDamageEvent->Params.OuterRadius, DamageTypeCDO->DestructibleImpulse, false);
	}
}
Esempio n. 3
0
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);
    }
}
Esempio n. 4
0
void AShooterCharacter::OnDeath(float KillingDamage, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser)
{
	if (bIsDying)
	{
		return;
	}

	bReplicateMovement = false;
	bTearOff = true;
	bIsDying = true;

	PlayHit(KillingDamage, DamageEvent, PawnInstigator, DamageCauser, true);

	DetachFromControllerPendingDestroy();

	/* Disable all collision on capsule */
	UCapsuleComponent* CapsuleComp = GetCapsuleComponent();
	CapsuleComp->SetCollisionEnabled(ECollisionEnabled::NoCollision);
	CapsuleComp->SetCollisionResponseToAllChannels(ECR_Ignore);

	USkeletalMeshComponent* Mesh3P = GetMesh();
	if (Mesh3P)
	{
		Mesh3P->SetCollisionProfileName(TEXT("Ragdoll"));
	}
	SetActorEnableCollision(true);

	SetRagdollPhysics();

	/* Apply physics impulse on the bone of the enemy skeleton mesh we hit (ray-trace damage only) */
	if (DamageEvent.IsOfType(FPointDamageEvent::ClassID))
	{
		FPointDamageEvent PointDmg = *((FPointDamageEvent*)(&DamageEvent));
		{
			// TODO: Use DamageTypeClass->DamageImpulse
			Mesh3P->AddImpulseAtLocation(PointDmg.ShotDirection * 12000, PointDmg.HitInfo.ImpactPoint, PointDmg.HitInfo.BoneName);
		}
	}
	if (DamageEvent.IsOfType(FRadialDamageEvent::ClassID))
	{
		FRadialDamageEvent RadialDmg = *((FRadialDamageEvent const*)(&DamageEvent));
		{
			Mesh3P->AddRadialImpulse(RadialDmg.Origin, RadialDmg.Params.GetMaxRadius(), 100000 /*RadialDmg.DamageTypeClass->DamageImpulse*/, ERadialImpulseFalloff::RIF_Linear);
		}
	}
}
Esempio n. 5
0
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);
	}
}
/** Called when this component receives damage */
void UFluidSurfaceComponent::ReceiveComponentDamage( float DamageAmount, FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser )
{
	Super::ReceiveComponentDamage( DamageAmount, DamageEvent, EventInstigator, DamageCauser );

	FVector HitLocation;
	if( DamageEvent.IsOfType( FPointDamageEvent::ClassID ) )
	{
		FPointDamageEvent const* const PointDamageEvent = (FPointDamageEvent*) ( &DamageEvent );
		Pling( PointDamageEvent->HitInfo.ImpactPoint, ShootStrength, ShootRadius );

		HitLocation = PointDamageEvent->HitInfo.ImpactPoint;
	}

	if( ShootEffect )
	{
		/* Spawn shoot effect emitter */
		FRotator Rotation = FRotator( 0, 0, 0 );
		AEmitter* Emitter = GetWorld( )->SpawnActor<AEmitter>( HitLocation, Rotation );
		Emitter->ParticleSystemComponent->SetTemplate( ShootEffect );
	}
}