From 7817b25af5d6c7a024ae6cce1497040f0c3425b3 Mon Sep 17 00:00:00 2001 From: Kevin Poretti Date: Sat, 13 Nov 2021 20:07:04 -0500 Subject: [PATCH] Cleanup, refactor, and document weapon classes besides melee and projectile which will be refactored/implemented later [git-p4: depot-paths = "//depot/main/": change = 152] --- .../Weapons/Revolver/BP_Revolver.uasset | 4 +- .../Weapons/Revolver/BP_RevolverImpact.uasset | 3 + .../RevolverDamageFalloffCurve.uasset | 3 - .../Content/Weapons/Shotgun/BP_Shotgun.uasset | 4 +- .../Weapons/Shotgun/BP_ShotgunImpact.uasset | 3 + .../Private/Effects/SNGImpactEffect.cpp | Bin 0 -> 4928 bytes .../Private/Weapons/SNGHitscanWeapon.cpp | Bin 9024 -> 0 bytes .../Weapons/SNGInstantRangedWeapon.cpp | 128 ++++++++++++++++++ .../Private/Weapons/SNGMeleeWeaponBase.cpp | Bin 5686 -> 5718 bytes ...apon.cpp => SNGProjectileRangedWeapon.cpp} | Bin 208 -> 220 bytes .../Private/Weapons/SNGRangedWeaponBase.cpp | Bin 5374 -> 10694 bytes .../Private/Weapons/SNGWeaponBase.cpp | Bin 2444 -> 4238 bytes .../Public/Components/SNGHealthComponent.h | Bin 6050 -> 6258 bytes .../Public/Effects/SNGImpactEffect.h | Bin 0 -> 6928 bytes .../Public/Weapons/SNGHitscanWeapon.h | Bin 1446 -> 0 bytes .../Public/Weapons/SNGInstantRangedWeapon.h | 57 ++++++++ ...leWeapon.h => SNGProjectileRangedWeapon.h} | Bin 628 -> 652 bytes .../Public/Weapons/SNGRangedWeaponBase.h | Bin 5230 -> 15130 bytes .../SwordNGun/Public/Weapons/SNGWeaponBase.h | Bin 3436 -> 4966 bytes SwordNGun/Source/SwordNGun/SNGTypes.h | Bin 20848 -> 21446 bytes 20 files changed, 195 insertions(+), 7 deletions(-) create mode 100644 SwordNGun/Content/Weapons/Revolver/BP_RevolverImpact.uasset delete mode 100644 SwordNGun/Content/Weapons/Revolver/RevolverDamageFalloffCurve.uasset create mode 100644 SwordNGun/Content/Weapons/Shotgun/BP_ShotgunImpact.uasset create mode 100644 SwordNGun/Source/SwordNGun/Private/Effects/SNGImpactEffect.cpp delete mode 100644 SwordNGun/Source/SwordNGun/Private/Weapons/SNGHitscanWeapon.cpp create mode 100644 SwordNGun/Source/SwordNGun/Private/Weapons/SNGInstantRangedWeapon.cpp rename SwordNGun/Source/SwordNGun/Private/Weapons/{SNGProjectileWeapon.cpp => SNGProjectileRangedWeapon.cpp} (55%) create mode 100644 SwordNGun/Source/SwordNGun/Public/Effects/SNGImpactEffect.h delete mode 100644 SwordNGun/Source/SwordNGun/Public/Weapons/SNGHitscanWeapon.h create mode 100644 SwordNGun/Source/SwordNGun/Public/Weapons/SNGInstantRangedWeapon.h rename SwordNGun/Source/SwordNGun/Public/Weapons/{SNGProjectileWeapon.h => SNGProjectileRangedWeapon.h} (70%) diff --git a/SwordNGun/Content/Weapons/Revolver/BP_Revolver.uasset b/SwordNGun/Content/Weapons/Revolver/BP_Revolver.uasset index 892600d..c67f117 100644 --- a/SwordNGun/Content/Weapons/Revolver/BP_Revolver.uasset +++ b/SwordNGun/Content/Weapons/Revolver/BP_Revolver.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6dfcee3d24acafb18277540acd2b8a85e668403e4d238393d3845848a818fdfb -size 188658 +oid sha256:5a8e3b66702dc90c2bfe27e76562f50bb8541a23661dea30e3f7ce4bda004ed5 +size 184081 diff --git a/SwordNGun/Content/Weapons/Revolver/BP_RevolverImpact.uasset b/SwordNGun/Content/Weapons/Revolver/BP_RevolverImpact.uasset new file mode 100644 index 0000000..060cb25 --- /dev/null +++ b/SwordNGun/Content/Weapons/Revolver/BP_RevolverImpact.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c60a08e7d63b6e74a8d29bb3161f74219990329d9bc3fcd71b6bcb5ddaff8bd9 +size 23220 diff --git a/SwordNGun/Content/Weapons/Revolver/RevolverDamageFalloffCurve.uasset b/SwordNGun/Content/Weapons/Revolver/RevolverDamageFalloffCurve.uasset deleted file mode 100644 index d7c491f..0000000 --- a/SwordNGun/Content/Weapons/Revolver/RevolverDamageFalloffCurve.uasset +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:c2e09f762e1ac647e0a421b26b67b913f29c7afdf1f666185957878df201687e -size 1463 diff --git a/SwordNGun/Content/Weapons/Shotgun/BP_Shotgun.uasset b/SwordNGun/Content/Weapons/Shotgun/BP_Shotgun.uasset index 9d36639..d2e2ca5 100644 --- a/SwordNGun/Content/Weapons/Shotgun/BP_Shotgun.uasset +++ b/SwordNGun/Content/Weapons/Shotgun/BP_Shotgun.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fdf6abb96a3f1dc59d8a8696b9c7dc5d9d4141d9f76d617242059de45ff89a30 -size 221915 +oid sha256:b0c64f5a4835ea13aac3b323dfc46b79931a190a9b63020db1994a9a0b691d6b +size 222700 diff --git a/SwordNGun/Content/Weapons/Shotgun/BP_ShotgunImpact.uasset b/SwordNGun/Content/Weapons/Shotgun/BP_ShotgunImpact.uasset new file mode 100644 index 0000000..1767ee7 --- /dev/null +++ b/SwordNGun/Content/Weapons/Shotgun/BP_ShotgunImpact.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebbefc7896855fe458db3e986da9df1095546f1b55936f87fbcdd5b9d495e66d +size 22382 diff --git a/SwordNGun/Source/SwordNGun/Private/Effects/SNGImpactEffect.cpp b/SwordNGun/Source/SwordNGun/Private/Effects/SNGImpactEffect.cpp new file mode 100644 index 0000000000000000000000000000000000000000..717013ef5d7e77477fd5301769e1428c514e6264 GIT binary patch literal 4928 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 diff --git a/SwordNGun/Source/SwordNGun/Private/Weapons/SNGInstantRangedWeapon.cpp b/SwordNGun/Source/SwordNGun/Private/Weapons/SNGInstantRangedWeapon.cpp new file mode 100644 index 0000000..d313c68 --- /dev/null +++ b/SwordNGun/Source/SwordNGun/Private/Weapons/SNGInstantRangedWeapon.cpp @@ -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(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); + } +} + + diff --git a/SwordNGun/Source/SwordNGun/Private/Weapons/SNGMeleeWeaponBase.cpp b/SwordNGun/Source/SwordNGun/Private/Weapons/SNGMeleeWeaponBase.cpp index d1bed1f8be87803176625075ead50d0d1f3fdbb7..25e41e11c744c031ae2ec7c4690fbddb4599020c 100644 GIT binary patch delta 68 zcmdm{b4_Q%2|nXc1{a1zhFl;{XGmoTVW?y%0Mb@K7|c)t6fI%MWJqRkX2=1ui-Ays PL345=pYrB^d=~5gN^%f7 delta 36 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 delta 1026 zcmbW0&1w@-6vt0QVkfp5rV^7t(lHa7sU)o~bTOJrwT%^u1k+|4W|~P88XM_MC@xAw ze1o%bsV^X6z*TWkihI$uYd0eG0mT2klh#|XAaa?xU+4VJ=lxjwHS;zb;dfSXxEErJ^0UVX5JclVX$|bCM5|FL^(yb2n9-IBpwcp~Rn(Q|CsJ^7mAk?%O-xG$xc;JCbfN6kw?+I9^Boc=J0c-ET0YUMaS4S?aOmC z2O~a`>S7lCDSE=^!~B)n271xM&Op&TS&&&0!-aGpPkZQ01BL0~zXKWZcf ry8wg^NOySCe0{w{C8eyP2R&$o35QgXLBJm$qK?1h|C-AWp)TB+T3IP#uxqNhdNw#(D;I$J)h#$nC1m0(6 zk9XIxod%@JTJP?;%;lYT=FI-{_rC30ZYMUknZ31<4Q!$JQ@hdo+=hDoRM#t8+En-F z8ojbx%@lTS7ryo{jelhay1vxYcam|fSyrF8jFDC?H1e^1w7Nd=6$6_{?oc~&+p}ME z?@RhjdrMh$YClMCbM#2_rB-#Nd2c0a-yZ9S&1fq1gv7DdE+rptuJw$jknCPh|%Ln$(ke18NYq#}Q&tuu#w@bZaac;k9=Tdj}5|f4A=G9a3f2LhypF>Nb z-GKm7b3KDYpmym}20mW+p4&?PQ1_|u1MjKkN6wu>?_KvabB-aqFKM^J2&RE~@}+BM z;ulsPSN^1#+`e(^<{rbZD|tjBYw_cIX)P7iSpQtIVbntZFLc$6IF+0;={{RA{;9oD z1m0=YMAt&QCYGeZc@V+Bk*l(L)|i`i?I|*kEZN#*aa!?(d7npWX2VFLp<_ z>C3|+n$V6KIF^Sqc?LfB)kCtn&BPZPNsMb(#H{60MCU-3vqgb;p zv1> zu;Ihiq-U-v3viy)VWi>uw|qpQ2V$XQ-T;nV)hu zv$j>Qm4ykPp7c=hsKlJhR3@Zh9k~u4>Elwhn|kKJR?e+@rfq+86A^)2T)w+LDkJr9 zDLE7Uk{@Vp?vHb4T3MIQu0k@SZw=d`zpA^n_s{agoF*#ALStOXFJ=F+`j`u67abTj zv?IGM(ws&w75BRsH?`fJZ+45>s?s+1G%chL-ZmFq(JT3~P}f9+CshrLP6Qs@DE^1? zi&J7=bxm}CAUw3E_v)uJYU=N49}G(!2q?7Y*YT+9BmHGtTGP|OC0o_rtR=U(67QNi z*W*QR*&a*TnYy>#vR{g$Q(bhPr=Crq7`;l{{!P(MI^ty8e!j&CM85NNML*FzU+6)a zRik<8<%&S`#sByG+kCRoNzW8vB3oL$hEBT8-rZery|a04Zj!nAH00|v>POUxcK=B& zIoCW`&{a~i___m8xZdnn%T*MS)YV-2@_YYUawI+H&Vp1`*83bd7vENVGj3j=*g^eX s=f=9f+rI)IZhiXl>WEc!pT}1eU(|iovBHsT$G7cKEo0NZ@T~3Ezr^~t3jhEB delta 218 zcmeBE>=B-Dj8T8$NzKhhj2(=;ybN3noD4w>`9N4Q`6`nodon{RLmorwWMyV$S*SRJ z5`!iXS~H-ku4Z;;BB#5uipg;LEU*zNm VTzZqE_~RJ$C-3H02lFHZ$^bhgHT?hp diff --git a/SwordNGun/Source/SwordNGun/Public/Components/SNGHealthComponent.h b/SwordNGun/Source/SwordNGun/Public/Components/SNGHealthComponent.h index 08190aec3b2c5a54ff23f334fab6773e7ac66b5a..e5453d54c1e61f8cbadb1227a69a286c7a83148e 100644 GIT binary patch delta 263 zcmZ3a|H)uO5udRRg91Y?Ln=cFLn4r63&a`>&I~y~UM@ocgD*oSLmpJzfI*MJfFX@R sb8{izWJYo{PFCaafh#~_fKM>*AyhyN#B11O23CFMi04)zLg#Z8m delta 55 xcmexlut;dq8yv;gqq+2o5e(8SO5TD5T5`5 diff --git a/SwordNGun/Source/SwordNGun/Public/Effects/SNGImpactEffect.h b/SwordNGun/Source/SwordNGun/Public/Effects/SNGImpactEffect.h new file mode 100644 index 0000000000000000000000000000000000000000..505c6ec05d5d90edcb2a9ceda5bf67fd615be592 GIT binary patch literal 6928 zcmd5=T~8BH5S`bW_#ZZyC=dnp5kDf(LWrUb1&L3l(xt4>kL;FWHU1#~q(E)@OMM5@OLOJj345=E0@y6?>1)p zGQvtAZ8_7uzcBw?p5prqqqop8#42~!RfmsV1I*l)d-{C<4WTq4-@((vo-VBVsdY-9 z$OUY+Fz?Bd+6^(@SIvP+UdS2{EX6vfWp<&x1DPGQ#*yQ64#u0xlMHXx(EvI!Z$ZY! z+nDonCEvqqdqB_!4tljFr}#JzuYtV}y}n`_;J201M^7Dr^E=>d;Ik|%%91{5N`wz1 zbSxj_K&nDJM|gh5?m8@bDs_`}Pd2ct4;EjbF#tNsm``Z`hgz&acMZC0u(TeS|q8Z$hSlT_Jo+Kl}0;Y|?(uuD*z|In2y@YGr&Fg9Q1ytm4BAZbCD& zm%e8%MrxV6I~s>oWCnFr;^%yl9(49p8?)mI%so8Mpp_%O6%jl{Tmg8w2t^r|Pr#G1 zS#&NtdMejc+Xxqj- zJ<^7i5dL|Ew{p^R5$0SLSCFlftBsUb>G!O)$=xo7&g<9v+x*G%g1%yunR9JeIMsMY z@VSRbCowFK2X@BzieNv~I40*0PXXq3+9%7H3*=nq2b!6lKKZ7ul-_3_XYiZt$Ncy9 z<~-s%#CMGTD`Ort#`uci&(nctP&wIGV|25*FLr`l#iw3aQtroNd_}NlJvD%Zi;}Y6 zALA>6JuAr`PQr3#{c()02JgGs;c;4-f@fE|KHy2ldmy>;hZyxq`qv4Gr;gdZT zZBJ6O_SM59NZ5bIc`Mcknd$CRta9ncGSsTZFb|Ig@!broz;LQwHUwR>pnx8&(EqnlUj^l(UqOy%x9O>aVF!qP2O2;J?|7Q zzIrn(`TVR_GpWU**T!A6*!s+n&ciQ3V^Y^eun*j>514dY*l$bv#a5kFw7bq5_a!8F z`x>H#3iK|*emnnn?4cjQo?W0j0{M=+5Igtmg1KG=`>v7pZ`pqzVm-u%T6~#~fU5|J zf&F0K`&cg~IEg&lh0G$Ktn=7sWu6ityKjk}Y=4vUBkh5jbsJUW4Qvt#JHOo=Jn5e8 zblv&yc+y?NtPdvpna*qJuJmMm&K|#q4khEm7~VDt5hRn!`fmOIKaiN`?ai_pecIc$ LYqp<%#{T{b`gdTD literal 0 HcmV?d00001 diff --git a/SwordNGun/Source/SwordNGun/Public/Weapons/SNGHitscanWeapon.h b/SwordNGun/Source/SwordNGun/Public/Weapons/SNGHitscanWeapon.h deleted file mode 100644 index 8c5f244f94653b5fcc15da612d5fa29afabcdd1a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1446 zcmchX-)<675XR>g6W?J|6NAPS>m{ZaZFg6VS~e_b^rk^rDh3v^KpSHEK)$5<`(_u| z#xk2PFs`_jcH$TrS}P=v?UAo1AQU#he#U=*PL9{Cb}#FpP4PKG9@v5V zEjWL4-j7*gyoJRI?V)4U zQ4SqB2S*XE+{+$O8EDyaemVv0!S2-ZQ=dpb*a=)yYuYoHDHGzhL_39ZhZsVSrO*Eb z+KIj6PF9NWZgzpS(OZz$Z(vT~zqfiQFJk=D`84nm;VFX0iS^h+Se(Kuv@bi>(yx1J zSGEtcRNSvC?Gi=3sa&czRktlxpUAuTO`J>5y+_=uIw6{4^0p>Y)v80)r*!TMVm_;C zbLsuLv17WZoPY&Z1^N^ACDO724O3m#+*~1#!I?XP>KAfSAFHEc_Nm{F@x8YwqfsnE z`d^&KJDx$U>+6|q_@pY{wKEU+o)f#KKEZlGzGA*Lc@Ytf*;Ruk(ofY{uS7r>sNXfk z5qTbwH_f%ORqzvHcB`iMc@DAMdcB~tXY|n&`xz_8yXIpUA1q%)5)&Kwi diff --git a/SwordNGun/Source/SwordNGun/Public/Weapons/SNGInstantRangedWeapon.h b/SwordNGun/Source/SwordNGun/Public/Weapons/SNGInstantRangedWeapon.h new file mode 100644 index 0000000..804fc9a --- /dev/null +++ b/SwordNGun/Source/SwordNGun/Public/Weapons/SNGInstantRangedWeapon.h @@ -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); +}; + diff --git a/SwordNGun/Source/SwordNGun/Public/Weapons/SNGProjectileWeapon.h b/SwordNGun/Source/SwordNGun/Public/Weapons/SNGProjectileRangedWeapon.h similarity index 70% rename from SwordNGun/Source/SwordNGun/Public/Weapons/SNGProjectileWeapon.h rename to SwordNGun/Source/SwordNGun/Public/Weapons/SNGProjectileRangedWeapon.h index 5d9044194f056c744851ddcd590b0b3052ff0c25..c9852b83029ce66ceede484a04b405826450ff74 100644 GIT binary patch delta 21 acmeyu(!;vJi*e#7iOFG%GeFcY#wq|~B?(0U delta 15 WcmeBS{lc=ri*a%oQq&C|L5Nin}-(hH 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 D>HxUz delta 395 zcmbPL_D*BNHfBbJ$=d9%CwFmJO#Z@|1;jp+*Ko@KX^+WmLO@zLj@6ohmw{{YTj9{j z3A{X$_i*z}{vuK^xjI6A8mBAILI)y=#0TO8OCYr#YRGVC6ZU@$_IC+*iFbIw1CI?t?anwRo GF#rI^1$XrT diff --git a/SwordNGun/Source/SwordNGun/Public/Weapons/SNGWeaponBase.h b/SwordNGun/Source/SwordNGun/Public/Weapons/SNGWeaponBase.h index ce0b30220fe40ba2e33cd490135a6fdea24a3ec3..4eb2ed7ce20efd213ad151845af63e9f08662118 100644 GIT binary patch literal 4966 zcmdUz+iqG%6o%)PN_~f|R7#zwvfEy|2gL^xMQIw#K&xI^1_LI+K-pjmRe7MkWZVB+ zi}B1h2PaljsX~~&=dcd{{Od6O`>(yQ7m9EarePf3hHmJDncf@WM(@*bq36f?z6kR$ z((jQ*Ct;zPLFk7|Tl=TRzYSmO`;DGnNyfEiS$$$Mx>_~U$miiR`+gw_({Qf+SNdCM z%}83i**v>DVJMv!8ZW{l(>vAkYm+>%ox`vz3mz?HuI{Oao<8nTDK8u0XZi6`dneM1 zpZSXIvR-J%m1I3P%XxBq-bwC($pWqIGF<^>n89-{j4K@OY{5GyS$S+qAa>dD^r!b&b{K^MT&$VMo^I+UwzWAv};R z6Vuqxb6-}R3z@kr>4qoaJ45$VXm6RnA8G*@?1iWL@Korxc8gwNTmi{aGd<&65!(8l zi64cX+fd%Xq;qM7)9`O(sPlHCxp*d}kdHdzZ%w%Nv~D4pbCUu(h2&2)2J`y%HrC&c zAqR%8uPXg3t%y=?v~#Er7LH{*aW~Z1JMA256+5w#@tIZ>rs-0%L?5F)J&m=Sc!k@q zZ6}`Q=Nwr^q)l&qt1b7OW=O2tmC)F;y{#n=8`{4khJX>V8u4#P_ZzYF*eq)4@0s{_ zA_NQlZjON>>}$nD__hs&j;&9zg`Pi5TTPzUCATgu&g^69IFweRBHC25wYj`~aRw>1 zC6hpn+yraLGd=k*mu`@~)-(C1Tj3OZ8rX>E5Agib-pOcWM$U#@$G%<3c`9A5bDQtj z?2(q+=g-ddBeSPt_Bpq(8hc<_&zOP5ctWNkyE2pfh#YF$IBcI7&g7an7v;fjGV(zC z@dzfOiJYD=$fKr^zjN(j7jf7#OP$4F<|voORxoFbsBw1HB-bO`pNMVvUp*CKCux5x z4IVRC>ltgLkwTRSn_~`!U3~y_u)apFja57lq z(O5l$j@A!_4BX=E1}1-#=g)+9)gL_Be#)L59&)mYW09xSZa6$QtKrsA_F^~Hzv@X> z5trC@KZ{eviR^V0b0+1uY_jQE7I9iJf|FdYWcOQAtv>&*HC5RkYSD?YV_~eKzll8x zw*A-9_sq0YBfYlJ4Uip)?xrFWpF9@*H;#<8Dvgs7(mo$|9#Plu%QFMDnrKh4o%10v zv=*v%<(*tpnuu;P4_O(zk%xWoml%wZmv;g52>DFagZvx{RTgr5b-nYK*!Otxj2AWM z`#sN&me$2wO{{r`>RG|-sb|6a*&jKRBa!#CrEIRN_Ff8KGL~ne#+`GizQ^+=+dkK6 zui~0(Tb+-UEY@Gg%zXrd{W~=n3G|)RE3oi>EUz}4;aD-?{c)i+v1{BGw|VVt34>Gh z2Pf7uG_6ZG6fdanRBmd~OuYn^EB3&2A>9B9WIejMzMb77{GdBW-Kqw=O1;HX``G@v zkWC}WivD=6SnUL;W*>_Z_qG2EQtLA2>TSf)TDNu`V)VkLn4fM0>+=h}Lh91iF{Lg} z(!m@{V(Jk~J3Hci6Gx&2i61R>oZj72;mHAU4fkqtKAi_W$V@gBl`cN6T<2>Zk;F&3 z_mTySTKw>??o(k}&29PGOHR>cRR||y&Xz&U%rf#nL&JEw>PBw zy(9MIiSyg@43{T{#U^Xt HFZuHiOztHS delta 778 zcmah{O-~b16g@S?%+R6~7h(;`ix_BiF^MZug2o6Yy1*h7L*izj14RpCI;Bt-W#bRP z+#i4|e}L{xbm@k_K;n*-8`s9fbMMp-aABI4-h1Dik9XcXnfO{fIDTKsyvoR}?B`4% z-?QPs5C-APR(32`LK)LY`$O-tT=OdO)~jTEIrJuF$-mC7D4%kxoqDij1M0Bx>2J04A zIdy>=7RefMH^MzKt4?ek6>x*vkJ-npr{OC`xn*y7N}gV9NYBsj&*Kr6FozPJlcQta z%BT=orBY1&&^&ZG*=4P~&Q9j278*+XhWT}zI68{yT77EO!*;vJvzX)#rpWwb3Nzgb8 zp32QqTch4UBp-*z@6@RFd&0|0Q@U*~{+*`}Ha$~-08VBKb8=94#^?Q`up)0fC%ut} N?2bkztsA{G{}b%)qTK)h diff --git a/SwordNGun/Source/SwordNGun/SNGTypes.h b/SwordNGun/Source/SwordNGun/SNGTypes.h index 42a5d09ca36bcc1dda500e069f0243893df85f96..489f0f4b247125c1e4574511cfbbd5a306e1fb1d 100644 GIT binary patch delta 214 zcmeyci1FBR#s!SrsSIfhi43I-ISeI}^BLtQYcblf=P;x)6f!=NAA09SxGHUIzs delta 93 zcmX@MobkgV#s!Srt_*Grjtrp;J`5p~^BLtQ=h+BMwqn#{_hE2l2xjmAiuubz*$nXv lVPKVhK)E2GE+?Qa*U5s6l8i=^4IL#Xi%E)Xu3+)=2LKcs6sQ0I