#include "SpaceshipProjectile.h" #include "GameFramework/ProjectileMovementComponent.h" #include "Components/StaticMeshComponent.h" #include "EnemySpaceship.h" ASpaceshipProjectile::ASpaceshipProjectile() { PrimaryActorTick.bCanEverTick = true; // Create and setup the projectile mesh ProjectileMesh = CreateDefaultSubobject(TEXT("ProjectileMesh")); RootComponent = ProjectileMesh; ProjectileMesh->SetCollisionProfileName(TEXT("Projectile")); ProjectileMesh->OnComponentHit.AddDynamic(this, &ASpaceshipProjectile::OnHit); // Set up collision ProjectileMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); ProjectileMesh->SetCollisionObjectType(ECC_WorldDynamic); ProjectileMesh->SetCollisionResponseToAllChannels(ECR_Ignore); ProjectileMesh->SetCollisionResponseToChannel(ECC_Pawn, ECR_Block); // Block pawns (enemies) ProjectileMesh->SetCollisionResponseToChannel(ECC_WorldStatic, ECR_Block); // Block world static ProjectileMesh->SetGenerateOverlapEvents(true); // Bind hit event ProjectileMesh->OnComponentHit.AddDynamic(this, &ASpaceshipProjectile::OnHit); // Create and setup projectile movement ProjectileMovement = CreateDefaultSubobject(TEXT("ProjectileMovement")); ProjectileMovement->UpdatedComponent = ProjectileMesh; ProjectileMovement->InitialSpeed = ProjectileSpeed; ProjectileMovement->MaxSpeed = ProjectileSpeed; ProjectileMovement->bRotationFollowsVelocity = true; ProjectileMovement->ProjectileGravityScale = 0.0f; // Set lifetime InitialLifeSpan = 3.0f; } void ASpaceshipProjectile::BeginPlay() { Super::BeginPlay(); } void ASpaceshipProjectile::OnHit(UPrimitiveComponent* HitComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, FVector NormalImpulse, const FHitResult& Hit) { // Debug message to verify hit detection if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Yellow, FString::Printf(TEXT("Projectile hit: %s"), *OtherActor->GetName())); } if (OtherActor && OtherActor != this) { // Check if we hit an enemy AEnemySpaceship* Enemy = Cast(OtherActor); if (Enemy) { // Apply damage FDamageEvent DamageEvent; Enemy->TakeDamage(DamageAmount, DamageEvent, nullptr, this); // Debug message for damage if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Red, FString::Printf(TEXT("Dealt %f damage to enemy"), DamageAmount)); } } } // Destroy the projectile Destroy(); }