Files
2026-08-02 22:34:52 +03:00

97 lines
2.6 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Engine/DataTable.h"
#include "Engine/StaticMesh.h"
#include "ShooterPickup.generated.h"
class USphereComponent;
class UPrimitiveComponent;
class AShooterWeapon;
/**
* Holds information about a type of weapon pickup
*/
USTRUCT(BlueprintType)
struct FWeaponTableRow : public FTableRowBase
{
GENERATED_BODY()
/** Mesh to display on the pickup */
UPROPERTY(EditAnywhere)
TSoftObjectPtr<UStaticMesh> StaticMesh;
/** Weapon class to grant on pickup */
UPROPERTY(EditAnywhere)
TSubclassOf<AShooterWeapon> WeaponToSpawn;
};
/**
* Simple shooter game weapon pickup
*/
UCLASS(abstract)
class FIRST_API AShooterPickup : public AActor
{
GENERATED_BODY()
/** Collision sphere */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true"))
USphereComponent* SphereCollision;
/** Weapon pickup mesh. Its mesh asset is set from the weapon data table */
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true"))
UStaticMeshComponent* Mesh;
protected:
/** Data on the type of picked weapon and visuals of this pickup */
UPROPERTY(EditAnywhere, Category="Pickup")
FDataTableRowHandle WeaponType;
/** Type to weapon to grant on pickup. Set from the weapon data table. */
TSubclassOf<AShooterWeapon> WeaponClass;
/** Time to wait before respawning this pickup */
UPROPERTY(EditAnywhere, Category="Pickup", meta = (ClampMin = 0, ClampMax = 120, Units = "s"))
float RespawnTime = 4.0f;
/** Timer to respawn the pickup */
FTimerHandle RespawnTimer;
public:
/** Constructor */
AShooterPickup();
protected:
/** Native construction script */
virtual void OnConstruction(const FTransform& Transform) override;
/** Gameplay Initialization*/
virtual void BeginPlay() override;
/** Gameplay cleanup */
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
/** Handles collision overlap */
UFUNCTION()
virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
protected:
/** Called when it's time to respawn this pickup */
void RespawnPickup();
/** Passes control to Blueprint to animate the pickup respawn. Should end by calling FinishRespawn */
UFUNCTION(BlueprintImplementableEvent, Category="Pickup", meta = (DisplayName = "OnRespawn"))
void BP_OnRespawn();
/** Enables this pickup after respawning */
UFUNCTION(BlueprintCallable, Category="Pickup")
void FinishRespawn();
};