BANZAIII

WeaponComponent.cpp

May 15th, 2023
301
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. // Shoot Them Up. All Rights Reserved.
  2.  
  3.  
  4. #include "Components/STUWeaponComponent.h"
  5. #include "STUbaseCharacter.h"
  6. #include "GameFramework/Character.h"
  7. #include "STUEquipFinished.h"
  8.  
  9. USTUWeaponComponent::USTUWeaponComponent()
  10. {
  11.     PrimaryComponentTick.bCanEverTick = false;
  12.  
  13. }
  14.  
  15.  
  16.  
  17. void USTUWeaponComponent::BeginPlay()
  18. {
  19.     Super::BeginPlay();
  20.  
  21.     InitAnimations();
  22.     CurrentWeaponIndex = 0;
  23.     SpawnWeapons();
  24.     EquipWeapon(CurrentWeaponIndex);
  25. }
  26.  
  27. void USTUWeaponComponent::EndPlay(const EEndPlayReason::Type EndPlayReason)
  28. {
  29.     CurrentWeapon = nullptr;
  30.     for (auto Weapon : Weapons)
  31.     {
  32.         Weapon->DetachFromActor(FDetachmentTransformRules::KeepWorldTransform);
  33.         Weapon->Destroy();
  34.     }
  35.     Weapons.Empty();
  36.     Super::EndPlay(EndPlayReason);
  37. }
  38.  
  39.  
  40. void USTUWeaponComponent::SpawnWeapons()
  41. {
  42.     ACharacter* Character = Cast<ACharacter>(GetOwner());
  43.     if (!GetWorld() || !Character) return;
  44.        
  45.     for (auto OneWeaponData : WeaponData)
  46.     {
  47.         auto Weapon = GetWorld()->SpawnActor<ASTUBaseWeapon>(OneWeaponData.WeaponClass);
  48.         if (!Weapon) continue;
  49.  
  50.         Weapon->SetOwner(Character);
  51.         Weapons.Add(Weapon);
  52.  
  53.         AttachWeaponToSocket(Weapon, Character->GetMesh(), WeaponArmorySocketName);
  54.     }
  55.    
  56.    
  57.    
  58. }
  59.  
  60. void USTUWeaponComponent::EquipWeapon(int32 WeaponIndex)
  61. {
  62.     if(WeaponIndex < 0 || WeaponIndex >= Weapons.Num()) return;
  63.    
  64.     ACharacter* Character = Cast<ACharacter>(GetOwner());
  65.     if(!Character) return;
  66.  
  67.     if(CurrentWeapon)
  68.     {
  69.         CurrentWeapon->StopFire();
  70.         AttachWeaponToSocket(CurrentWeapon, Character->GetMesh(), WeaponArmorySocketName);
  71.     }
  72.    
  73.     CurrentWeapon = Weapons[WeaponIndex];
  74.     //CurrentReloadAnimMontage = WeaponData[WeaponIndex].ReloadAnimMontage;
  75.     const auto CurrentWeaponData = WeaponData.FindByPredicate(
  76.         [&](const FWeaponData& Data)
  77.         {
  78.             return Data.WeaponClass == CurrentWeapon->GetClass();
  79.         });
  80.     CurrentReloadAnimMontage = CurrentWeaponData ? CurrentWeaponData->ReloadAnimMontage: nullptr;
  81.  
  82.    
  83.     AttachWeaponToSocket(CurrentWeapon, Character->GetMesh(), WeaponEquipSocketName);
  84.     EquipAnimInProgress = true;
  85.     PlayAnimMontage(EquipAnimMontage);
  86. }
  87.  
  88. void USTUWeaponComponent::AttachWeaponToSocket(ASTUBaseWeapon* Weapon, USceneComponent* SceneComponent, const FName& SocketName)
  89. {
  90.     if(!Weapon || !SceneComponent) return;
  91.    
  92.     FAttachmentTransformRules AttachmentRules(EAttachmentRule::SnapToTarget, false);
  93.     Weapon->AttachToComponent(SceneComponent, AttachmentRules, SocketName);
  94.    
  95. }
  96.  
  97. void USTUWeaponComponent::StartFire()
  98. {
  99.     if(!CanFire()) return;
  100.     CurrentWeapon->StartFire();
  101. }
  102.  
  103. void USTUWeaponComponent::StopFire()
  104. {
  105.     if(!CurrentWeapon) return;
  106.     CurrentWeapon->StopFire();
  107. }
  108.  
  109. void USTUWeaponComponent::NextWeapon()
  110. {
  111.     if (!CanEquip()) return;
  112.     CurrentWeaponIndex = (CurrentWeaponIndex + 1) % Weapons.Num();
  113.     EquipWeapon(CurrentWeaponIndex);
  114. }
  115.  
  116. void USTUWeaponComponent::Reload()
  117. {
  118.     //PlayAnimMontage(CurrentReloadAnimMontage);
  119.     UE_LOG(LogTemp, Warning, TEXT("Reload is done"))
  120. }
  121.  
  122. void USTUWeaponComponent::PlayAnimMontage(UAnimMontage* Animation)
  123. {
  124.     ACharacter* Character = Cast<ACharacter>(GetOwner());
  125.     if(!Character) return;
  126.  
  127.     Character->PlayAnimMontage(Animation);
  128. }
  129.  
  130. void USTUWeaponComponent::InitAnimations()
  131. {
  132.     if (!EquipAnimMontage) return;
  133.     const auto NotifyEvents = EquipAnimMontage->Notifies;
  134.     for (auto NotifyEvent : NotifyEvents)
  135.     {
  136.         auto EquipFinishedNotify = Cast<USTUEquipFinished>(NotifyEvent.Notify);
  137.         if (EquipFinishedNotify)
  138.         {
  139.             EquipFinishedNotify->OnNotified.AddUObject(this, &USTUWeaponComponent::OnEquipIsFinished);
  140.             break;
  141.         }
  142.     }
  143. }
  144.  
  145. void USTUWeaponComponent::OnEquipIsFinished(USkeletalMeshComponent* MeshComponent)
  146. {
  147.     ACharacter* Character = Cast<ACharacter>(GetOwner());
  148.     if(!Character) return;
  149.     if (Character->GetMesh() == MeshComponent)
  150.     {
  151.         EquipAnimInProgress = false;
  152.     }
  153. }
  154.  
  155. bool USTUWeaponComponent::CanFire() const
  156. {
  157.     return CurrentWeapon && !EquipAnimInProgress;
  158. }
  159.  
  160. bool USTUWeaponComponent::CanEquip() const
  161. {
  162.     return !EquipAnimInProgress;
  163. }
  164.  
Advertisement
Add Comment
Please, Sign In to add comment