// 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 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 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 Mesh1P; /** weapon mesh: 3rd person view */ UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category=Mesh, meta = (AllowPrivateAccess = "true")) TObjectPtr Mesh3P; /** current weapon state */ EWeaponState::Type CurrentState; UPROPERTY(EditDefaultsOnly, Category=Weapon) TObjectPtr ReticleMaterial; UPROPERTY() TObjectPtr DynMatInst_Reticle; UPROPERTY(EditDefaultsOnly, Category=Weapon) TObjectPtr AmmoCounterMaterial; UPROPERTY() TObjectPtr DynMatInst_AmmoCounter; UPROPERTY(EditDefaultsOnly, Category=Weapon) TObjectPtr WeaponIconMaterial; UPROPERTY() TObjectPtr DynMatInst_WeaponIcon; };