This commit is contained in:
John
2026-03-11 11:25:15 +05:30
parent bcd6f827d5
commit 0327abb1a0
77 changed files with 7689 additions and 0 deletions

View File

@@ -0,0 +1,166 @@
// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "AudioVideoRecordCharacter.h"
#include "ShooterWeaponHolder.h"
#include "ShooterCharacter.generated.h"
class AShooterWeapon;
class UInputAction;
class UInputComponent;
class UPawnNoiseEmitterComponent;
DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FBulletCountUpdatedDelegate, int32, MagazineSize, int32, Bullets);
DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDamagedDelegate, float, LifePercent);
/**
* A player controllable first person shooter character
* Manages a weapon inventory through the IShooterWeaponHolder interface
* Manages health and death
*/
UCLASS(abstract)
class AUDIOVIDEORECORD_API AShooterCharacter : public AAudioVideoRecordCharacter, public IShooterWeaponHolder
{
GENERATED_BODY()
/** AI Noise emitter component */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true"))
UPawnNoiseEmitterComponent* PawnNoiseEmitter;
protected:
/** Fire weapon input action */
UPROPERTY(EditAnywhere, Category ="Input")
UInputAction* FireAction;
/** Switch weapon input action */
UPROPERTY(EditAnywhere, Category ="Input")
UInputAction* SwitchWeaponAction;
/** Name of the first person mesh weapon socket */
UPROPERTY(EditAnywhere, Category ="Weapons")
FName FirstPersonWeaponSocket = FName("HandGrip_R");
/** Name of the third person mesh weapon socket */
UPROPERTY(EditAnywhere, Category ="Weapons")
FName ThirdPersonWeaponSocket = FName("HandGrip_R");
/** Max distance to use for aim traces */
UPROPERTY(EditAnywhere, Category ="Aim", meta = (ClampMin = 0, ClampMax = 100000, Units = "cm"))
float MaxAimDistance = 10000.0f;
/** Max HP this character can have */
UPROPERTY(EditAnywhere, Category="Health")
float MaxHP = 500.0f;
/** Current HP remaining to this character */
float CurrentHP = 0.0f;
/** Team ID for this character*/
UPROPERTY(EditAnywhere, Category="Team")
uint8 TeamByte = 0;
/** List of weapons picked up by the character */
TArray<AShooterWeapon*> OwnedWeapons;
/** Weapon currently equipped and ready to shoot with */
TObjectPtr<AShooterWeapon> CurrentWeapon;
UPROPERTY(EditAnywhere, Category ="Destruction", meta = (ClampMin = 0, ClampMax = 10, Units = "s"))
float RespawnTime = 5.0f;
FTimerHandle RespawnTimer;
public:
/** Bullet count updated delegate */
FBulletCountUpdatedDelegate OnBulletCountUpdated;
/** Damaged delegate */
FDamagedDelegate OnDamaged;
public:
/** Constructor */
AShooterCharacter();
protected:
/** Gameplay initialization */
virtual void BeginPlay() override;
/** Gameplay cleanup */
virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override;
/** Set up input action bindings */
virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override;
public:
/** Handle incoming damage */
virtual float TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override;
public:
/** Handles start firing input */
UFUNCTION(BlueprintCallable, Category="Input")
void DoStartFiring();
/** Handles stop firing input */
UFUNCTION(BlueprintCallable, Category="Input")
void DoStopFiring();
/** Handles switch weapon input */
UFUNCTION(BlueprintCallable, Category="Input")
void DoSwitchWeapon();
public:
//~Begin IShooterWeaponHolder interface
/** Attaches a weapon's meshes to the owner */
virtual void AttachWeaponMeshes(AShooterWeapon* Weapon) override;
/** Plays the firing montage for the weapon */
virtual void PlayFiringMontage(UAnimMontage* Montage) override;
/** Applies weapon recoil to the owner */
virtual void AddWeaponRecoil(float Recoil) override;
/** Updates the weapon's HUD with the current ammo count */
virtual void UpdateWeaponHUD(int32 CurrentAmmo, int32 MagazineSize) override;
/** Calculates and returns the aim location for the weapon */
virtual FVector GetWeaponTargetLocation() override;
/** Gives a weapon of this class to the owner */
virtual void AddWeaponClass(const TSubclassOf<AShooterWeapon>& WeaponClass) override;
/** Activates the passed weapon */
virtual void OnWeaponActivated(AShooterWeapon* Weapon) override;
/** Deactivates the passed weapon */
virtual void OnWeaponDeactivated(AShooterWeapon* Weapon) override;
/** Notifies the owner that the weapon cooldown has expired and it's ready to shoot again */
virtual void OnSemiWeaponRefire() override;
//~End IShooterWeaponHolder interface
protected:
/** Returns true if the character already owns a weapon of the given class */
AShooterWeapon* FindWeaponOfType(TSubclassOf<AShooterWeapon> WeaponClass) const;
/** Called when this character's HP is depleted */
void Die();
/** Called to allow Blueprint code to react to this character's death */
UFUNCTION(BlueprintImplementableEvent, Category="Shooter", meta = (DisplayName = "On Death"))
void BP_OnDeath();
/** Called from the respawn timer to destroy this character and force the PC to respawn */
void OnRespawn();
};