// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #pragma once #include "CoreMinimal.h" #include "GCS_BulletStructLibrary.h" #include "GCS_EffectCauserInterface.h" #include "GameFramework/Actor.h" #include "GCS_BulletInstance.generated.h" class UGCS_AttackRequest_Bullet; class UGCS_BulletSubsystem; class UProjectileMovementComponent; /** * Base class for bullet instances. * 子弹实例的基类。 */ UCLASS(Abstract, BlueprintType, NotBlueprintable) class GENERICCOMBATSYSTEM_API AGCS_BulletInstance : public AActor, public IGCS_EffectCauserInterface { GENERATED_BODY() friend UGCS_BulletSubsystem; public: /** * Default constructor. * 默认构造函数。 */ AGCS_BulletInstance(); /** * Gets lifetime replicated properties. * 获取生命周期复制属性。 * @param OutLifetimeProps The lifetime properties. 生命周期属性。 */ virtual void GetLifetimeReplicatedProps(TArray& OutLifetimeProps) const override; /** * Gets the projectile movement component. * 获取子弹的运动组件。 * @return The projectile movement component. 运动组件。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Bullet") UProjectileMovementComponent* GetProjectileMovementComponent() const; /** * Sets the bullet definition handle. * 设置子弹定义句柄。 * @param NewHandle The new definition handle. 新定义句柄。 */ UFUNCTION(BlueprintCallable, Category="GCS|Bullet") void SetDefinitionHandle(UPARAM(meta=(RowType="/Script/GenericCombatSystem.GCS_BulletDefinition")) FDataTableRowHandle NewHandle); /** * Sets the bullet's unique ID. * 设置子弹的唯一ID。 * @param NewId The new ID. 新ID。 */ void SetBulletId(const FGuid& NewId); /** * Gets the bullet's unique ID. * 获取子弹的唯一ID。 * @return The bullet ID. 子弹ID。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Bullet") FGuid GetBulletId() const; /** * Sets the parent bullet ID for bullet chains. * 设置子弹链的父子弹ID。 * @param NewParentId The parent bullet ID. 父子弹ID。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void SetParentBulletId(FGuid NewParentId); /** * Gets the parent bullet ID. * 获取父子弹ID。 * @return The parent bullet ID. 父子弹ID。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Bullet") FGuid GetParentBulletId() const; /** * Launches the bullet. * 发射子弹。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void LaunchBullet(); /** * Sets the hit result for the bullet. * 设置子弹的命中结果。 * @param NewHitResult The hit result. 命中结果。 */ UFUNCTION(BlueprintCallable, Category="GCS|Bullet", meta=(DisplayName="Set Bullet HitResult")) void SetHitResult(const FHitResult& NewHitResult); /** * Gets the latest hit result. * 获取最新的命中结果。 * @return The hit result. 命中结果。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Bullet", meta=(DisplayName="Get Bullet HitResult")) const FHitResult& GetHitResult() const; /** * Checks if the bullet has gameplay authority. * 检查子弹是否具有游戏权限。 * @return True if the bullet has authority. 如果子弹具有权限返回true。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Bullet") bool HasGameplayAuthority() const; /** * Called after network initialization. * 网络初始化后调用。 */ virtual void PostNetInit() override; /** * Called after receiving network data. * 接收网络数据后调用。 */ virtual void PostNetReceive() override; /** * Handles locally predicted bullet instances. * 处理本地预测的子弹实例。 * @param PredictedBullet The predicted bullet instance. 预测的子弹实例。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void FoundLocalPredictedBullet(AGCS_BulletInstance* PredictedBullet); // Effect causer interface /** * Gets the gameplay effect spec handle. * 获取游戏效果规格句柄。 * @param OutHandle The effect spec handle (output). 效果规格句柄(输出)。 * @return True if successful. 如果成功返回true。 */ virtual bool GetEffectSpecHandle_Implementation(FGameplayEffectSpecHandle& OutHandle) override; /** * Gets the gameplay effect container. * 获取游戏效果容器。 * @return The effect container. 效果容器。 */ virtual FGGA_GameplayEffectContainer GetEffectContainer_Implementation() const override; /** * Gets the effect container level override. * 获取效果容器级别覆盖。 * @return The level override. 级别覆盖。 */ virtual int32 GetEffectContainerLevelOverride_Implementation() const override; /** * Sets the effect container spec. * 设置效果容器规格。 * @param InEffectContainerSpec The effect container spec. 效果容器规格。 */ virtual void SetEffectContainerSpec_Implementation(const FGGA_GameplayEffectContainerSpec& InEffectContainerSpec) override; /** * Gets the effect container spec. * 获取效果容器规格。 * @return The effect container spec. 效果容器规格。 */ virtual FGGA_GameplayEffectContainerSpec GetEffectContainerSpec_Implementation() const override; /** * Gets the effect class. * 获取效果类。 * @return The effect class. 效果类。 */ virtual TSubclassOf GetEffectClass_Implementation() const override; /** * Gets the effect level. * 获取效果级别。 * @return The effect level. 效果级别。 */ virtual int32 GetEffectLevel_Implementation() const override; /** * Sets the effect spec. * 设置效果规格。 * @param InEffectSpec The effect spec. 效果规格。 */ virtual void SetEffectSpec_Implementation(FGameplayEffectSpecHandle& InEffectSpec) override; /** * Gets the bullet's shape component. * 获取子弹的形状组件。 * @return The shape component. 形状组件。 */ UFUNCTION(BlueprintCallable, BlueprintPure, BlueprintNativeEvent, Category="GCS|Bullet") UShapeComponent* GetBulletShape() const; virtual UShapeComponent* GetBulletShape_Implementation() const; protected: /** * Called when the game starts or when spawned. * 游戏开始或生成时调用。 */ virtual void BeginPlay() override; /** * Called when the game ends or the bullet is destroyed. * 游戏结束或子弹销毁时调用。 * @param EndPlayReason The reason for ending. 结束原因。 */ virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; /** * Called when the bullet is taken from the pool with a valid definition. * 子弹从池中取出且具有有效定义时调用。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void OnBulletBeginPlay(); /** * Called when the bullet is returned to the pool and deactivated. * 子弹返回池中并停用时调用。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void OnBulletEndPlay(); /** * Records the initial location and rotation of the bullet. * 记录子弹的初始位置和旋转。 */ UFUNCTION(BlueprintCallable, Category="GCS|Bullet") void SetupInitialLocationAndRotation(); /** * Refreshes the bullet's travel states. * 刷新子弹的移动状态。 */ UFUNCTION(BlueprintCallable, Category="GCS|Bullet") virtual void RefreshTravelStates(); /** * Checks if the hit result should be penetrated. * 检查命中结果是否应穿透。 * @param InHitResult The hit result. 命中结果。 * @return True if the hit should be penetrated. 如果命中应穿透返回true。 */ UFUNCTION(BlueprintCallable, BlueprintPure, Category="GCS|Bullet") virtual bool ShouldPenetrateHitResult(const FHitResult& InHitResult) const; /** * Checks if a bullet chain should be generated. * 检查是否应生成子弹链。 * @return True if a bullet chain should be generated. 如果应生成子弹链返回true。 */ UFUNCTION(BlueprintCallable, BlueprintPure, BlueprintNativeEvent, Category="GCS|Bullet") bool ShouldGenerateBullet(); /** * Handles bullet chain logic on hit. * 处理命中时的子弹链逻辑。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void HandleBulletHitChains(); /** * Applies gameplay effects to the hit result. * 对命中结果应用游戏效果。 * @param HitResult The hit result. 命中结果。 */ UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category="GCS|Bullet") void ApplyGameplayEffects(FHitResult HitResult); /** * Called when the bullet ID is replicated. * 子弹ID复制时调用。 * @param Prev The previous bullet ID. 之前的子弹ID。 */ UFUNCTION() virtual void OnRep_BulletId(FGuid Prev); /** * Called when the bullet definition is replicated. * 子弹定义复制时调用。 */ UFUNCTION() void OnRep_BulletDefinition(); /** * Unique ID of the bullet. * 子弹的唯一ID。 */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, ReplicatedUsing=OnRep_BulletId, Category="GCS|BulletState") FGuid BulletId; /** * Whether the bullet is locally predicted. * 子弹是否为本地预测。 */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="GCS|BulletState") bool bIsLocalPredicting{false}; /** * Whether the bullet was spawned on the server. * 子弹是否在服务器上生成。 */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="GCS|BulletState") bool bServerInitiated{false}; /** * Parent bullet ID for bullet chains. * 子弹链的父子弹ID。 */ UPROPERTY(VisibleAnywhere, Category="GCS|BulletState") FGuid ParentBulletId; /** * The associated attack request. * 关联的攻击请求。 */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="GCS|BulletState") TObjectPtr Request; /** * Handle to the bullet definition. * 子弹定义的句柄。 */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="GCS|Bullet", ReplicatedUsing=OnRep_BulletDefinition, meta=(ExposeOnSpawn)) FDataTableRowHandle DefinitionHandle; /** * Loaded bullet definition. * 加载的子弹定义。 */ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="GCS|BulletState") FGCS_BulletDefinition Definition; /** * The projectile movement component. * 子弹的运动组件。 */ UPROPERTY(VisibleAnywhere, Category="GCS|Bullet") TObjectPtr ProjectileMovement; /** * The gameplay effect spec carried by the bullet. * 子弹携带的游戏效果规格。 */ UPROPERTY(VisibleAnywhere, Category="GCS|BulletState") FGameplayEffectSpecHandle EffectSpecHandle; /** * The gameplay effect container spec carried by the bullet. * 子弹携带的游戏效果容器规格。 */ UPROPERTY(VisibleAnywhere, Category = "GCS|BulletState") FGGA_GameplayEffectContainerSpec EffectContainerSpec; /** * Index for bullet chains. * 子弹链的索引。 */ UPROPERTY() int32 ChainIndex{0}; /** * Initial location of the bullet. * 子弹的初始位置。 */ UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category="GCS|BulletState") FVector InitialActorLocation; /** * Initial rotation of the bullet. * 子弹的初始旋转。 */ UPROPERTY(BlueprintReadWrite, EditDefaultsOnly, Category="GCS|BulletState") FRotator InitialActorRotation; /** * The latest hit result. * 最新的命中结果。 */ UPROPERTY(VisibleAnywhere, Category="GCS|BulletState") FHitResult LastHitResult; /** * Distance traveled by the bullet. * 子弹的移动距离。 */ UPROPERTY(BlueprintReadWrite, VisibleAnywhere, Category="GCS|BulletState") double TraveledDistance{0.0f}; public: /** * Called every frame. * 每帧调用。 * @param DeltaTime Time since last frame. 上一帧以来的时间。 */ virtual void Tick(float DeltaTime) override; };