Files
UnrealPrototyping/Source/Salty/Variant_Combat/Gameplay/CombatDamageableBox.cpp
T
Rainer LeitandClaude Fable 5.1 4f2c55cd2a Step 1: the Salty project, two modules, tests and the gym
Salty.uproject (UE 5.8) from the Third Person template with class redirects, the SaltyCore and Salty modules,
the three build targets, USaltyAssetManager calling InitGlobalData, Config/Tags with the 23 root namespaces,
Scripts/run-tests.sh, build.sh and Authoring/create_gym.py, L_Gym, Git LFS attributes and the placeholder test.
Template variants kept as reference (D-41). The four Fab packs stay out of the repository for now (~10 GB).
The editor serves the engine MCP plugin on 127.0.0.1:8000 through DefaultEditorPerProjectUserSettings.ini.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 20:10:43 +03:00

84 lines
2.0 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "CombatDamageableBox.h"
#include "Components/StaticMeshComponent.h"
#include "TimerManager.h"
#include "Engine/World.h"
ACombatDamageableBox::ACombatDamageableBox()
{
PrimaryActorTick.bCanEverTick = false;
// create the mesh
RootComponent = Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("Mesh"));
// set the collision properties
Mesh->SetCollisionProfileName(FName("BlockAllDynamic"));
// enable physics
Mesh->SetSimulatePhysics(true);
// disable navigation relevance so boxes don't affect NavMesh generation
Mesh->bNavigationRelevant = false;
}
void ACombatDamageableBox::RemoveFromLevel()
{
// destroy this actor
Destroy();
}
void ACombatDamageableBox::EndPlay(EEndPlayReason::Type EndPlayReason)
{
Super::EndPlay(EndPlayReason);
// clear the death timer
GetWorld()->GetTimerManager().ClearTimer(DeathTimer);
}
void ACombatDamageableBox::ApplyDamage(float Damage, AActor* DamageCauser, const FVector& DamageLocation, const FVector& DamageImpulse)
{
// only process damage if we still have HP
if (CurrentHP > 0.0f)
{
// apply the damage
CurrentHP -= Damage;
// are we dead?
if (CurrentHP <= 0.0f)
{
HandleDeath();
}
// apply a physics impulse to the box, ignoring its mass
Mesh->AddImpulseAtLocation(DamageImpulse * Mesh->GetMass(), DamageLocation);
// call the BP handler to play effects, etc.
OnBoxDamaged(DamageLocation, DamageImpulse);
}
}
void ACombatDamageableBox::HandleDeath()
{
// change the collision object type to Visibility so we ignore most interactions but still retain physics collisions
Mesh->SetCollisionObjectType(ECC_Visibility);
// call the BP handler to play effects, etc.
OnBoxDestroyed();
// set up the death cleanup timer
GetWorld()->GetTimerManager().SetTimer(DeathTimer, this, &ACombatDamageableBox::RemoveFromLevel, DeathDelayTime);
}
void ACombatDamageableBox::ApplyHealing(float Healing, AActor* Healer)
{
// stub
}
void ACombatDamageableBox::NotifyDanger(const FVector& DangerLocation, AActor* DangerSource)
{
// stub
}