#pragma once #include "CoreMinimal.h" #include "UObject/NoExportTypes.h" #include "UObject/NoExportTypes.h" #include "Engine/EngineTypes.h" #include "AmmoDrivenWeapon.h" #include "LockCounter.h" #include "Templates/SubclassOf.h" #include "TracerData.h" #include "LockOnWeapon.generated.h" class AActor; class ALockOnBeam; class UActorTrackingWidget; class UDamageComponent; class UHitscanComponent; class UStatusEffect; UCLASS(Abstract, Blueprintable) class FSD_API ALockOnWeapon : public AAmmoDrivenWeapon { GENERATED_BODY() public: DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FMaxTargetsDelegate, int32, InMaxTargets); DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FLockonTargetRotationUpdated, bool, hasTargetLockon, FRotator, socketRotation); DECLARE_DYNAMIC_MULTICAST_DELEGATE(FLockOnRifleLockingOnState); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FLockOnCountDelegate, int32, InCurrentCount); UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FLockOnRifleLockingOnState OnLockingStarted; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FLockOnRifleLockingOnState OnLockingStopped; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FMaxTargetsDelegate OnMaxTargetsChanged; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FLockOnCountDelegate OnLockOnCountChanged; UPROPERTY(BlueprintAssignable, BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FLockonTargetRotationUpdated OnLockonTargetRotationUpdated; protected: UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) AActor* AimTarget; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float LockOnDamageMultiplier; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) int32 ShotsPerTarget; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) int32 MaxTargets; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float TimeBetweenLockedShots; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float LockOnTime; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float MaxLockOnDegree; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float LoseLockOnDegree; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float DegreeTolerance; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float MaxLockOnRange; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) bool bPrioritizeLowHitPoint; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) bool bAlwaysHitTarget; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float MaxLockOnDuration; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) bool bLockOnControlsSentryGun; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) bool bSentryGunShootsOnLockedShot; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) TSubclassOf TrackingWidgetClass; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) TSubclassOf LockOnBeamClass; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) TSubclassOf AoeActorClass; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) int32 AoeHitCountThreshhold; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) bool UseLockOnTargetStatusEffect; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) TSubclassOf LockOnTargetStatusEffect; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) int32 PushStatusEffectEveryXLock; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) int32 LockOnCount; UPROPERTY(BlueprintReadWrite, EditAnywhere, Instanced, Transient, meta=(AllowPrivateAccess=true)) UDamageComponent* DamageComponent; UPROPERTY(BlueprintReadWrite, EditAnywhere, Instanced, Transient, meta=(AllowPrivateAccess=true)) UHitscanComponent* HitscanComponent; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) FTracerData ChargedShotTracer; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float ChargeSpeed; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float SlowMovementAtCharge; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) bool FearEnabled; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float FearFactorBase; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float FearFactorPerShotBonus; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float FearRange; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float FearRangePerShotBonus; UPROPERTY(BlueprintReadWrite, EditAnywhere, Replicated, Transient, meta=(AllowPrivateAccess=true)) bool IsMovementSlowed; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, meta=(AllowPrivateAccess=true)) bool Charging; UPROPERTY(BlueprintReadWrite, EditAnywhere, Transient, meta=(AllowPrivateAccess=true)) float ChargeProgress; UPROPERTY(BlueprintReadWrite, EditAnywhere, Replicated, meta=(AllowPrivateAccess=true)) bool LastShotWasLockedOn; UPROPERTY(BlueprintReadWrite, EditAnywhere, meta=(AllowPrivateAccess=true)) float LockOnRecoilMult; public: ALockOnWeapon(); virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; protected: UFUNCTION(BlueprintCallable) void UpdateRifleEye(); UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) void SetMuzzleDirection(FVector TargetLocation); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_TriggerAoe(FVector Location); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_SetTotalLockCount(int32 totalLockCount); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_SetLockCount(const FLockCounter& LockCounter); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_SetIsMovementSlowed(bool bisMovementSlowed); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_SetIsLatestShotLockedOn(bool bisShotLockedOn); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_SetIsChargingShot(bool bisCharging); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_PushStatusEffect(AActor* Target); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_PopStatusEffect(AActor* Target); UFUNCTION(BlueprintCallable, Reliable, Server) void Server_FiringComplete(int32 ShotsFired); UFUNCTION(BlueprintCallable, Client, Reliable) void RefundAmmo(); UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) void OnRep_AimTarget(); UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) void OnMovementSlowed(bool isSlowed); UFUNCTION(BlueprintCallable) void OnHitDeadTarget(); UFUNCTION(BlueprintCallable) void OnHit(const FHitResult& Hit, bool alwaysPenetrate); UFUNCTION(BlueprintCallable) void OnAsyncFireComplete(); UFUNCTION(BlueprintCallable, BlueprintImplementableEvent) void MuzzleLerpToTarget(FVector TargetLocation); };