Cleanup, refactor, and document weapon classes besides melee and projectile which will be refactored/implemented later
[git-p4: depot-paths = "//depot/main/": change = 152]
This commit is contained in:
		
							parent
							
								
									4b0f0b7767
								
							
						
					
					
						commit
						7817b25af5
					
				
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Revolver/BP_Revolver.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Revolver/BP_Revolver.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Revolver/BP_RevolverImpact.uasset
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Revolver/BP_RevolverImpact.uasset
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Revolver/RevolverDamageFalloffCurve.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Revolver/RevolverDamageFalloffCurve.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Shotgun/BP_Shotgun.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Shotgun/BP_Shotgun.uasset
									 (Stored with Git LFS)
									
									
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Shotgun/BP_ShotgunImpact.uasset
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Content/Weapons/Shotgun/BP_ShotgunImpact.uasset
									 (Stored with Git LFS)
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Source/SwordNGun/Private/Effects/SNGImpactEffect.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Source/SwordNGun/Private/Effects/SNGImpactEffect.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -0,0 +1,128 @@
 | 
				
			|||||||
 | 
					// Project Sword & Gun Copyright © 2021 Kevin Poretti
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "Weapons/SNGInstantRangedWeapon.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "DrawDebugHelpers.h"
 | 
				
			||||||
 | 
					#include "Characters/SNGCharacterBase.h"
 | 
				
			||||||
 | 
					#include "Kismet/GameplayStatics.h"
 | 
				
			||||||
 | 
					#include "Particles/ParticleSystemComponent.h"
 | 
				
			||||||
 | 
					#include "PhysicalMaterials/PhysicalMaterial.h"
 | 
				
			||||||
 | 
					#include "SwordNGun/SNGTypes.h"
 | 
				
			||||||
 | 
					#include "SwordNGun/SwordNGun.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int32 DebugInstantWeaponDrawing = 0;
 | 
				
			||||||
 | 
					FAutoConsoleVariableRef CVARDebugInstantWeaponDrawing(TEXT("SNG.DebugInstantWeapons"),
 | 
				
			||||||
 | 
					                        DebugInstantWeaponDrawing, 
 | 
				
			||||||
 | 
					                        TEXT("Draw debug line traces and impact points for instant type ranged weapons"), 
 | 
				
			||||||
 | 
					                        ECVF_Cheat);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ASNGInstantRangedWeapon::ASNGInstantRangedWeapon()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Range = 10000.0f;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ASNGInstantRangedWeapon::PlayTracerEffect(FVector TraceEnd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// perform tracer effect from muzzle to trace end
 | 
				
			||||||
 | 
						if(TracerEffect)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							FVector MuzzleLocation = WeaponMesh->GetSocketLocation(MuzzleSocketName);
 | 
				
			||||||
 | 
							UParticleSystemComponent* TracerComp =
 | 
				
			||||||
 | 
								UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), TracerEffect, MuzzleLocation);
 | 
				
			||||||
 | 
							if(TracerComp)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								TracerComp->SetVectorParameter(TracerTargetName, TraceEnd);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ASNGInstantRangedWeapon::DoFire_Implementation()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						Super::DoFire_Implementation();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						DoLineTrace();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ASNGInstantRangedWeapon::DoLineTrace(FRotator SpreadOffset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						// Get weapon owner and check if valid
 | 
				
			||||||
 | 
						AActor* WeaponOwner = GetOwner();
 | 
				
			||||||
 | 
						if(!WeaponOwner)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							UE_LOG(LogTemp, Error, TEXT("SNGHitscanWeapon :: Weapon does not have owner"));
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Get actor eyes viewpoint
 | 
				
			||||||
 | 
						FVector EyesLocation;
 | 
				
			||||||
 | 
						FRotator EyesRotation;
 | 
				
			||||||
 | 
						WeaponOwner->GetActorEyesViewPoint(EyesLocation, EyesRotation);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// Calculate final raycast direction based on actor eyes and spread offset
 | 
				
			||||||
 | 
						// find trace end using range value or final falloff curve keyframe
 | 
				
			||||||
 | 
						FRotator ShotRotation = EyesRotation + SpreadOffset;
 | 
				
			||||||
 | 
						FVector ShotDirection = ShotRotation.Vector();
 | 
				
			||||||
 | 
						FVector TraceEnd = EyesLocation + (ShotDirection * Range);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// set up collision query params (ignore weapon and owner, trace complex, return phys material)
 | 
				
			||||||
 | 
						FCollisionQueryParams QueryParams;
 | 
				
			||||||
 | 
						QueryParams.AddIgnoredActor(this);
 | 
				
			||||||
 | 
						QueryParams.AddIgnoredActor(WeaponOwner);
 | 
				
			||||||
 | 
						QueryParams.bTraceComplex = true;
 | 
				
			||||||
 | 
						QueryParams.bReturnPhysicalMaterial = true;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						// do line trace
 | 
				
			||||||
 | 
						EPhysicalSurface SurfaceType = SurfaceType_Default;
 | 
				
			||||||
 | 
						FHitResult HitResult;
 | 
				
			||||||
 | 
						bool IsHitSuccessful = GetWorld()->LineTraceSingleByChannel(HitResult, EyesLocation, TraceEnd, COLLISION_RANGED_WEAPON, QueryParams);
 | 
				
			||||||
 | 
						if(IsHitSuccessful)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							AActor* HitActor = HitResult.GetActor();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							SurfaceType = UPhysicalMaterial::DetermineSurfaceType(HitResult.PhysMaterial.Get());
 | 
				
			||||||
 | 
							//int ActualDamage = CalculateWeaponDamage();
 | 
				
			||||||
 | 
							// NOTE(kevin): This won't work once we have weapon falloff curves. Might want to separate damage from HitData
 | 
				
			||||||
 | 
							// eventually
 | 
				
			||||||
 | 
							if(SurfaceType == SNG_SURFACE_Flesh || SurfaceType == SNG_SURFACE_FleshVulnerable)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								OnHit.Broadcast();
 | 
				
			||||||
 | 
								if(HitMarkerSound)
 | 
				
			||||||
 | 
									UGameplayStatics::PlaySound2D(GetWorld(), HitMarkerSound);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							int ActualDamage = HitData.BaseDamage; 
 | 
				
			||||||
 | 
							if(SurfaceType == SNG_SURFACE_FleshVulnerable)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ActualDamage *= VulnerableDamageMultiplier;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							FSNGDamageEvent DamageEvent;
 | 
				
			||||||
 | 
							DamageEvent.DamageTypeClass = UDamageType::StaticClass();
 | 
				
			||||||
 | 
							DamageEvent.HitData = HitData;
 | 
				
			||||||
 | 
							DamageEvent.SurfaceType = SurfaceType;
 | 
				
			||||||
 | 
							DamageEvent.ImpactPoint = HitResult.ImpactPoint;
 | 
				
			||||||
 | 
							HitActor->TakeDamage(ActualDamage, DamageEvent, WeaponOwner->GetInstigatorController(), this);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							if(HitData.HitstopApplicationType == ESNGHitstopApplicationType::Both ||
 | 
				
			||||||
 | 
								HitData.HitstopApplicationType == ESNGHitstopApplicationType::CauserOnly)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								ASNGCharacterBase* OwnerAsChar = Cast<ASNGCharacterBase>(GetOwner());
 | 
				
			||||||
 | 
								OwnerAsChar->ApplyHitStop(HitData.StopTime, HitData.SlowTime);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							FTransform SpawnTransform(HitResult.ImpactNormal.Rotation(), HitResult.ImpactPoint);
 | 
				
			||||||
 | 
							PlayImpactEffects(SurfaceType, SpawnTransform);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						PlayFireEffect();
 | 
				
			||||||
 | 
						PlayTracerEffect(IsHitSuccessful ? HitResult.ImpactPoint : TraceEnd);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if(DebugInstantWeaponDrawing)
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							DrawDebugLine(GetWorld(), EyesLocation, TraceEnd, FColor::Red, false, 1.0f, 0, 1.0f);
 | 
				
			||||||
 | 
							DrawDebugSphere(GetWorld(), HitResult.ImpactPoint, 5.0f, 32, FColor::Green, false, 1.0f, 0, 1.0f);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								SwordNGun/Source/SwordNGun/Public/Effects/SNGImpactEffect.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								SwordNGun/Source/SwordNGun/Public/Effects/SNGImpactEffect.h
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							@ -0,0 +1,57 @@
 | 
				
			|||||||
 | 
					// Project Sword & Gun Copyright © 2021 Kevin Poretti
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#pragma once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "CoreMinimal.h"
 | 
				
			||||||
 | 
					#include "Weapons/SNGRangedWeaponBase.h"
 | 
				
			||||||
 | 
					#include "SNGInstantRangedWeapon.generated.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 *	Base class for instant type ranged weapons.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 *	An instant weapon is one where a line trace is performed in the same tick when the weapon is fired. If the line
 | 
				
			||||||
 | 
					 *	trace hits something damage is also applied immediately. 
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					UCLASS()
 | 
				
			||||||
 | 
					class SWORDNGUN_API ASNGInstantRangedWeapon : public ASNGRangedWeaponBase
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						GENERATED_BODY()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
						/** Sets default values for this actor's properties. */
 | 
				
			||||||
 | 
						ASNGInstantRangedWeapon();
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					protected:
 | 
				
			||||||
 | 
						/** The length/distance of the line trace */
 | 
				
			||||||
 | 
						UPROPERTY(EditDefaultsOnly, Category="Properties")
 | 
				
			||||||
 | 
						float Range;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 *	Spawns and plays the tracer/smoke trailer effect.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *	The tracer will be spawned from this weapon's muzzle socket location and will stretch to the location provided
 | 
				
			||||||
 | 
						 *	by the TraceEnd parameter.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *	@param TraceEnd where the tracer effect should end
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						void PlayTracerEffect(FVector TraceEnd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 *	C++ implementation of the DoFire function, which is called in Fire if this weapon is actually able to be fired.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *	This function is overriden to do a single line trace.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						virtual void DoFire_Implementation() override;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 *	Performs the actual line trace from the weapon owner's "eyes." For example, if the weapon owner is a player it
 | 
				
			||||||
 | 
						 *	will perform a line trace from the center of the camera.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *	If something is hit this will apply damage if applicable and play appropriate effects.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 *	@param SpreadOffset modifies the direction of the line trace by this rotation
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						UFUNCTION(BlueprintCallable)
 | 
				
			||||||
 | 
						void DoLineTrace(FRotator SpreadOffset = FRotator::ZeroRotator);
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user