Files
UE5-Modular-Game-Framework/docs/blueprints/08-weapons/74_BPC_FirearmSystem.md
Lefteris Notas eeb1bf82c9 feat: Enhance interaction and inventory systems with new components and functionality
- Added BPC_UsableWorldObjectSystem for handling various interactable world objects with detailed manual implementation guide.
- Introduced BPC_ActiveItemSystem to manage quick slots and active item usage, including cycling and selection logic.
- Implemented BPC_DocumentArchiveSystem for managing collectible documents with read tracking and categorization.
- Developed BPC_JournalSystem for narrative entries with auto-adding features based on gameplay events.
- Created BPC_KeyItemSystem for key management with consumable and persistent key support.
- Enhanced BPC_FirearmSystem for ranged weapon mechanics, including hitscan and projectile firing.
- Updated BPC_MeleeSystem for melee combat with combo and blocking mechanics.
- Established BPC_ReloadSystem for managing weapon reloading processes, including partial reloads and state management.
2026-05-19 18:37:42 +03:00

162 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# BPC_FirearmSystem — Firearm Component
## Blueprint Spec — UE 5.55.7
---
### Parent Class
`ActorComponent`
### Dependencies
- [`BPC_AmmoComponent`](52_BPC_AmmoComponent.md) — Ammo management
- [`BPC_DamageReceptionSystem`](BPC_DamageReceptionSystem.md) — Damage application
- [`BPC_CombatFeedbackComponent`](54_BPC_CombatFeedbackComponent.md) — Visual/audio feedback
- [`BPC_CameraStateLayer`](../02-player/14_BPC_CameraStateLayer.md) — Recoil & ADS
- [`I_Damageable`](../01-core/03_I_InterfaceLibrary.md) — Interface for hit targets
- [`DA_WeaponData`](../14-data-assets/) — Weapon definition
### Purpose
Ranged weapon specialization. Handles line trace / projectile fire, weapon spread, bullet drop simulation, and multi-hit logic. Used by firearms (pistols, rifles, shotguns) and charge weapons.
### Variables
| Name | Type | Description |
|------|------|-------------|
| `FireType` | EFireType | Hitscan, Projectile, Hybrid |
| `ShootEffectType` | EShotEffect | Single, Spread, Charge |
| `Range` | Float | Max effective range (cm) |
| `SpreadAngle` | Float | Base spread in degrees |
| `SpreadRecoveryRate` | Float | Per-second recovery from spread |
| `CurrentSpread` | Float | Running spread (fired recently) |
| `MaxSpread` | Float | Spread cap |
| `BulletsPerShot` | Int | e.g. shotgun = 8 |
| `ProjectileClass` | Actor (Blueprint) | Only for Projectile / Hybrid fire types |
| `FireSocket` | FName | Muzzle attachment point |
| `MuzzleLocation` | USceneComponent | Muzzle transform reference |
| `HitScanImpacts` | Array<FHitResult> | Notify component for decals |
### Enums
| Enum | Values | Description |
|------|--------|-------------|
| `EFireType` | Hitscan, Projectile, Hybrid | Ray → Instant or Bullet actor |
| `EShotEffect` | SingleShot, SpreadShot, ChargeShot | Fire pattern |
### Functions
| Name | Inputs | Outputs | Description |
|------|--------|---------|-------------|
| `PerformHitscanFire` | EWeaponFireMode | Array<FHitResult> | Line trace from camera to crosshair; no bullet |
| `SpawnProjectile` | Direction: FVector | Actor | Spawn projectile actor with initial velocity |
| `CalculateSpread` | — | FVector | Apply random offset within CurrentSpread cone |
| `OnFire_Implementation` | — | — | Override of WeaponBase::OnFire; runs hit scan or spawns projectile |
| `ApplyRecoil` | — | — | Add camera rotation via CameraStateLayer |
| `ConsumeAmmo` | — | — | Delegate to BPC_AmmoComponent |
| `GetEffectiveRange` | — | Float | Return weapon range from data asset |
### Blueprint Flow
```
[OnFire]
└─► If FireType == Hitscan
For i = 1 .. BulletsPerShot:
AimDir = OwnerCamera.ForwardVector + CalculateSpread
PerformHitscanFire returns HitResults
For each hit:
if actor implements I_Damageable:
BPC_DamageReceptionSystem.ApplyDamage(WeaponData.Damage, Hit)
BPC_CombatFeedbackComponent.SpawnImpactFX(Hit)
└─► If FireType == Projectile
For i = 1 .. BulletsPerShot:
AimDir = OwnerCamera.ForwardVector + CalculateSpread
SpawnProjectile(AimDir * WeaponData.ProjectileSpeed)
└─► If FireType == Hybrid
Perform hitscan + spawn projectile for missed overlap area
└─► ApplyRecoil
└─► ConsumeAmmo
└─► BPC_CombatFeedbackComponent.PlayMuzzleFlash
└─► BPC_CombatFeedbackComponent.PlayFireSound
[CalculateSpread]
└─► CurrentSpread = FMath::Min(CurrentSpread + WeaponData.SpreadPerShot, MaxSpread)
└─► Return random vector in cone of CurrentSpread degrees
[OnFireStopped — super]
└─► Begin spread recovery: CurrentSpread → 0 over SpreadRecoveryRate seconds
└─► BPC_CombatFeedbackComponent.StopFireSound
```
### Communications With
| Target | Method | Why |
|--------|--------|-----|
| [`BPC_AmmoComponent`](52_BPC_AmmoComponent.md) | Get Component | Ammo check / consume |
| [`BPC_DamageReceptionSystem`](BPC_DamageReceptionSystem.md) | Get Component | Apply damage to hit targets |
| [`BPC_CombatFeedbackComponent`](54_BPC_CombatFeedbackComponent.md) | Get Component | Muzzle flash, tracers, impact FX |
| [`BPC_CameraStateLayer`](../02-player/14_BPC_CameraStateLayer.md) | Get from Owner | Recoil animation |
| Owner WeaponAnimBP | Animation Instance | Fire / Reload animations |
| HUD Widget | Dispatcher | Ammo count update |
### Reuse Notes
- Hit scan fire uses camera forward, not muzzle forward, for accuracy. Muzzle is for FX only.
- Spread is cumulative while firing, resets on recovery timer.
- Projectile type requires a child BP implementing `AP_BaseProjectile` with velocity and lifetime.
- Renamed from `BP_RangedWeapon` to `BPC_FirearmSystem` per Master naming convention.
- Cross-references updated: `BPC_DamageHandlerComponent``BPC_DamageReceptionSystem`, `BPC_PlayerCameraManager``BPC_CameraStateLayer`, `DA_WeaponData``14-data-assets/`.
---
## Manual Implementation Guide
### Class Setup
1. Create Blueprint Class: Parent = `ActorComponent`, Name = `BPC_FirearmSystem`
2. Attach to `BP_WeaponBase` subclass: `BP_RangedWeapon`
3. Add FireSocket SceneComponent on weapon mesh (muzzle position)
### Variable Init (BeginPlay)
```
Event BeginPlay
├─ Read WeaponData from Owner BP_WeaponBase
├─ Set FireType = WeaponData.FireType (Hitscan/Projectile/Hybrid)
├─ Set Range = WeaponData.EffectiveRange
├─ Set SpreadAngle = WeaponData.BaseSpread
├─ Set BulletsPerShot = WeaponData.PelletsPerShot
├─ Set CurrentSpread = 0.0
└─ Cache: BPC_AmmoComponent, BPC_CombatFeedbackComponent, BPC_CameraStateLayer
```
### Function Node-by-Node
#### `OnFire_Implementation()` *(Overrides BP_WeaponBase.OnFire)*
```
Step 1: Get Camera Forward Vector
Step 2: Switch on FireType:
Hitscan: ForLoop (BulletsPerShot):
AimDir = Forward + CalculateSpread()
LineTraceByChannel: Start=Camera, End=Camera+AimDir*Range
If Hit & Implements I_Damageable: ApplyDamage(WeaponData.Damage, HitResult)
SpawnImpactFX(HitResult)
Projectile: ForLoop (BulletsPerShot):
Spawn ProjectileClass at FireSocket, velocity=AimDir*Speed
Hybrid: Hitscan + projectile for near-miss area
Step 3: ApplyRecoil → CameraShake or AddControllerPitch/Yaw
Step 4: ConsumeAmmo on BPC_AmmoComponent
Step 5: PlayMuzzleFlash + PlayFireSound on CombatFeedback
Step 6: CurrentSpread += SpreadIncreasePerShot (clamped to MaxSpread)
```
#### `CalculateSpread()` → Vector *(Pure)*
```
RandomFloat(-1,1)*CurrentSpread → YawOffset
RandomFloat(-1,1)*CurrentSpread → PitchOffset
MakeRotator(PitchOffset, YawOffset, 0) → GetForwardVector
```
### Build Checklist
- [ ] Create BPC_FirearmSystem, attach to BP_RangedWeapon
- [ ] Add FireSocket at muzzle
- [ ] Implement OnFire with hitscan/projectile/hybrid switch
- [ ] Implement CalculateSpread
- [ ] Wire to AmmoComponent, CombatFeedback, CameraStateLayer
- [ ] Create ProjectileClass with ProjectileMovement for projectile weapons
- [ ] Test: fire at target → damage registers → FX plays → ammo count drops