// Copyright 2025 https://yuewu.dev/en All Rights Reserved. #include "Bullet/GCS_BulletSystemComponent.h" #include "GCS_LogChannels.h" #include "Bullet/GCS_BulletInstance.h" #include "Bullet/GCS_BulletSubsystem.h" // Sets default values for this component's properties UGCS_BulletSystemComponent::UGCS_BulletSystemComponent() { // Set this component to be initialized when the game starts, and to be ticked every frame. You can turn these features // off to improve performance if you don't need them. PrimaryComponentTick.bCanEverTick = false; // ... } // Called when the game starts void UGCS_BulletSystemComponent::BeginPlay() { Super::BeginPlay(); // ... } UGCS_BulletSystemComponent* UGCS_BulletSystemComponent::GetBulletSystemComponent(const AActor* Actor) { return IsValid(Actor) ? Actor->FindComponentByClass() : nullptr; } bool UGCS_BulletSystemComponent::FindBulletSystemComponent(const AActor* Actor, UGCS_BulletSystemComponent*& Component) { Component = GetBulletSystemComponent(Actor); return Component != nullptr; } void UGCS_BulletSystemComponent::SpawnBullet(const FGCS_BulletSpawnParameters& SpawnParameters) { //SpawnBulletInternal(SpawnParameters); } // TArray UGCS_BulletSystemComponent::SpawnBulletInternal(const FGCS_BulletSpawnParameters& SpawnParameters) // { // TArray RetInstances{}; // // if (GetOwner()->GetLocalRole() < ROLE_AutonomousProxy) // { // GCS_CLOG(Warning, "No authority to spawn bullet!") // return RetInstances; // } // // UGCS_BulletSubsystem* Subsystem = UGCS_BulletSubsystem::Get(GetWorld()); // if (Subsystem == nullptr) // { // return RetInstances; // } // // FGCS_BulletDefinition Definition; // if (SpawnParameters.DefinitionHandle.IsNull() || !Subsystem->LoadBulletDefinition(SpawnParameters.DefinitionHandle, Definition)) // { // return RetInstances; // } // // RetInstances = Subsystem->GetOrCreateBulletInstances(SpawnParameters, Definition); // // for (int i = 0; i < RetInstances.Num(); ++i) // { // AGCS_BulletInstance* Instance = RetInstances[i]; // // Instance->bServerInitiated = GetWorld()->GetNetMode() < NM_Client; // Instance->bIsLocalPredicting = SpawnParameters.bIsLocalPredicting; // // if (SpawnParameters.OverrideBulletIds.IsValidIndex(i)) // { // Instance->SetBulletId(SpawnParameters.OverrideBulletIds[0]); // } // else // { // Instance->SetBulletId(FGuid::NewGuid()); // } // // if (SpawnParameters.ParentId.IsValid() && BulletInstances.Contains(SpawnParameters.ParentId)) // { // Instance->SetParentBulletId(SpawnParameters.ParentId); // // if (AGCS_BulletInstance* ParentBulletInstance = BulletInstances[SpawnParameters.ParentId]) // // { // // if (ParentBulletInstance->Definition.bUseSharedHitList) // // { // // Instance->HitActors = ParentBulletInstance->HitActors; // // } // // } // } // // if (SpawnParameters.Request) // { // Instance->Request = SpawnParameters.Request; // } // // if (SpawnParameters.Owner) // { // Instance->SetOwner(SpawnParameters.Owner); // } // Instance->SetDefinitionHandle(SpawnParameters.DefinitionHandle); // BulletInstances.Emplace(Instance->BulletId, Instance); // } // // FRotator OriginalRotation = SpawnParameters.SpawnTransform.Rotator(); // for (int i = 0; i < RetInstances.Num(); ++i) // { // FTransform ModifiedTransform = SpawnParameters.SpawnTransform; // FRotator RotationYawOffset(Definition.LaunchElevationAngle, Definition.LaunchAngle + Definition.LaunchAngleInterval * i, 0); // ModifiedTransform.SetRotation(UKismetMathLibrary::ComposeRotators(OriginalRotation, RotationYawOffset).Quaternion()); // RetInstances[i]->SetActorTransform(ModifiedTransform, false, nullptr, ETeleportType::ResetPhysics); // } // // //batch beginplay. // for (AGCS_BulletInstance* Instance : RetInstances) // { // Instance->OnBulletBeginPlay(); // } // return RetInstances; // }