Guest User

Weapon CPP

a guest
Feb 15th, 2016
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. #include "EnterAurora.h"
  2. #include "AuroraBaseWeapon.h"
  3.  
  4. // Sets default values
  5. AAuroraBaseWeapon::AAuroraBaseWeapon(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
  6. {
  7.     // Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
  8.     PrimaryActorTick.bCanEverTick = true;
  9.  
  10.     // Create Weapon Mesh
  11.     weaponMesh = ObjectInitializer.CreateDefaultSubobject<USkeletalMeshComponent>(this, TEXT("Weapon Mesh"));
  12.     RootComponent = weaponMesh;
  13.  
  14.     // Create Audio Component
  15.     audioSource = ObjectInitializer.CreateDefaultSubobject<UAudioComponent>(this, TEXT("Audio Source"));
  16.     audioSource->AttachTo(RootComponent);
  17.     audioSource->bAutoActivate = false;
  18. }
  19.  
  20. // Called when the game starts or when spawned
  21. void AAuroraBaseWeapon::BeginPlay()
  22. {
  23.     Super::BeginPlay();
  24.  
  25.     // Clamp cryo level
  26.     currentCryoLevel = FMath::Clamp(currentCryoLevel, 0.0f, maxCryoLevel);
  27. }
  28.  
  29. // Called every frame
  30. void AAuroraBaseWeapon::Tick(float DeltaTime)
  31. {
  32.     Super::Tick(DeltaTime);
  33.  
  34.     if (currentCryoLevel > 0.0f)
  35.     {
  36.         currentCryoLevel -= cryoMultiplier * DeltaTime;
  37.         GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, TEXT("Current Cryo level: ") + FString::SanitizeFloat(currentCryoLevel));
  38.     }
  39. }
  40.  
  41. void AAuroraBaseWeapon::OnWeaponFireStart()
  42. {
  43.     if (!bExhausted)
  44.     {
  45.         if (projectileType == EWeaponProjectile::EBullet)
  46.         {
  47.             // Debug Message
  48.             GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, TEXT("Bullet"));
  49.             Instant_Fire();
  50.             audioSource->Activate(true);
  51.             audioSource->Play(0.0f);
  52.             currentCryoLevel += cryoMultiplier;
  53.             GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, TEXT("Current Cryo level: ") + FString::SanitizeFloat(currentCryoLevel));
  54.             CheckCryoLevel();
  55.             GetWorld()->GetTimerManager().SetTimer(exhaustedHandler, this, &AAuroraBaseWeapon::ExhaustedWaitTimer, 2.0f, false);
  56.         }
  57.         if (projectileType == EWeaponProjectile::ESpread)
  58.         {
  59.             // Debug Message
  60.             GEngine->AddOnScreenDebugMessage(-1, 2.0f, FColor::Green, TEXT("Spread"));
  61.  
  62.             // For loop for spread
  63.             for (int32 i = 0; i <= weaponSpread; i++)
  64.             {
  65.                 Instant_Fire();
  66.                 audioSource->Activate(true);
  67.                 audioSource->Play(0.0f);
  68.             }
  69.         }
  70.     }
  71.  
  72.     GetWorld()->GetTimerManager().SetTimer(fireHandler, this, &AAuroraBaseWeapon::OnWeaponFireStart, fireRate, false);
  73. }
  74.  
  75. void AAuroraBaseWeapon::OnWeaponFireStop()
  76. {
  77.     GetWorld()->GetTimerManager().ClearTimer(fireHandler);
  78. }
  79.  
  80. void AAuroraBaseWeapon::Instant_Fire()
  81. {
  82.     const int32 RandomSeed = FMath::Rand();
  83.     FRandomStream weaponRandomStream(RandomSeed);
  84.     const float currentSpread = weaponSpread;
  85.     const float spreadCone = FMath::DegreesToRadians(weaponSpread * 0.5f);
  86.     const FVector aimDir = weaponMesh->GetSocketRotation(muzzleSocket).Vector();
  87.     const FVector startTrace = weaponMesh->GetSocketLocation(muzzleSocket);
  88.     const FVector shootDir = weaponRandomStream.VRandCone(aimDir, spreadCone, spreadCone);
  89.     const FVector endTrace = startTrace + shootDir * weaponRange;
  90.     const FHitResult impact = WeaponTrace(startTrace, endTrace);
  91.     ProcessInstantHit(impact, startTrace, shootDir, RandomSeed, currentSpread);
  92. }
  93.  
  94. void AAuroraBaseWeapon::CheckCryoLevel()
  95. {
  96.     if (currentCryoLevel >= maxCryoLevel)
  97.     {
  98.         bExhausted = true;
  99.     }
  100.     else
  101.         bExhausted = false;
  102. }
  103.  
  104. void AAuroraBaseWeapon::ExhaustedWaitTimer()
  105. {
  106.     if (currentCryoLevel < 10.0f)
  107.     {
  108.         bExhausted = false;
  109.     }
  110. }
  111.  
  112. FHitResult AAuroraBaseWeapon::WeaponTrace(const FVector & TraceFrom, const FVector & TraceTo) const
  113. {
  114.     static FName weaponFireTag = FName(TEXT("WeaponTrace"));
  115.  
  116.     FCollisionQueryParams traceParams(weaponFireTag, true, Instigator);
  117.     traceParams.bTraceAsyncScene = true;
  118.     traceParams.bReturnPhysicalMaterial = true;
  119.     traceParams.AddIgnoredActor(this);
  120.  
  121.     FHitResult hit(ForceInit);
  122.  
  123.     GetWorld()->LineTraceSingleByChannel(hit, TraceFrom, TraceTo, Trace_Weapon, traceParams);
  124.  
  125.     return hit;
  126. }
  127.  
  128. void AAuroraBaseWeapon::ProcessInstantHit(const FHitResult & Impact, const FVector & Origin, const FVector & ShootDir, int32 RandomSeed, float ReticleSpread)
  129. {
  130.     const FVector endTrace = Origin + ShootDir * weaponRange;
  131.     const FVector endPoint = Impact.GetActor() ? Impact.ImpactPoint : endTrace;
  132.     DrawDebugLine(this->GetWorld(), Origin, Impact.TraceEnd, FColor::Red, true, 1000.0f, 10.0f);
  133.  
  134.     FDamageEvent damageEvent;
  135. }
Add Comment
Please, Sign In to add comment