void ABaseCharacter::OnDeath(float KillingDamage, FDamageEvent const& DamageEvent, APawn* PawnInstigator, AActor* DamageCauser) { bReplicateMovement = false; bTearOff = true; PlayHit(true, KillingDamage, DamageEvent, PawnInstigator, DamageCauser); DetachFromControllerPendingDestroy(); /* Disable all collision on capsule */ UCapsuleComponent* CapsuleComp = GetCapsuleComponent(); CapsuleComp->SetCollisionEnabled(ECollisionEnabled::NoCollision); CapsuleComp->SetCollisionResponseToAllChannels(ECR_Ignore); if(bRagdolledAfterDeath) { SetRagdollPhysics(); ApplyPhysicsToTheRagdolledBody(DamageEvent); } else { SetLifeSpan(TimeAfterDeathBeforeDestroy); } }
APlayerProxy::APlayerProxy() { bReplicates = true; // It seems that without a RootComponent, we can't place the Actual Character easily UCapsuleComponent* TouchCapsule = CreateDefaultSubobject<UCapsuleComponent>(TEXT("dummy")); TouchCapsule->InitCapsuleSize(1.0f, 1.0f); TouchCapsule->SetCollisionEnabled(ECollisionEnabled::NoCollision); TouchCapsule->SetCollisionResponseToAllChannels(ECR_Ignore); RootComponent = TouchCapsule; if (Role == ROLE_Authority) { static ConstructorHelpers::FObjectFinder<UClass> PlayerPawnBPClass(TEXT("/Game/Blueprints/MyCharacter.MyCharacter_C")); CharacterClass = PlayerPawnBPClass.Object; } }
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); } } }
AShooterPickup::AShooterPickup(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { UCapsuleComponent* CollisionComp = ObjectInitializer.CreateDefaultSubobject<UCapsuleComponent>(this, TEXT("CollisionComp")); CollisionComp->InitCapsuleSize(40.0f, 50.0f); CollisionComp->SetCollisionObjectType(COLLISION_PICKUP); CollisionComp->SetCollisionEnabled(ECollisionEnabled::QueryOnly); CollisionComp->SetCollisionResponseToAllChannels(ECR_Ignore); CollisionComp->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); RootComponent = CollisionComp; PickupPSC = ObjectInitializer.CreateDefaultSubobject<UParticleSystemComponent>(this, TEXT("PickupFX")); PickupPSC->bAutoActivate = false; PickupPSC->bAutoDestroy = false; PickupPSC->AttachParent = RootComponent; RespawnTime = 10.0f; bIsActive = false; PickedUpBy = NULL; SetRemoteRoleForBackwardsCompat(ROLE_SimulatedProxy); bReplicates = true; }