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.
This commit is contained in:
Lefteris Notas
2026-05-19 18:37:42 +03:00
parent f272257cb3
commit eeb1bf82c9
11 changed files with 1361 additions and 11 deletions

View File

@@ -59,4 +59,106 @@
- ReloadMontage from DA_WeaponData per weapon; swap for each weapon type
- Partial reload enabled per weapon (e.g. shotguns use individual shell reloads)
- AmmoTypeTag links to correct ammo pool in BPC_AmmoResourceSystem
- AmmoTypeTag links to correct ammo pool in BPC_AmmoResourceSystem
---
## Manual Implementation Guide
### Class Setup
1. Create Blueprint Class: Parent = `ActorComponent`, Name = `BPC_ReloadSystem`
2. Attach to `BP_WeaponBase` or `BPC_FirearmSystem`
3. Weapon must have a `ReloadMontage` with Animation Notifies
### Variable Init (BeginPlay)
```
Event BeginPlay
├─ Set bIsReloading = false
├─ Set bPartialReload = false
├─ Get Owner → Read DA_WeaponData → Load ReloadMontage, AmmoTypeTag, MagazineSize
└─ Cache: BPC_AmmoComponent, BP_WeaponBase (for state check)
```
### Function Implementations
#### `RequestReload()` → `void`
```
[Function: RequestReload]
Step 1: Get BP_WeaponBase → Check WeaponState == Ready → If not, return (can't reload while firing)
Step 2: Call CanReload() → Branch:
False → Fire OnReloadFailed → Return
True → Call BeginReload()
```
#### `CanReload()` → `Boolean`
```
[Function: CanReload] (Pure)
Step 1: Get BPC_AmmoComponent → Call GetAmmoInMagazine()
If magazine >= MagazineSize → Return false (already full)
Step 2: Get BPC_AmmoComponent → Call GetReserveAmmo(AmmoTypeTag)
If reserve <= 0 → Return false (no ammo to load)
Step 3: Return true
```
#### `BeginReload()` → `void`
```
[Function: BeginReload]
Step 1: Set bIsReloading = true
Step 2: Notify BP_WeaponBase → SetWeaponState(Reloading)
Step 3: Play Montage (ReloadMontage)
Step 4: Fire OnReloadStarted
Step 5: Animation Notify "TransferRounds" setup:
In the animation montage, add Notify at the frame where the magazine is inserted.
On trigger → Call CompleteReload()
Step 6: Animation Notify "ReloadEnd" setup:
Add Notify at montage end → Call FinishReload()
```
#### `CompleteReload()` → `void` *(Called by Notify "TransferRounds")*
```
[Function: CompleteReload]
Step 1: Get BPC_AmmoComponent:
MagazineCurrent = GetAmmoInMagazine()
ReserveCurrent = GetReserveAmmo(AmmoTypeTag)
Step 2: RoundsToAdd = Min(MagazineSize - MagazineCurrent, ReserveCurrent)
Step 3: BPC_AmmoComponent.RemoveReserveAmmo(AmmoTypeTag, RoundsToAdd)
Step 4: BPC_AmmoComponent.AddMagazineAmmo(RoundsToAdd)
```
#### `FinishReload()` → `void` *(Called by Notify "ReloadEnd")*
```
Step 1: Set bIsReloading = false
Step 2: Notify BP_WeaponBase → SetWeaponState(Ready)
Step 3: Fire OnReloadCompleted(RoundsToAdd)
```
#### `InterruptReload()` → `void`
```
[Function: InterruptReload]
Step 1: Branch on bIsReloading → If false, return
Step 2: If bPartialReload AND CompleteReload already called:
Keep transferred rounds (partial reload success)
Step 3: Else: no rounds transferred
Step 4: Stop Montage (ReloadMontage)
Step 5: Set bIsReloading = false
Step 6: Notify BP_WeaponBase → SetWeaponState(Ready)
Step 7: Fire OnReloadInterrupted(RoundsTransferred)
```
### Build Checklist
- [ ] Create BPC_ReloadSystem, add to BP_RangedWeapon
- [ ] Create ReloadMontage per weapon with Notifies: TransferRounds, ReloadEnd
- [ ] Implement CanReload checking magazine fullness and reserve ammo
- [ ] Implement BeginReload with montage playback and state lock
- [ ] Wire CompleteReload to ammo transfer
- [ ] Wire FinishReload to state restoration
- [ ] Implement InterruptReload for mid-reload weapon swap
- [ ] Test: empty magazine → reload → rounds transfer → magazine full