Files
DedicatedServerCourse/Source/FPSTemplate/Public/Weapon/Weapon.h

165 lines
4.2 KiB
C
Raw Normal View History

2026-02-24 22:39:26 -05:00
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "GameplayTagContainer.h"
#include "ShooterTypes/ShooterTypes.h"
#include "Weapon.generated.h"
struct FPlayerHitResult;
/** Enum used to describe what state the weapon is currently in. */
UENUM(BlueprintType)
namespace EWeaponState
{
enum Type
{
Idle,
Firing,
Reloading,
Equipping,
};
}
UENUM(BlueprintType)
namespace EFireType
{
enum Type
{
Auto,
SemiAuto
};
}
UCLASS()
class FPSTEMPLATE_API AWeapon : public AActor
{
GENERATED_BODY()
public:
AWeapon();
virtual void Tick(float DeltaTime) override;
virtual void OnRep_Instigator() override;
/** perform initial setup */
virtual void PostInitializeComponents() override;
UPROPERTY(BlueprintReadOnly, EditAnywhere)
FGameplayTag WeaponType;
//////////////////////////////////////////////////////////////////////////
// Firing the Weapon
void Local_Fire(const FVector& ImpactPoint, const FVector& ImpactNormal, TEnumAsByte<EPhysicalSurface> SurfaceType, bool bIsFirstPerson);
int32 Auth_Fire();
void Rep_Fire(int32 AuthAmmo);
UFUNCTION(BlueprintImplementableEvent)
void FireEffects(const FVector& ImpactPoint, const FVector& ImpactNormal, EPhysicalSurface SurfaceType, bool bIsFirstPerson);
//////////////////////////////////////////////////////////////////////////
// Inventory
/** [server] weapon was added to pawn's inventory */
virtual void OnEnterInventory(APawn* NewOwner);
/** weapon is holstered by owner pawn */
virtual void OnUnEquip();
/** weapon is being equipped by owner pawn */
virtual void OnEquip(const AWeapon* LastWeapon);
/** set the weapon's owning pawn */
void SetOwningPawn(APawn* NewOwningPawn);
/** get weapon mesh (needs pawn owner to determine variant) */
USkeletalMeshComponent* GetWeaponMesh() const;
/** update weapon state */
void SetWeaponState(EWeaponState::Type NewState);
EWeaponState::Type GetWeaponState() const;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
int32 MagCapacity;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
int32 Ammo;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
int32 Sequence;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
int32 StartingCarriedAmmo;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
float Damage;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
float AimFieldOfView;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
float HeadShotDamage;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
float FireTime;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
TEnumAsByte<EFireType::Type> FireType;
USkeletalMeshComponent* GetMesh1P() const;
USkeletalMeshComponent* GetMesh3P() const;
UMaterialInstanceDynamic* GetReticleDynamicMaterialInstance();
UMaterialInstanceDynamic* GetAmmoCounterDynamicMaterialInstance();
UMaterialInstanceDynamic* GetWeaponIconDynamicMaterialInstance();
UPROPERTY(EditDefaultsOnly, Category=Reticle)
FReticleParams ReticleParams;
protected:
virtual void BeginPlay() override;
//////////////////////////////////////////////////////////////////////////
// Inventory
/** attaches weapon mesh to pawn's mesh */
void AttachMeshToPawn();
/** detaches weapon mesh from pawn */
void DetachMeshFromPawn();
private:
/** weapon mesh: 1st person view */
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category=Mesh, meta = (AllowPrivateAccess = "true"))
TObjectPtr<USkeletalMeshComponent> Mesh1P;
/** weapon mesh: 3rd person view */
UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category=Mesh, meta = (AllowPrivateAccess = "true"))
TObjectPtr<USkeletalMeshComponent> Mesh3P;
/** current weapon state */
EWeaponState::Type CurrentState;
UPROPERTY(EditDefaultsOnly, Category=Weapon)
TObjectPtr<UMaterialInterface> ReticleMaterial;
UPROPERTY()
TObjectPtr<UMaterialInstanceDynamic> DynMatInst_Reticle;
UPROPERTY(EditDefaultsOnly, Category=Weapon)
TObjectPtr<UMaterialInterface> AmmoCounterMaterial;
UPROPERTY()
TObjectPtr<UMaterialInstanceDynamic> DynMatInst_AmmoCounter;
UPROPERTY(EditDefaultsOnly, Category=Weapon)
TObjectPtr<UMaterialInterface> WeaponIconMaterial;
UPROPERTY()
TObjectPtr<UMaterialInstanceDynamic> DynMatInst_WeaponIcon;
};