// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Blaster/Interfaces/InteractWithCrosshairInterface.h" #include "Blaster/Types/CombatState.h" #include "Blaster/Types/TurningInPlace.h" #include "Components/TimelineComponent.h" #include "GameFramework/Character.h" #include "Sound/SoundCue.h" #include "BlasterCharacter.generated.h" UCLASS() class BLASTER_API ABlasterCharacter : public ACharacter, public IInteractWithCrosshairInterface { GENERATED_BODY() public: ABlasterCharacter(); virtual void Tick(float DeltaTime) override; virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; virtual void PostInitializeComponents() override; virtual void OnRep_ReplicatedMovement() override; virtual void Destroyed() override; void RotateInPlace(float DeltaTime); void PlayFireMontage(bool bAiming); void PlayReloadMontage(); void PlayEliminatedMontage(); void PlayThrowGrenadeMontage(); void Eliminated(); UFUNCTION(NetMulticast, Reliable) void MulticastEliminated(); UPROPERTY(Replicated) bool bDisableGameplay = false; UFUNCTION(BlueprintImplementableEvent) void ShowSniperScopeWidget(bool bShowScope); void UpdateHUDHealth(); void UpdateHUDShield(); void UpdateHUDAmmo(); void SpawnDefaultWeapon(); protected: virtual void BeginPlay() override; void MoveForward(float Value); void MoveRight(float Value); void Turn(float Value); void LookUp(float Value); void EquipButtonPressed(); void ReloadButtonPressed(); void CrouchButtonPressed(); void AimButtonPressed(); void AimButtonReleased(); void GrenadeButtonPressed(); void CalculateAO_Pitch(); void AimOffset(float DeltaTime); void SimProxiesTurn(); virtual void Jump() override; void FireButtonPressed(); void FireButtonReleased(); void PlayHitReactMontage(); UFUNCTION() void ReceiveDamage(AActor* DamagedActor, float Damage, const UDamageType* DamageType, class AController* InstigatorController, AActor* DamageCauser); // Poll for any relevant classes and initialize them void PollInit(); private: UPROPERTY() class ABlasterPlayerState* BlasterPlayerState; UPROPERTY(VisibleAnywhere, Category="Camera") class USpringArmComponent* CameraBoom; UPROPERTY(VisibleAnywhere, Category="Camera") class UCameraComponent* FollowCamera; UPROPERTY(EditAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) class UWidgetComponent* OverheadWidget; UPROPERTY(ReplicatedUsing = OnRep_OverlappingWeapon) class AWeapon* OverlappingWeapon; UFUNCTION() void OnRep_OverlappingWeapon(AWeapon* LastWeapon); UPROPERTY(VisibleAnywhere, BlueprintReadOnly, meta = (AllowPrivateAccess = "true")) class UCombatComponent* Combat; UPROPERTY(VisibleAnywhere) class UBuffComponent* Buff; UFUNCTION(Server, Reliable) void ServerEquipButtonPressed(); float AO_Yaw; float InterpAO_Yaw; float AO_Pitch; FRotator StartingAimRotation; ETurningInPlace TurningInPlace; void TurnInPlace(float DeltaTime); // Animation montages UPROPERTY(EditAnywhere, Category = Combat) class UAnimMontage* FireWeaponMontage; UPROPERTY(EditAnywhere, Category = Combat) class UAnimMontage* ReloadMontage; UPROPERTY(EditAnywhere, Category = Combat) class UAnimMontage* HitReactMontage; UPROPERTY(EditAnywhere, Category = Combat) class UAnimMontage* EliminatedMontage; UPROPERTY(EditAnywhere, Category = Combat) class UAnimMontage* ThrowGrenadeMontage; void HideCameraIfCharacterClose(); UPROPERTY(EditAnywhere) float CameraThreshold = 200.f; bool bRotateRootBone; float TurnThreshold = 0.8f; FRotator ProxyRotationLastFrame; FRotator ProxyRotation; float ProxyYaw; float TimeSinceLastMovementReplication; float CalculateSpeed(); // Health UPROPERTY(EditAnywhere, Category= "Player Stats") float MaxHealth = 100.f; UPROPERTY(ReplicatedUsing = OnRep_Health, VisibleAnywhere, Category= "Player Stats") float Health = 100.f; UFUNCTION() void OnRep_Health(float LastHealth); // Shield UPROPERTY(EditAnywhere, Category= "Player Stats") float MaxShield = 100.f; UPROPERTY(ReplicatedUsing = OnRep_Shield, EditAnywhere, Category= "Player Stats") float Shield = 0.f; UFUNCTION() void OnRep_Shield(float LastShield); UPROPERTY() class ABlasterPlayerController* BlasterPlayerController; bool bEliminated = false; UPROPERTY(EditDefaultsOnly) float EliminationDelay = 2.f; FTimerHandle EliminationTimer; void EliminationTimerFinished(); // Dissolve effect UPROPERTY(VisibleAnywhere) UTimelineComponent* DissolveTimeline; FOnTimelineFloat DissolveTrack; UPROPERTY(EditAnywhere) UCurveFloat* DissolveCurve; UFUNCTION() void UpdateDissolveMaterial(float DissolveValue); void StartDissolve(); // Dynamic instance that we can change at runtime UPROPERTY(VisibleAnywhere, Category = Elimination) UMaterialInstanceDynamic* DynamicDissolveMaterialInstance; // Material instance set on the Blueprint, used with the dynamic material instance UPROPERTY(EditAnywhere, Category = Elimination) UMaterialInstance* DissolveMaterialInstance; // Elimination bot UPROPERTY(EditAnywhere) UParticleSystem* EliminationBotEffect; UPROPERTY(VisibleAnywhere) UParticleSystemComponent* EliminationBotComponent; UPROPERTY(EditAnywhere) USoundCue* EliminationBotSound; // Default weapon UPROPERTY(EditAnywhere) TSubclassOf DefaultWeaponClass; // Grenade UPROPERTY(VisibleAnywhere) UStaticMeshComponent* AttachedGrenade; public: void SetOverlappingWeapon(AWeapon* Weapon); bool IsWeaponEquipped(); bool IsAiming(); FORCEINLINE float GetAO_Yaw() const { return AO_Yaw; } FORCEINLINE float GetAO_Pitch() const { return AO_Pitch; } AWeapon* GetEquippedWeapon(); FORCEINLINE ETurningInPlace GetTurningInPlace() const { return TurningInPlace; } FVector GetHitTarget() const; FORCEINLINE UCameraComponent* GetFollowCamera() const { return FollowCamera; } FORCEINLINE bool ShouldRotateRootBone() const { return bRotateRootBone; } FORCEINLINE bool IsEliminated() const { return bEliminated; } FORCEINLINE float GetHealth() const { return Health; } FORCEINLINE void SetHealth(float Amount) { Health = Amount; } FORCEINLINE float GetMaxHealth() const { return MaxHealth; } FORCEINLINE float GetShield() const { return Shield; } FORCEINLINE void SetShield(float Amount) { Shield = Amount; } FORCEINLINE float GetMaxShield() const { return MaxShield; } ECombatState GetCombatState() const; FORCEINLINE UCombatComponent* GetCombat() const { return Combat; } FORCEINLINE UBuffComponent* GetBuff() const { return Buff; } FORCEINLINE bool GetDisableGameplay() const { return bDisableGameplay; } FORCEINLINE UAnimMontage* GetReloadMontage() const { return ReloadMontage; } FORCEINLINE UStaticMeshComponent* GetAttachedGrenade() const { return AttachedGrenade; } };