diff --git a/.gitattributes b/.gitattributes
index 33f22019..f5a60e64 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,9 +1,12 @@
# Auto detect text files and perform LF normalization
* text=auto
-*.blend filter=lfs diff=lfs merge=lfs -text
-*.psd filter=lfs diff=lfs merge=lfs -text
-*.fbx filter=lfs diff=lfs merge=lfs -text
+#*.blend filter=lfs diff=lfs merge=lfs -text
+#*.psd filter=lfs diff=lfs merge=lfs -text
+#*.fbx filter=lfs diff=lfs merge=lfs -text
# *.uasset filter=lfs diff=lfs merge=lfs -text
# *.umap filter=lfs diff=lfs merge=lfs -text
*.umap filter=lfs diff=lfs merge=lfs -text
*.uasset filter=lfs diff=lfs merge=lfs -text
+*.psd filter=lfs diff=lfs merge=lfs -text
+*.fbx filter=lfs diff=lfs merge=lfs -text
+*.blend filter=lfs diff=lfs merge=lfs -text
diff --git a/.idea/.idea.Shooter.dir/.idea/.gitignore b/.idea/.idea.Shooter.dir/.idea/.gitignore
new file mode 100644
index 00000000..21750f4f
--- /dev/null
+++ b/.idea/.idea.Shooter.dir/.idea/.gitignore
@@ -0,0 +1,13 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Rider ignored files
+/contentModel.xml
+/projectSettingsUpdater.xml
+/modules.xml
+/.idea.Shooter.iml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/.idea.Shooter.dir/.idea/.name b/.idea/.idea.Shooter.dir/.idea/.name
new file mode 100644
index 00000000..71906fc2
--- /dev/null
+++ b/.idea/.idea.Shooter.dir/.idea/.name
@@ -0,0 +1 @@
+Shooter
\ No newline at end of file
diff --git a/.idea/.idea.Shooter.dir/.idea/encodings.xml b/.idea/.idea.Shooter.dir/.idea/encodings.xml
new file mode 100644
index 00000000..df87cf95
--- /dev/null
+++ b/.idea/.idea.Shooter.dir/.idea/encodings.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Shooter.dir/.idea/indexLayout.xml b/.idea/.idea.Shooter.dir/.idea/indexLayout.xml
new file mode 100644
index 00000000..7b08163c
--- /dev/null
+++ b/.idea/.idea.Shooter.dir/.idea/indexLayout.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Shooter.dir/.idea/vcs.xml b/.idea/.idea.Shooter.dir/.idea/vcs.xml
new file mode 100644
index 00000000..35eb1ddf
--- /dev/null
+++ b/.idea/.idea.Shooter.dir/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Shooter/.idea/.name b/.idea/.idea.Shooter/.idea/.name
new file mode 100644
index 00000000..71906fc2
--- /dev/null
+++ b/.idea/.idea.Shooter/.idea/.name
@@ -0,0 +1 @@
+Shooter
\ No newline at end of file
diff --git a/.idea/.idea.Shooter/.idea/vcs.xml b/.idea/.idea.Shooter/.idea/vcs.xml
new file mode 100644
index 00000000..35eb1ddf
--- /dev/null
+++ b/.idea/.idea.Shooter/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/.idea.Shooter/.idea/workspace.xml b/.idea/.idea.Shooter/.idea/workspace.xml
index b8eeb5bd..5b48c7f8 100644
--- a/.idea/.idea.Shooter/.idea/workspace.xml
+++ b/.idea/.idea.Shooter/.idea/workspace.xml
@@ -1,37 +1,221 @@
+
+ Intermediate/ProjectFiles/Shooter.vcxproj
+ Intermediate/ProjectFiles/UE5.vcxproj
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- {
+ "keyToString": {
+ "RunOnceActivity.OpenProjectViewOnStart": "true",
+ "RunOnceActivity.ShowReadmeOnStart": "true",
+ "WebServerToolWindowFactoryState": "false",
+ "nodejs_package_manager_path": "npm",
+ "settings.editor.selected.configurable": "terminal",
+ "vue.rearranger.settings.migration": "true"
+ },
+ "keyToStringList": {
+ "rider.external.source.directories": [
+ "C:\\Users\\Charnet3D\\AppData\\Roaming\\JetBrains\\Rider2022.3\\resharper-host\\DecompilerCache",
+ "C:\\Users\\Charnet3D\\AppData\\Roaming\\JetBrains\\Rider2022.3\\resharper-host\\SourcesCache",
+ "C:\\Users\\Charnet3D\\AppData\\Local\\Symbols\\src"
+ ]
}
-}]]>
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
1652897910248
1652897910248
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vsconfig b/.vsconfig
new file mode 100644
index 00000000..cf3175a5
--- /dev/null
+++ b/.vsconfig
@@ -0,0 +1,12 @@
+{
+ "version": "1.0",
+ "components": [
+ "Microsoft.VisualStudio.Component.VC.Tools.ARM64",
+ "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
+ "Microsoft.VisualStudio.Component.Windows10SDK",
+ "Microsoft.VisualStudio.Workload.CoreEditor",
+ "Microsoft.VisualStudio.Workload.NativeDesktop",
+ "Microsoft.VisualStudio.Workload.NativeGame",
+ "Microsoft.VisualStudio.Workload.Universal"
+ ]
+}
diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini
index 8b137891..f38756e3 100644
--- a/Config/DefaultEditor.ini
+++ b/Config/DefaultEditor.ini
@@ -1 +1,2 @@
+[/Script/AdvancedPreviewScene.SharedProfiles]
diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini
index 17dd0c65..4e19e048 100644
--- a/Config/DefaultEngine.ini
+++ b/Config/DefaultEngine.ini
@@ -13,6 +13,33 @@ AppliedDefaultGraphicsPerformance=Maximum
[/Script/WindowsTargetPlatform.WindowsTargetSettings]
DefaultGraphicsRHI=DefaultGraphicsRHI_DX12
+-D3D12TargetedShaderFormats=PCD3D_SM5
++D3D12TargetedShaderFormats=PCD3D_SM5
++D3D12TargetedShaderFormats=PCD3D_SM6
+-D3D11TargetedShaderFormats=PCD3D_SM5
++D3D11TargetedShaderFormats=PCD3D_SM5
+Compiler=Default
+AudioSampleRate=48000
+AudioCallbackBufferFrameSize=1024
+AudioNumBuffersToEnqueue=1
+AudioMaxChannels=0
+AudioNumSourceWorkers=4
+SpatializationPlugin=
+SourceDataOverridePlugin=
+ReverbPlugin=
+OcclusionPlugin=
+CompressionOverrides=(bOverrideCompressionTimes=False,DurationThreshold=5.000000,MaxNumRandomBranches=0,SoundCueQualityIndex=0)
+CacheSizeKB=65536
+MaxChunkSizeOverrideKB=0
+bResampleForDevice=False
+MaxSampleRate=48000.000000
+HighSampleRate=32000.000000
+MedSampleRate=24000.000000
+LowSampleRate=12000.000000
+MinSampleRate=8000.000000
+CompressionQualityModifier=1.000000
+AutoStreamingThreshold=0.000000
+SoundCueCookQualityIndex=-1
[/Script/Engine.RendererSettings]
r.GenerateMeshDistanceFields=True
diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini
index c94c654a..45285b54 100644
--- a/Config/DefaultInput.ini
+++ b/Config/DefaultInput.ini
@@ -66,6 +66,10 @@ bEnableMouseSmoothing=True
bEnableFOVScaling=True
bCaptureMouseOnLaunch=True
bEnableLegacyInputScales=True
+bEnableMotionControls=True
+bFilterInputByPlatformUser=False
+bShouldFlushPressedKeysOnViewportFocusLost=True
+bEnableDynamicComponentInputBinding=True
bAlwaysShowTouchInterface=False
bShowConsoleOnFourFingerTap=True
bEnableGestureRecognizer=False
@@ -80,6 +84,10 @@ DoubleClickTime=0.200000
+ActionMappings=(ActionName="FireButton",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_RightTrigger)
+ActionMappings=(ActionName="Aiming",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=RightMouseButton)
+ActionMappings=(ActionName="Aiming",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_LeftTrigger)
++ActionMappings=(ActionName="Select",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=E)
++ActionMappings=(ActionName="Select",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Right)
++ActionMappings=(ActionName="Reload",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=R)
++ActionMappings=(ActionName="Reload",bShift=False,bCtrl=False,bAlt=False,bCmd=False,Key=Gamepad_FaceButton_Left)
+AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=W)
+AxisMappings=(AxisName="MoveForward",Scale=-1.000000,Key=S)
+AxisMappings=(AxisName="MoveForward",Scale=1.000000,Key=Gamepad_LeftY)
@@ -94,8 +102,8 @@ DoubleClickTime=0.200000
+AxisMappings=(AxisName="LookUpRate",Scale=1.000000,Key=Gamepad_RightY)
+AxisMappings=(AxisName="Turn",Scale=1.000000,Key=MouseX)
+AxisMappings=(AxisName="LookUp",Scale=-1.000000,Key=MouseY)
-DefaultPlayerInputClass=/Script/Engine.PlayerInput
-DefaultInputComponentClass=/Script/Engine.InputComponent
+DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput
+DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent
DefaultTouchInterface=/Engine/MobileResources/HUD/DefaultVirtualJoysticks.DefaultVirtualJoysticks
-ConsoleKeys=Tilde
+ConsoleKeys=Tilde
diff --git a/Content/AnimStarterPack/Aim_Space_Hip.uasset b/Content/AnimStarterPack/Aim_Space_Hip.uasset
new file mode 100644
index 00000000..2dbdd0fa
--- /dev/null
+++ b/Content/AnimStarterPack/Aim_Space_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c2c16e6eace2fc8327df2fcbc7cf54c50a5161dcdb00375a91623cdf6cbc24ae
+size 188546
diff --git a/Content/AnimStarterPack/Aim_Space_Ironsights.uasset b/Content/AnimStarterPack/Aim_Space_Ironsights.uasset
new file mode 100644
index 00000000..de35bc98
--- /dev/null
+++ b/Content/AnimStarterPack/Aim_Space_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b7bae25f911f397715577099f1737e20c5ef0eeb705c32316ed4139117e95f4
+size 188243
diff --git a/Content/AnimStarterPack/BS_CrouchWalk.uasset b/Content/AnimStarterPack/BS_CrouchWalk.uasset
new file mode 100644
index 00000000..a8f156d6
--- /dev/null
+++ b/Content/AnimStarterPack/BS_CrouchWalk.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7ff0b12b2467d3ba0b80336401662b6906e4844b2350a436a17d78e0e9cd6265
+size 103283
diff --git a/Content/AnimStarterPack/BS_Jog.uasset b/Content/AnimStarterPack/BS_Jog.uasset
new file mode 100644
index 00000000..9cdb8ba4
--- /dev/null
+++ b/Content/AnimStarterPack/BS_Jog.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2ea9fa690d60831caffcafd82d994c3f60baa442404951c86c491120a0f81489
+size 101424
diff --git a/Content/AnimStarterPack/Crouch_Idle_Rifle_Hip.uasset b/Content/AnimStarterPack/Crouch_Idle_Rifle_Hip.uasset
new file mode 100644
index 00000000..1f00a491
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Idle_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69a34d7fa650f93fa067e010b3acd9cbef8374e17307d4de7603695f7f27bc4d
+size 274931
diff --git a/Content/AnimStarterPack/Crouch_Idle_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Crouch_Idle_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..fb752aff
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Idle_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a61ee8829cee45361ee69296563272b282f60ce542dfd2155ad2d97662c9ff6b
+size 273362
diff --git a/Content/AnimStarterPack/Crouch_Walk_Bwd_Rifle_Hip.uasset b/Content/AnimStarterPack/Crouch_Walk_Bwd_Rifle_Hip.uasset
new file mode 100644
index 00000000..3aaefdbf
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Bwd_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:160bbfe193cf1d3b3a3969488e015750fb52597408c9b1aec1054c80c10282c6
+size 164111
diff --git a/Content/AnimStarterPack/Crouch_Walk_Bwd_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Crouch_Walk_Bwd_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..a50a2efa
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Bwd_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a839e3356baa6a299feba099a1a963ea18ac19e02fdb94de8e3b15f8fd9d2b71
+size 162475
diff --git a/Content/AnimStarterPack/Crouch_Walk_Fwd_Rifle_Hip.uasset b/Content/AnimStarterPack/Crouch_Walk_Fwd_Rifle_Hip.uasset
new file mode 100644
index 00000000..0bbeb8dd
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Fwd_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:451b09121c8b153e8c037db4aaff096c827df4b4bf579684161463bb95e6ce76
+size 162779
diff --git a/Content/AnimStarterPack/Crouch_Walk_Fwd_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Crouch_Walk_Fwd_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..373e3ea0
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Fwd_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c4f95ed8fb9042b8ac6d7c2bbb6849c47952b5ce278ef6b80bb4e5d0ab143ad
+size 161486
diff --git a/Content/AnimStarterPack/Crouch_Walk_Lt_Rifle_Hip.uasset b/Content/AnimStarterPack/Crouch_Walk_Lt_Rifle_Hip.uasset
new file mode 100644
index 00000000..096d305c
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Lt_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:684a76e4bc017b76c4a2d152f3cf4408a037e6c541494ab044d2c276c0222dad
+size 162832
diff --git a/Content/AnimStarterPack/Crouch_Walk_Lt_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Crouch_Walk_Lt_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..6bed8ac7
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Lt_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c4b17ad64131d8655dff3bf0f6d943e83c906f3b71adc44a7b498fbe6a3eec23
+size 161801
diff --git a/Content/AnimStarterPack/Crouch_Walk_Rt_Rifle_Hip.uasset b/Content/AnimStarterPack/Crouch_Walk_Rt_Rifle_Hip.uasset
new file mode 100644
index 00000000..9d554411
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Rt_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e0543e60def9006f8ea84b1392c7761aaca48af42ce8d209d3a8fe7a4d40cdd
+size 163011
diff --git a/Content/AnimStarterPack/Crouch_Walk_Rt_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Crouch_Walk_Rt_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..c709bb7e
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_Walk_Rt_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f153046369c877511b96de889d75989228c7320a7580d282c6cc7d28d1341b0f
+size 161951
diff --git a/Content/AnimStarterPack/Crouch_to_Stand_Rifle_Hip.uasset b/Content/AnimStarterPack/Crouch_to_Stand_Rifle_Hip.uasset
new file mode 100644
index 00000000..7471a03d
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_to_Stand_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d81b911926f77953e6b46cfde3e2ef3be13c6edad2dff8ec0a1bcad0812db1cc
+size 124784
diff --git a/Content/AnimStarterPack/Crouch_to_Stand_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Crouch_to_Stand_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..4a202a91
--- /dev/null
+++ b/Content/AnimStarterPack/Crouch_to_Stand_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d05d2af612368838060c2cc5cfc694b7df6103467b42a984848b3939b278178e
+size 123072
diff --git a/Content/AnimStarterPack/Death_1.uasset b/Content/AnimStarterPack/Death_1.uasset
new file mode 100644
index 00000000..9296967d
--- /dev/null
+++ b/Content/AnimStarterPack/Death_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a409188568d20a3f97ad3ee1d72b55f9a32e21de0b39d08e13261e891bf1f2c
+size 181646
diff --git a/Content/AnimStarterPack/Death_2.uasset b/Content/AnimStarterPack/Death_2.uasset
new file mode 100644
index 00000000..c8c79647
--- /dev/null
+++ b/Content/AnimStarterPack/Death_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c2bcdc686e0064034395caa24788e1f68b53e9f2513debcc424bb6ecb8a0243
+size 178337
diff --git a/Content/AnimStarterPack/Death_3.uasset b/Content/AnimStarterPack/Death_3.uasset
new file mode 100644
index 00000000..8f8ec341
--- /dev/null
+++ b/Content/AnimStarterPack/Death_3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a1136840a33b85b355882f3f1a9c1fe72e5238cd01971ea309236de310dd687
+size 199405
diff --git a/Content/AnimStarterPack/Death_Ironsights_1.uasset b/Content/AnimStarterPack/Death_Ironsights_1.uasset
new file mode 100644
index 00000000..9415085d
--- /dev/null
+++ b/Content/AnimStarterPack/Death_Ironsights_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d795e63d710e58b16dcff560305530eff5b23f1985a16d82133743d619ef28d2
+size 195153
diff --git a/Content/AnimStarterPack/Death_Ironsights_2.uasset b/Content/AnimStarterPack/Death_Ironsights_2.uasset
new file mode 100644
index 00000000..cbb29b7a
--- /dev/null
+++ b/Content/AnimStarterPack/Death_Ironsights_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eb4cfbc5804df5527f6b39289e9629cc42ed461a5daa3566a885f8c46901da31
+size 177351
diff --git a/Content/AnimStarterPack/Equip_Pistol_Standing.uasset b/Content/AnimStarterPack/Equip_Pistol_Standing.uasset
new file mode 100644
index 00000000..4540ada8
--- /dev/null
+++ b/Content/AnimStarterPack/Equip_Pistol_Standing.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1f71b8e27bb0bf658808e30cf1d374fe980d695e4c23f4d720350e01714f5bfc
+size 195932
diff --git a/Content/AnimStarterPack/Equip_Rifle_Standing.uasset b/Content/AnimStarterPack/Equip_Rifle_Standing.uasset
new file mode 100644
index 00000000..ddd6e183
--- /dev/null
+++ b/Content/AnimStarterPack/Equip_Rifle_Standing.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce1901a59b4c8263a75c96c7a59db1aaf6d41e0a6e810726930b69e43f531f35
+size 193980
diff --git a/Content/AnimStarterPack/Fire_Rifle_Hip.uasset b/Content/AnimStarterPack/Fire_Rifle_Hip.uasset
new file mode 100644
index 00000000..7a5dd2c6
--- /dev/null
+++ b/Content/AnimStarterPack/Fire_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fecee6bc8acfcb9504d8263e76205e08cda10811e0061d2510c5ca690eaaaac8
+size 112330
diff --git a/Content/AnimStarterPack/Fire_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Fire_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..44543138
--- /dev/null
+++ b/Content/AnimStarterPack/Fire_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9dc6e9aaf143d9899babd94f15b2fe8844f7b9263691991fc4041ba2141de3e5
+size 111380
diff --git a/Content/AnimStarterPack/Fire_Shotgun_Hip.uasset b/Content/AnimStarterPack/Fire_Shotgun_Hip.uasset
new file mode 100644
index 00000000..dd42cbe0
--- /dev/null
+++ b/Content/AnimStarterPack/Fire_Shotgun_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4e014e4b8e6bd8d4c09d79ed000c522ee2f5aabf1771d0dfbc0a603f9562f76
+size 144387
diff --git a/Content/AnimStarterPack/Fire_Shotgun_Ironsights.uasset b/Content/AnimStarterPack/Fire_Shotgun_Ironsights.uasset
new file mode 100644
index 00000000..4dca0198
--- /dev/null
+++ b/Content/AnimStarterPack/Fire_Shotgun_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d3943744c98170bb5a3717e016c610a432e77cda94adcee85c64df4159bc6563
+size 141701
diff --git a/Content/AnimStarterPack/Hit_React_1.uasset b/Content/AnimStarterPack/Hit_React_1.uasset
new file mode 100644
index 00000000..0de7d83e
--- /dev/null
+++ b/Content/AnimStarterPack/Hit_React_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a067fa97220ca3a7f56199f6b58ddf888f66e5359694ffcc64eef7fb7e321148
+size 132820
diff --git a/Content/AnimStarterPack/Hit_React_2.uasset b/Content/AnimStarterPack/Hit_React_2.uasset
new file mode 100644
index 00000000..ef0abe31
--- /dev/null
+++ b/Content/AnimStarterPack/Hit_React_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fc51b2d6721967b118bccc1031191e22633bab2987a004a6a873163f8e130a11
+size 133658
diff --git a/Content/AnimStarterPack/Hit_React_3.uasset b/Content/AnimStarterPack/Hit_React_3.uasset
new file mode 100644
index 00000000..001604f8
--- /dev/null
+++ b/Content/AnimStarterPack/Hit_React_3.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:841411f30371cca90309c453e77030eac9d0c79ece652b12a0292606d2a8c2f8
+size 133138
diff --git a/Content/AnimStarterPack/Hit_React_4.uasset b/Content/AnimStarterPack/Hit_React_4.uasset
new file mode 100644
index 00000000..7b6227f9
--- /dev/null
+++ b/Content/AnimStarterPack/Hit_React_4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ba62f4a8c2e151da1b3a7a161c03f09027de537dd6c1f0a218985fee57a367b5
+size 133343
diff --git a/Content/AnimStarterPack/Idle_Pistol.uasset b/Content/AnimStarterPack/Idle_Pistol.uasset
new file mode 100644
index 00000000..1b4a59b0
--- /dev/null
+++ b/Content/AnimStarterPack/Idle_Pistol.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3b2e3a0279ac45993ee978461ea6018cd7590818dc5be7c6f76b441150bd272
+size 276217
diff --git a/Content/AnimStarterPack/Idle_Rifle_Hip.uasset b/Content/AnimStarterPack/Idle_Rifle_Hip.uasset
new file mode 100644
index 00000000..41c7ab69
--- /dev/null
+++ b/Content/AnimStarterPack/Idle_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c10957e249c797e2c392394fb6d8b506859e8dd0f52e41e871a5a46fa2c3757b
+size 277628
diff --git a/Content/AnimStarterPack/Idle_Rifle_Hip_Break1.uasset b/Content/AnimStarterPack/Idle_Rifle_Hip_Break1.uasset
new file mode 100644
index 00000000..36c77875
--- /dev/null
+++ b/Content/AnimStarterPack/Idle_Rifle_Hip_Break1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99b18185d81daa06179666ba694e283447327f96e1addde7dd3bdad16df91bd1
+size 250239
diff --git a/Content/AnimStarterPack/Idle_Rifle_Hip_Break2.uasset b/Content/AnimStarterPack/Idle_Rifle_Hip_Break2.uasset
new file mode 100644
index 00000000..b42534bf
--- /dev/null
+++ b/Content/AnimStarterPack/Idle_Rifle_Hip_Break2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7585cb067b2ec15c54111fe07ab3643b8b4187837fcd6c6ca349ba86a106b9ac
+size 270515
diff --git a/Content/AnimStarterPack/Idle_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Idle_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..48504af3
--- /dev/null
+++ b/Content/AnimStarterPack/Idle_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf32e388be17f181b63f9a716498250554399e397ee674b7067b4944ef1b97d1
+size 276375
diff --git a/Content/AnimStarterPack/Jog_Bwd_Rifle.uasset b/Content/AnimStarterPack/Jog_Bwd_Rifle.uasset
new file mode 100644
index 00000000..81c27a3f
--- /dev/null
+++ b/Content/AnimStarterPack/Jog_Bwd_Rifle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d48f2e65466394884c1ea37cea6ea3932b42d7427031e02af9284fa6b3de322c
+size 149391
diff --git a/Content/AnimStarterPack/Jog_Fwd_Rifle.uasset b/Content/AnimStarterPack/Jog_Fwd_Rifle.uasset
new file mode 100644
index 00000000..8d76e5cb
--- /dev/null
+++ b/Content/AnimStarterPack/Jog_Fwd_Rifle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e5da5653211aea7a780411b8708cba355f7b53e8238605fd1d2236ddae7282e4
+size 147577
diff --git a/Content/AnimStarterPack/Jog_Lt_Rifle.uasset b/Content/AnimStarterPack/Jog_Lt_Rifle.uasset
new file mode 100644
index 00000000..49b334e1
--- /dev/null
+++ b/Content/AnimStarterPack/Jog_Lt_Rifle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e84008fc6f5098cd8f7630e8c5d3e488e160f1c0c3b3e4acfc3bc2601d1e2b5e
+size 141543
diff --git a/Content/AnimStarterPack/Jog_Rt_Rifle.uasset b/Content/AnimStarterPack/Jog_Rt_Rifle.uasset
new file mode 100644
index 00000000..3e10797a
--- /dev/null
+++ b/Content/AnimStarterPack/Jog_Rt_Rifle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9eb8c252b7588e55e8a8e7e7dfaba994b8e34adfaecc791c0f4a7a6ac827c34f
+size 149973
diff --git a/Content/AnimStarterPack/Jump_From_Jog.uasset b/Content/AnimStarterPack/Jump_From_Jog.uasset
new file mode 100644
index 00000000..c3d89f2f
--- /dev/null
+++ b/Content/AnimStarterPack/Jump_From_Jog.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca0a9b84f1480830b0af36131a398c40c3f9e8e9af7d5e504414409562eda1c6
+size 128514
diff --git a/Content/AnimStarterPack/Jump_From_Stand.uasset b/Content/AnimStarterPack/Jump_From_Stand.uasset
new file mode 100644
index 00000000..96e03772
--- /dev/null
+++ b/Content/AnimStarterPack/Jump_From_Stand.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f1f0f83dd792890d9d570953c876b04b246c990eec5db6dd0927be53ca3197e0
+size 142552
diff --git a/Content/AnimStarterPack/Jump_From_Stand_Ironsights.uasset b/Content/AnimStarterPack/Jump_From_Stand_Ironsights.uasset
new file mode 100644
index 00000000..46ef9eff
--- /dev/null
+++ b/Content/AnimStarterPack/Jump_From_Stand_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:384b0fb456ff269192ba0511b67900bab17c15788d38c7c895309f2563456ea0
+size 142359
diff --git a/Content/AnimStarterPack/Prone_Death_1.uasset b/Content/AnimStarterPack/Prone_Death_1.uasset
new file mode 100644
index 00000000..9a36ce16
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Death_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:147e8c24a64c3686c73a53f8f1956017561a169cf05526416e481baccb7d3354
+size 121931
diff --git a/Content/AnimStarterPack/Prone_Death_2.uasset b/Content/AnimStarterPack/Prone_Death_2.uasset
new file mode 100644
index 00000000..df9e2051
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Death_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16f6a8538a6228bc60791693af025aa25d962f24df2448490cbbde7020a4b280
+size 196912
diff --git a/Content/AnimStarterPack/Prone_Fire_1.uasset b/Content/AnimStarterPack/Prone_Fire_1.uasset
new file mode 100644
index 00000000..fc4b559a
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Fire_1.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:707a955e73dda4b6e6b9d6a6336395ccb050eafcad778d2273d0bd8fb87b1dda
+size 99855
diff --git a/Content/AnimStarterPack/Prone_Fire_2.uasset b/Content/AnimStarterPack/Prone_Fire_2.uasset
new file mode 100644
index 00000000..ad9c189e
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Fire_2.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf39f77398a9f605de2a4f508dc0f6b39ab4ea7c2d5038a7189eb6f5f0ed6ae0
+size 100442
diff --git a/Content/AnimStarterPack/Prone_Idle.uasset b/Content/AnimStarterPack/Prone_Idle.uasset
new file mode 100644
index 00000000..3668a53a
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Idle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:885f88eb6499754ea3d141b3fa142a0486953292ceda229f2458fd284926e688
+size 336195
diff --git a/Content/AnimStarterPack/Prone_Reload_Rifle.uasset b/Content/AnimStarterPack/Prone_Reload_Rifle.uasset
new file mode 100644
index 00000000..b59a8e70
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Reload_Rifle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53fdab9e9454038df1bb90100ef815f01f42e5dc5a96496242864d18ff917271
+size 239624
diff --git a/Content/AnimStarterPack/Prone_Reload_Shotgun.uasset b/Content/AnimStarterPack/Prone_Reload_Shotgun.uasset
new file mode 100644
index 00000000..91b898a8
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_Reload_Shotgun.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0709c07b3e348b8b53464345c2c33207b6e086197aa62451760270effe267eaf
+size 282360
diff --git a/Content/AnimStarterPack/Prone_To_Stand.uasset b/Content/AnimStarterPack/Prone_To_Stand.uasset
new file mode 100644
index 00000000..1891effe
--- /dev/null
+++ b/Content/AnimStarterPack/Prone_To_Stand.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3c6d1837237e2cdf2681bcaa4455990c0cde1eac0ac817eae1a5560a6f2eb069
+size 161933
diff --git a/Content/AnimStarterPack/Reload_Pistol.uasset b/Content/AnimStarterPack/Reload_Pistol.uasset
new file mode 100644
index 00000000..78b2f801
--- /dev/null
+++ b/Content/AnimStarterPack/Reload_Pistol.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:340d0cf6315a946ab0490f0edb27a6715f0d02453df1233981a36adc9c27ed97
+size 178832
diff --git a/Content/AnimStarterPack/Reload_Rifle_Hip.uasset b/Content/AnimStarterPack/Reload_Rifle_Hip.uasset
new file mode 100644
index 00000000..d1b2f9de
--- /dev/null
+++ b/Content/AnimStarterPack/Reload_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1a0e8d0c4f59bd262699f273af214ed43d0a2a3e6cb6c923ca59e2c8da70f8bf
+size 201655
diff --git a/Content/AnimStarterPack/Reload_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Reload_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..0f10a18c
--- /dev/null
+++ b/Content/AnimStarterPack/Reload_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5c7020c92423742122ae2d7d3b28c31e8c4e438d48c817caa8c0cb0b568d92a3
+size 202183
diff --git a/Content/AnimStarterPack/Reload_Shotgun_Hip.uasset b/Content/AnimStarterPack/Reload_Shotgun_Hip.uasset
new file mode 100644
index 00000000..8bb0486c
--- /dev/null
+++ b/Content/AnimStarterPack/Reload_Shotgun_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3475283122e464da7b204544bcdc25da55576bc2a1386958761ce9a66f1b6290
+size 294511
diff --git a/Content/AnimStarterPack/Reload_Shotgun_Ironsights.uasset b/Content/AnimStarterPack/Reload_Shotgun_Ironsights.uasset
new file mode 100644
index 00000000..b89e21c5
--- /dev/null
+++ b/Content/AnimStarterPack/Reload_Shotgun_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:611c363a51b13fd38a4b281ca710c80a54a199a6339545ac0d13eaef58cdf381
+size 293729
diff --git a/Content/AnimStarterPack/Showcase.umap b/Content/AnimStarterPack/Showcase.umap
new file mode 100644
index 00000000..11a6abeb
--- /dev/null
+++ b/Content/AnimStarterPack/Showcase.umap
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95581ef8fd87b23fd7185a0e6acbd380b19a212a5c65c7d1b336f73026d5120b
+size 585213
diff --git a/Content/AnimStarterPack/Sprint_Fwd_Rifle.uasset b/Content/AnimStarterPack/Sprint_Fwd_Rifle.uasset
new file mode 100644
index 00000000..4b52199a
--- /dev/null
+++ b/Content/AnimStarterPack/Sprint_Fwd_Rifle.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57e70cbbf2bef3836da8a7a6bfba21a241665d23b1bc15bb4afa9fdf390553f5
+size 150598
diff --git a/Content/AnimStarterPack/Stand_To_Prone.uasset b/Content/AnimStarterPack/Stand_To_Prone.uasset
new file mode 100644
index 00000000..4381d652
--- /dev/null
+++ b/Content/AnimStarterPack/Stand_To_Prone.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3e655c0c2591aca79a102dbefa6a5601842ace7c50bc5d95754759a2d3996f35
+size 168564
diff --git a/Content/AnimStarterPack/Stand_to_Crouch_Rifle_Hip.uasset b/Content/AnimStarterPack/Stand_to_Crouch_Rifle_Hip.uasset
new file mode 100644
index 00000000..f5967c97
--- /dev/null
+++ b/Content/AnimStarterPack/Stand_to_Crouch_Rifle_Hip.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0bfaa7ffa204083bc240b6206cf29a65db644286cede481d9fc7ec925c3b0192
+size 127675
diff --git a/Content/AnimStarterPack/Stand_to_Crouch_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Stand_to_Crouch_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..37eb4c82
--- /dev/null
+++ b/Content/AnimStarterPack/Stand_to_Crouch_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:804097d045f7d027f079b131c69b975e9754d7400fab2fb564f2a8a293e0a452
+size 127794
diff --git a/Content/AnimStarterPack/UE4ASP_HeroTPP_AnimBlueprint.uasset b/Content/AnimStarterPack/UE4ASP_HeroTPP_AnimBlueprint.uasset
new file mode 100644
index 00000000..3e1a3f08
--- /dev/null
+++ b/Content/AnimStarterPack/UE4ASP_HeroTPP_AnimBlueprint.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fe65460d053b0435b1dbc73806b568700d43dae34356262f59b9ae16e29005bd
+size 667920
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/M_UE4Man_Body.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/M_UE4Man_Body.uasset
new file mode 100644
index 00000000..8f56c584
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/M_UE4Man_Body.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0e7dc2aac13bc396d864d48966ced83f016de6252ac57b8459897a35ecd25edc
+size 136551
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/M_UE4Man_ChestLogo.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/M_UE4Man_ChestLogo.uasset
new file mode 100644
index 00000000..67593ff2
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/M_UE4Man_ChestLogo.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8801d51f97a4dfc56658c363eb0ed5e130477ee4ac557747cfa05296266c222b
+size 93350
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset
new file mode 100644
index 00000000..11dc0f10
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_GlossyBlack_Latex_UE4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95f2c723b40140562c0444e4d2f70733a258456b2a0262a7336d0e5e3791aa45
+size 102542
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset
new file mode 100644
index 00000000..bb28da9e
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_Plastic_Shiny_Beige.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:72bda1590e3bfcad57591bf50b8d8ae097c4f850fb52e0c23a4c2b6840b90760
+size 98451
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_Plastic_Shiny_Beige_LOGO.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_Plastic_Shiny_Beige_LOGO.uasset
new file mode 100644
index 00000000..c96d31e4
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_Plastic_Shiny_Beige_LOGO.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d10cd7b5142d353af6bd24570012579f3f1beb308963bc98e0fcdc3f901c77e
+size 99691
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset
new file mode 100644
index 00000000..630e7511
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/ML_SoftMetal_UE4.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5cb52705080f12d988a392e714b28dc70ec8b822fa5f8e46fa8eef9165f9f9c5
+size 102371
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Aluminum01.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Aluminum01.uasset
new file mode 100644
index 00000000..cdd5192c
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Aluminum01.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:45e7b43dea85d3711ef6808fad9bb858e8f3f9a0d9826a8bf09021e1fb3ea815
+size 434410
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset
new file mode 100644
index 00000000..ad40a411
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Aluminum01_N.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a262e93cfdd3be852153233ee2c2aedb77d43c3e0b50829ebb6bf0f68a6651d5
+size 405256
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset
new file mode 100644
index 00000000..c8689d67
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Rubber_Blue_01_D.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac61a9228475e0cf244927c3d34de1fa13a7f780484f6f2b5e7d5bd1ff4dba68
+size 470771
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset
new file mode 100644
index 00000000..080f1b97
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Materials/MaterialLayers/T_ML_Rubber_Blue_01_N.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:133271aa7e759618764af75f8ceec83f9bf54796bf7039cce6973e6998b2f9e6
+size 362117
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin.uasset b/Content/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin.uasset
new file mode 100644
index 00000000..73286950
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e559f8b1e8cb28d67209da38221aaeab6c11b84f923adca0c7ed7d35f194c46
+size 3774704
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin_PhysicsAsset.uasset b/Content/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin_PhysicsAsset.uasset
new file mode 100644
index 00000000..4ab164c0
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Mesh/SK_Mannequin_PhysicsAsset.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:04d2c0af2f6704b68837b3b319446ed434ee46883c1b941f830fdebb88b3ab9b
+size 26064
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Mesh/UE4_Mannequin_Skeleton.uasset b/Content/AnimStarterPack/UE4_Mannequin/Mesh/UE4_Mannequin_Skeleton.uasset
new file mode 100644
index 00000000..1c59f65d
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Mesh/UE4_Mannequin_Skeleton.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:761f089534b0ab816720025e598c7bd5b157a41ae7b95b70f14b7c8b1d915a2f
+size 11140
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4Man_Logo_N.uasset b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4Man_Logo_N.uasset
new file mode 100644
index 00000000..c4b62f0d
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4Man_Logo_N.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b43184512611058b0346db0fbfe0a462a6907fa633fdda1c5347e357fc6ab806
+size 161770
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_LOGO_CARD.uasset b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_LOGO_CARD.uasset
new file mode 100644
index 00000000..faad1e83
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_LOGO_CARD.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f80139b3e5b3ca64233cfc172a67cf81fc664f8d1a992328ea30dee940cc1cb2
+size 95173
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin_MAT_MASKA.uasset b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin_MAT_MASKA.uasset
new file mode 100644
index 00000000..62972963
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin_MAT_MASKA.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f8c7a994e8f33fad29cc5b487b443fd63e0d7fdccba4e25ec767bd37e61062ff
+size 274906
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin__normals.uasset b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin__normals.uasset
new file mode 100644
index 00000000..e3787d7f
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin__normals.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2d438f828c2bbc041ba3a24c6dc74ce2cd64c2c86fabae1865dde87750c3872a
+size 5481078
diff --git a/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin_occlusion_Mobile.uasset b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin_occlusion_Mobile.uasset
new file mode 100644
index 00000000..d06bddea
--- /dev/null
+++ b/Content/AnimStarterPack/UE4_Mannequin/Textures/UE4_Mannequin_occlusion_Mobile.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:34f645adb6574f4959b783854c7e5ab4058b481150886637cd2a93de355a4d9e
+size 362358
diff --git a/Content/AnimStarterPack/Ue4ASP_Character.uasset b/Content/AnimStarterPack/Ue4ASP_Character.uasset
new file mode 100644
index 00000000..2a128a1d
--- /dev/null
+++ b/Content/AnimStarterPack/Ue4ASP_Character.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8873b80d47adf2b3d83ea7bec65a2144d85cfbbc73ee811cf2a0b81e3edfbb32
+size 295665
diff --git a/Content/AnimStarterPack/Walk_Bwd_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Walk_Bwd_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..62d5f1de
--- /dev/null
+++ b/Content/AnimStarterPack/Walk_Bwd_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5698df9de8f4738fa3807319c167ff6c68d4fc36385d0adc5f099e9d16847744
+size 161122
diff --git a/Content/AnimStarterPack/Walk_Fwd_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Walk_Fwd_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..00494420
--- /dev/null
+++ b/Content/AnimStarterPack/Walk_Fwd_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f4a78f3a7a995b2199b46abfd72e3f4d2268e0b8c3a9b1df3f7df28a3caa6109
+size 158106
diff --git a/Content/AnimStarterPack/Walk_Lt_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Walk_Lt_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..4096a6b7
--- /dev/null
+++ b/Content/AnimStarterPack/Walk_Lt_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff97db22bc1c7191cfa4028d478ce392d56ad093d9a3da9de01d112830684845
+size 159464
diff --git a/Content/AnimStarterPack/Walk_Rt_Rifle_Ironsights.uasset b/Content/AnimStarterPack/Walk_Rt_Rifle_Ironsights.uasset
new file mode 100644
index 00000000..4d9d0a33
--- /dev/null
+++ b/Content/AnimStarterPack/Walk_Rt_Rifle_Ironsights.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:05aede850c4a0e64e844434acd82eec224482ea69e371edc32bff7e7ae34da87
+size 160150
diff --git a/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica.uasset b/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica.uasset
index fa932b40..8f77e05b 100644
--- a/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica.uasset
+++ b/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:3045f5bf0268a28932fb252d7f8b37d6390357816925b9fc7a714302f483681c
-size 9986540
+oid sha256:7a6296ea82b913f8dc5f03393c91d73e7a12cd12a5d0b4c898b3ffc846445b84
+size 14586239
diff --git a/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica_Skeleton.uasset b/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica_Skeleton.uasset
index 164cfd9f..a88229ca 100644
--- a/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica_Skeleton.uasset
+++ b/Content/ParagonLtBelica/Characters/Heroes/Belica/Meshes/Belica_Skeleton.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:36a02a3e0912e26419f907ec51bcfe36ec9957de3117559959dc017378325bba
-size 56978
+oid sha256:ff4704982439dfab593b6f6281898fcf5359e0a1e141daba7f21793e4ec9953a
+size 57692
diff --git a/Content/ParagonLtBelica/Characters/Heroes/Belica/Skins/Biohazard/Meshes/Belica_Biohazard.uasset b/Content/ParagonLtBelica/Characters/Heroes/Belica/Skins/Biohazard/Meshes/Belica_Biohazard.uasset
index fd7b4cd3..f039bf09 100644
--- a/Content/ParagonLtBelica/Characters/Heroes/Belica/Skins/Biohazard/Meshes/Belica_Biohazard.uasset
+++ b/Content/ParagonLtBelica/Characters/Heroes/Belica/Skins/Biohazard/Meshes/Belica_Biohazard.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1d85720d75e6a802abd41e0b1d4e11f4bf56f42b74c1487ab89192cde8168ed2
-size 9986783
+oid sha256:aed6e0160154c7df92cc58bec9a7b05ac93fbc258b4fdf9eb123f72ab98bea3f
+size 14586592
diff --git a/Content/_Game/Assets/Textures/Icons/ARAmmo.uasset b/Content/_Game/Assets/Textures/Icons/ARAmmo.uasset
new file mode 100644
index 00000000..b65127d5
--- /dev/null
+++ b/Content/_Game/Assets/Textures/Icons/ARAmmo.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40eb693ff5eaf7d60d342b863b88144534ee448567cc13eaf1e3c13d01f15357
+size 33462
diff --git a/Content/_Game/Character/Animations/HipFireMontage.uasset b/Content/_Game/Character/Animations/HipFireMontage.uasset
index 0661ef01..a093e009 100644
--- a/Content/_Game/Character/Animations/HipFireMontage.uasset
+++ b/Content/_Game/Character/Animations/HipFireMontage.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:14f36d1aaa7a1336d92c85b8b7f89695c692868dde8edfbddc3eaee372b93888
-size 8674
+oid sha256:2f0a86fec5fc434de78ae1a60478abaa928d139f566bb803c7b896b8cffd03b9
+size 8719
diff --git a/Content/_Game/Character/Animations/ReloadMontage.uasset b/Content/_Game/Character/Animations/ReloadMontage.uasset
new file mode 100644
index 00000000..dd284313
--- /dev/null
+++ b/Content/_Game/Character/Animations/ReloadMontage.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d7737f533b3b8360a178a0e6db5a2df59475407e792ccee0a053927715c1427
+size 10665
diff --git a/Content/_Game/Character/Animations/Retargeted/AnimStarterPack/Reload_Rifle_Hip_Belica.uasset b/Content/_Game/Character/Animations/Retargeted/AnimStarterPack/Reload_Rifle_Hip_Belica.uasset
new file mode 100644
index 00000000..c80b1d8c
--- /dev/null
+++ b/Content/_Game/Character/Animations/Retargeted/AnimStarterPack/Reload_Rifle_Hip_Belica.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dbfd0b58bd0923f4aede5b20f601fe9fb129c49e26f1d99e28fc99ee12cc41c2
+size 391997
diff --git a/Content/_Game/Character/Animations/Retargeted/AnimStarterPack/Reload_SMG.uasset b/Content/_Game/Character/Animations/Retargeted/AnimStarterPack/Reload_SMG.uasset
new file mode 100644
index 00000000..dae3fc6e
--- /dev/null
+++ b/Content/_Game/Character/Animations/Retargeted/AnimStarterPack/Reload_SMG.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4889aaedb79c688619814475c28e751588449e40b19c402bea0ea9440426abcf
+size 438530
diff --git a/Content/_Game/Character/Rigs/IK_Belica.uasset b/Content/_Game/Character/Rigs/IK_Belica.uasset
new file mode 100644
index 00000000..be064b5d
--- /dev/null
+++ b/Content/_Game/Character/Rigs/IK_Belica.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3eaeac51f48855c476d187773616f48fa8b82859b547c0b8411ce32c1f05737c
+size 98454
diff --git a/Content/_Game/Character/Rigs/IK_UE4_Mannequin.uasset b/Content/_Game/Character/Rigs/IK_UE4_Mannequin.uasset
new file mode 100644
index 00000000..d4ecf84f
--- /dev/null
+++ b/Content/_Game/Character/Rigs/IK_UE4_Mannequin.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20bf6840613af306be00b6c57646c728256b8957430c8fcf4deeebdd8234c107
+size 57859
diff --git a/Content/_Game/Character/Rigs/RTG_UE4_Mannequin.uasset b/Content/_Game/Character/Rigs/RTG_UE4_Mannequin.uasset
new file mode 100644
index 00000000..ad8a117a
--- /dev/null
+++ b/Content/_Game/Character/Rigs/RTG_UE4_Mannequin.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dd80700929c14aa5207146320fd22dc2d1062bf7535a64a6c61b24366b4b6c40
+size 8010
diff --git a/Content/_Game/Character/ShooterAnimBP.uasset b/Content/_Game/Character/ShooterAnimBP.uasset
index 76342af7..a925e341 100644
--- a/Content/_Game/Character/ShooterAnimBP.uasset
+++ b/Content/_Game/Character/ShooterAnimBP.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4b8ca4d8f69fe7d735106314e08d9b4d10e65ec713be722df5acdf0b6a8815cd
-size 528985
+oid sha256:182a17dbe5ecdf23463c041b88e39e4285ebf45e00fdf31d24c6e6e60a075915
+size 560556
diff --git a/Content/_Game/Character/ShooterCharacterBP.uasset b/Content/_Game/Character/ShooterCharacterBP.uasset
index 340373fb..582d581a 100644
--- a/Content/_Game/Character/ShooterCharacterBP.uasset
+++ b/Content/_Game/Character/ShooterCharacterBP.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d3352e6fa32bfbc52742c97d33b07ae9aaacecafc64feb8cc002a8a9e4f3bce7
-size 35197
+oid sha256:e6acbe096a1ad492e6a8707c7dcb0f038e3141a4c6c297b4fb6b0274621acc83
+size 35844
diff --git a/Content/_Game/Curves/ItemScaleCurve.uasset b/Content/_Game/Curves/ItemScaleCurve.uasset
new file mode 100644
index 00000000..bc174a5f
--- /dev/null
+++ b/Content/_Game/Curves/ItemScaleCurve.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b6ba15238ce158f7d170e6def50c23682613494d2842bec6b24e1425c6392ae1
+size 1881
diff --git a/Content/_Game/Curves/ItemZCurve.uasset b/Content/_Game/Curves/ItemZCurve.uasset
new file mode 100644
index 00000000..80d60cc2
--- /dev/null
+++ b/Content/_Game/Curves/ItemZCurve.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:48feb858ed3072853a2281061491b135f075c0aba494efcd8ff55990356c02c3
+size 1915
diff --git a/Content/_Game/GameMode/ShooterGameModeBaseBP.uasset b/Content/_Game/GameMode/ShooterGameModeBaseBP.uasset
index 2f490949..e2df9063 100644
--- a/Content/_Game/GameMode/ShooterGameModeBaseBP.uasset
+++ b/Content/_Game/GameMode/ShooterGameModeBaseBP.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8056dcc7ecdeb28d5fa0c6391485ed682051c44fe55c4cab358883707a426f66
-size 19802
+oid sha256:d33e9bd23a717b85e841feb1612d9897b3be0ba42429f4ad86879de97ec73bbd
+size 20112
diff --git a/Content/_Game/HUD/AmmoCountBP.uasset b/Content/_Game/HUD/AmmoCountBP.uasset
new file mode 100644
index 00000000..a137b308
--- /dev/null
+++ b/Content/_Game/HUD/AmmoCountBP.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac38ea3e6200f2ea630e848fe6f27a967bd8458e33dc7b1c77155212a7f999cd
+size 107758
diff --git a/Content/_Game/HUD/PickupWidgetBP.uasset b/Content/_Game/HUD/PickupWidgetBP.uasset
index 1c44b88e..b43b065b 100644
--- a/Content/_Game/HUD/PickupWidgetBP.uasset
+++ b/Content/_Game/HUD/PickupWidgetBP.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6a1e25638c4587560ae459e3e3a86d5492e42c3602223284bb125a93656609fc
-size 77290
+oid sha256:7f09dcbc05493657c72a7d589888790570edc2aec4b6651e3d9fccb8da22394f
+size 182618
diff --git a/Content/_Game/HUD/ShooterHUDOverlayBP.uasset b/Content/_Game/HUD/ShooterHUDOverlayBP.uasset
new file mode 100644
index 00000000..4aa67c5b
--- /dev/null
+++ b/Content/_Game/HUD/ShooterHUDOverlayBP.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d7eb85c717caf93d7defe7a1c830d1c2b1f44e873bc09d16bff0dd543e17350
+size 23946
diff --git a/Content/_Game/PlayerController/ShooterPlayerControllerBP.uasset b/Content/_Game/PlayerController/ShooterPlayerControllerBP.uasset
new file mode 100644
index 00000000..b93fe3a9
--- /dev/null
+++ b/Content/_Game/PlayerController/ShooterPlayerControllerBP.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:18448d0f70f33734630849ed400428d65ddf68ba8d2e0981c0d8a0157d6bab0b
+size 19062
diff --git a/Content/_Game/Weapons/BaseWeapon/BaseWeaponBP.uasset b/Content/_Game/Weapons/BaseWeapon/BaseWeaponBP.uasset
index e441778a..f9530a45 100644
--- a/Content/_Game/Weapons/BaseWeapon/BaseWeaponBP.uasset
+++ b/Content/_Game/Weapons/BaseWeapon/BaseWeaponBP.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e0975bf5f85836db4e06c06a75bf0b4d32e43564c0beb9d5492af9e525bf05dc
-size 29349
+oid sha256:e4a425eb4fe40d85bed2f054aefea0114f7d3da6a864885554fd13bacfb80c68
+size 50913
diff --git a/Content/_Game/Weapons/Meshes/BelicaGuns.uasset b/Content/_Game/Weapons/Meshes/BelicaGuns.uasset
new file mode 100644
index 00000000..ea0b807c
--- /dev/null
+++ b/Content/_Game/Weapons/Meshes/BelicaGuns.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28c923cbeaf36a70d1413e89894872ac7d50bf3154b9cf38c8b0f63f0ccfd494
+size 2078045
diff --git a/Content/_Game/Weapons/Meshes/BelicaGuns_PhysicsAsset.uasset b/Content/_Game/Weapons/Meshes/BelicaGuns_PhysicsAsset.uasset
new file mode 100644
index 00000000..1a424b29
--- /dev/null
+++ b/Content/_Game/Weapons/Meshes/BelicaGuns_PhysicsAsset.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2e959ab63033bbd0d52d8aae6bb935a269785a3e43419e083ac70aa6fd94afab
+size 8042
diff --git a/Content/_Game/Weapons/Meshes/BelicaGuns_Skeleton.uasset b/Content/_Game/Weapons/Meshes/BelicaGuns_Skeleton.uasset
new file mode 100644
index 00000000..9856b829
--- /dev/null
+++ b/Content/_Game/Weapons/Meshes/BelicaGuns_Skeleton.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16f40ae635f8137dbbd64646e998bb5dec99f81da84f0ce45842d65219d947fa
+size 8438
diff --git a/Content/_Game/Weapons/Meshes/Belica_Guns.uasset b/Content/_Game/Weapons/Meshes/Belica_Guns.uasset
index 2e37f169..bfd5f151 100644
--- a/Content/_Game/Weapons/Meshes/Belica_Guns.uasset
+++ b/Content/_Game/Weapons/Meshes/Belica_Guns.uasset
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:50869870529a72441d62207e3ce2c6bff058b12ffc39bd51e5f5f9cff5640728
-size 14581915
+oid sha256:070fab19be1b9ff63ae4ca1a6af46b8cd55969bbdf32be5e107ae6db3c9daeb5
+size 14582564
diff --git a/Content/_Game/Weapons/Meshes/Belica_Guns_Physics.uasset b/Content/_Game/Weapons/Meshes/Belica_Guns_Physics.uasset
new file mode 100644
index 00000000..44345382
--- /dev/null
+++ b/Content/_Game/Weapons/Meshes/Belica_Guns_Physics.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cfdf4585855f25ceb10479b3f428abccfd49e1e217bc1f478985a648d04c10ca
+size 6477
diff --git a/Content/_Game/Weapons/Meshes/Transparent.uasset b/Content/_Game/Weapons/Meshes/Transparent.uasset
new file mode 100644
index 00000000..609f01ac
--- /dev/null
+++ b/Content/_Game/Weapons/Meshes/Transparent.uasset
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6bd310a8054a15dc3d88bb2ca569818df6f8b99d9046d0fadbd06e469296bb7c
+size 7904
diff --git a/Shooter.uproject b/Shooter.uproject
index 71bab439..b97c9dad 100644
--- a/Shooter.uproject
+++ b/Shooter.uproject
@@ -1,6 +1,6 @@
{
"FileVersion": 3,
- "EngineAssociation": "5.0",
+ "EngineAssociation": "5.1",
"Category": "",
"Description": "",
"Modules": [
@@ -29,6 +29,26 @@
"Mac",
"Linux"
]
+ },
+ {
+ "Name": "StaticMeshEditorModeling",
+ "Enabled": true
+ },
+ {
+ "Name": "WidgetEditorToolPalette",
+ "Enabled": true
+ },
+ {
+ "Name": "BlueprintSnapNodes",
+ "Enabled": true
+ },
+ {
+ "Name": "VisualStudioTools",
+ "Enabled": true,
+ "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/362651520df94e4fa65492dbcba44ae2",
+ "SupportedTargetPlatforms": [
+ "Win64"
+ ]
}
]
}
\ No newline at end of file
diff --git a/Source/Shooter/AmmoType.h b/Source/Shooter/AmmoType.h
new file mode 100644
index 00000000..8878495b
--- /dev/null
+++ b/Source/Shooter/AmmoType.h
@@ -0,0 +1,10 @@
+#pragma once
+
+UENUM(BlueprintType)
+enum class EAmmoType: uint8
+{
+ EAT_9mm UMETA(DisplayName = "9mm"),
+ EAT_AR UMETA(DisplayName = "AssaultRifle"),
+
+ EAT_MAX UMETA(DisplayName = "DefaultMAX")
+};
\ No newline at end of file
diff --git a/Source/Shooter/Item.cpp b/Source/Shooter/Item.cpp
index e1c9cbde..23dcbf36 100644
--- a/Source/Shooter/Item.cpp
+++ b/Source/Shooter/Item.cpp
@@ -7,9 +7,22 @@
#include "Components/BoxComponent.h"
#include "Components/SphereComponent.h"
#include "Components/WidgetComponent.h"
+#include "Camera/CameraComponent.h"
// Sets default values
-AItem::AItem()
+AItem::AItem() :
+ ItemName(FString("Default")),
+ ItemCount(0),
+ ItemRarity(EItemRarity::EIR_Common),
+ ItemState(EItemState::EIS_Pickup),
+ // Item interp variables
+ ItemInterpStartLocation(FVector(0.f)),
+ CameraTargetLocation(FVector(0.f)),
+ bInterping(false),
+ ZCurveTime(0.7f),
+ ItemIntepX(0.f),
+ ItemIntepY(0.f),
+ InterpInitialYawOffset(0.f)
{
// Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
@@ -35,11 +48,56 @@ void AItem::BeginPlay()
Super::BeginPlay();
// Hide Pickup Widget
- PickupWidget->SetVisibility(false);
+ if (PickupWidget)
+ PickupWidget->SetVisibility(false);
+
+ // Set ActiveStars array based on item rarity
+ setActiveStars();
// Setup overlap for AreaSphere
AreaSphere->OnComponentBeginOverlap.AddDynamic(this, &AItem::OnSphereOverlap);
AreaSphere->OnComponentEndOverlap.AddDynamic(this, &AItem::OnSphereEndOverlap);
+
+ //Set Item properties based on ItemState
+ SetItemProperties(ItemState);
+}
+
+void AItem::setActiveStars()
+{
+ // The 0 element isn't used
+ for (int32 i = 0; i <= 5; ++i)
+ {
+ ActiveStars.Add(false);
+ }
+
+ switch (ItemRarity)
+ {
+ case EItemRarity::EIR_Damaged:
+ ActiveStars[1] = true;
+ break;
+ case EItemRarity::EIR_Common:
+ ActiveStars[1] = true;
+ ActiveStars[2] = true;
+ break;
+ case EItemRarity::EIR_Uncommon:
+ ActiveStars[1] = true;
+ ActiveStars[2] = true;
+ ActiveStars[3] = true;
+ break;
+ case EItemRarity::EIR_Rare:
+ ActiveStars[1] = true;
+ ActiveStars[2] = true;
+ ActiveStars[3] = true;
+ ActiveStars[4] = true;
+ break;
+ case EItemRarity::EIR_Legendary:
+ ActiveStars[1] = true;
+ ActiveStars[2] = true;
+ ActiveStars[3] = true;
+ ActiveStars[4] = true;
+ ActiveStars[5] = true;
+ break;
+ }
}
// Called every frame
@@ -47,6 +105,8 @@ void AItem::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
+ // Handle Item interping when in the EquipInterping state
+ ItemInterp(DeltaTime);
}
void AItem::OnSphereOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp,
@@ -77,3 +137,180 @@ void AItem::OnSphereEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor*
}
}
+void AItem::ItemInterp(float DeltaTime)
+{
+ if (!bInterping) return;
+
+ if (Character && ItemZCurve)
+ {
+ // Elapsed time since we started ItemInterpTimer
+ const float ElapsedTime = GetWorldTimerManager().GetTimerElapsed(ItemInterpTimer);
+
+ // Get curve value corresponding to ElapsedTime
+ const float CurveValue = ItemZCurve->GetFloatValue(ElapsedTime);
+
+ // Get the item's initial location when the curve started
+ FVector ItemLocation = ItemInterpStartLocation;
+
+ // Get location in front of the camera
+ const FVector CameraInterpLocation{ Character->GetCameraInterpLocation() };
+
+ // Vector from Item to Camera Interp Location, X and Y are zeroed out
+ const FVector ItemToCamera{ FVector(0.f, 0.f, (CameraInterpLocation - ItemLocation).Z) };
+
+ // SCale factor to multiply with CurveValue
+ const float DeltaZ = ItemToCamera.Size();
+
+ const FVector CurrentLocation{ GetActorLocation() };
+
+ // Interpolated X Value
+ const float InterpXValue = FMath::FInterpTo(CurrentLocation.X,
+ CameraInterpLocation.X,
+ DeltaTime, 30.f);
+
+ // Interpolated Y Value
+ const float InterpYValue = FMath::FInterpTo(CurrentLocation.Y,
+ CameraInterpLocation.Y,
+ DeltaTime, 30.f);
+
+ // Set X and Y of ItemLocation to Interped values
+ ItemLocation.X = InterpXValue;
+ ItemLocation.Y = InterpYValue;
+
+ // Adding curve value to the Z component of the Initial Location (Scaled by DeltaZ)
+ ItemLocation.Z += CurveValue * DeltaZ;
+ SetActorLocation(ItemLocation, true,
+ nullptr, ETeleportType::TeleportPhysics);
+
+ // Camera rotation this frame
+ const FRotator CameraRotation{Character->GetFollowCamera()->GetComponentRotation()};
+ // Camera rotation plus initial Yaw Offset
+ const FRotator ItemRotation{0.f, CameraRotation.Yaw + InterpInitialYawOffset, 0.f};
+ SetActorRotation(ItemRotation, ETeleportType::TeleportPhysics);
+
+ if (ItemScaleCurve)
+ {
+ const float ScaleCurveValue = ItemScaleCurve->GetFloatValue(ElapsedTime);
+ SetActorScale3D(FVector(ScaleCurveValue, ScaleCurveValue, ScaleCurveValue));
+ }
+ }
+}
+
+void AItem::SetItemState(EItemState State)
+{
+ ItemState = State;
+ SetItemProperties(State);
+}
+
+void AItem::SetItemProperties(EItemState State)
+{
+ switch (State)
+ {
+ case EItemState::EIS_Pickup:
+ // Set Mesh properties
+ ItemMesh->SetSimulatePhysics(false);
+ ItemMesh->SetEnableGravity(false);
+ ItemMesh->SetVisibility(true);
+ ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ ItemMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+
+ // Set AreaSphere properties
+ AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Overlap);
+ AreaSphere->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
+
+ // Set CollisionBox properties
+ CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ CollisionBox->SetCollisionResponseToChannel(ECollisionChannel::ECC_Visibility, ECollisionResponse::ECR_Block);
+ CollisionBox->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
+ break;
+ case EItemState::EIS_Equipped:
+ // Set Mesh properties
+ ItemMesh->SetSimulatePhysics(false);
+ ItemMesh->SetEnableGravity(false);
+ ItemMesh->SetVisibility(true);
+ ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ ItemMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+
+ // Set AreaSphere properties
+ AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ AreaSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+
+ // Set CollisionBox properties
+ CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ CollisionBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+ break;
+ case EItemState::EIS_Falling:
+ // Set Mesh properties
+ ItemMesh->SetSimulatePhysics(true);
+ ItemMesh->SetEnableGravity(true);
+ ItemMesh->SetVisibility(true);
+ ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ ItemMesh->SetCollisionResponseToChannel(ECollisionChannel::ECC_WorldStatic, ECollisionResponse::ECR_Block);
+ ItemMesh->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics);
+
+ // Set AreaSphere properties
+ AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ AreaSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+
+ // Set CollisionBox properties
+ CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ CollisionBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+ break;
+ case EItemState::EIS_EquipInterping:
+ PickupWidget->SetVisibility(false);
+
+ // Set Mesh properties
+ ItemMesh->SetSimulatePhysics(false);
+ ItemMesh->SetEnableGravity(false);
+ ItemMesh->SetVisibility(true);
+ ItemMesh->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ ItemMesh->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+
+ // Set AreaSphere properties
+ AreaSphere->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ AreaSphere->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+
+ // Set CollisionBox properties
+ CollisionBox->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore);
+ CollisionBox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
+ break;
+ }
+}
+
+void AItem::StartItemCurve(AShooterCharacter* Char)
+{
+ // Store a handle to the Character
+ Character = Char;
+
+ // Store the initial locatino of the Item
+ ItemInterpStartLocation = GetActorLocation();
+
+ bInterping = true;
+ SetItemState(EItemState::EIS_EquipInterping);
+
+ GetWorldTimerManager().SetTimer(ItemInterpTimer, this,
+ &AItem::FinishInterping, ZCurveTime);
+
+ // Get initial Yaw of the Camera
+ const float CameraRotationYaw{
+ static_cast(Character->GetFollowCamera()->GetComponentRotation().Yaw)
+ };
+
+ // Get initial Yaw of the Item
+ const float ItemRotationYaw{ static_cast(GetActorRotation().Yaw) };
+
+ // Initial Yaw Offset between Camera and Item
+ InterpInitialYawOffset = ItemRotationYaw - CameraRotationYaw;
+}
+
+void AItem::FinishInterping()
+{
+ bInterping = false;
+ if (Character)
+ {
+ Character->GetPickupItem(this);
+ }
+ // Set scale back to normal
+ SetActorScale3D(FVector(1.f));
+}
+
diff --git a/Source/Shooter/Item.h b/Source/Shooter/Item.h
index 97bb5155..28eb3d07 100644
--- a/Source/Shooter/Item.h
+++ b/Source/Shooter/Item.h
@@ -9,6 +9,32 @@
class UBoxComponent;
class UWidgetComponent;
class USphereComponent;
+class UCurveFloat;
+class AShooterCharacter;
+
+UENUM(BlueprintType)
+enum class EItemRarity : uint8
+{
+ EIR_Damaged UMETA(DisplayName = "Damaged"),
+ EIR_Common UMETA(DisplayName = "Common"),
+ EIR_Uncommon UMETA(DisplayName = "Uncommon"),
+ EIR_Rare UMETA(DisplayName = "Rare"),
+ EIR_Legendary UMETA(DisplayName = "Legendary"),
+
+ EIR_MAX UMETA(DisplayName = "DefaultMAX")
+};
+
+UENUM(BlueprintType)
+enum class EItemState : uint8
+{
+ EIS_Pickup UMETA(DisplayName = "Damaged"),
+ EIS_EquipInterping UMETA(DisplayName = "EquipInterping"),
+ EIS_PickedUp UMETA(DisplayName = "PickedUp"),
+ EIS_Equipped UMETA(DisplayName = "Equipped"),
+ EIS_Falling UMETA(DisplayName = "Falling"),
+
+ EIS_MAX UMETA(DisplayName = "DefaultMAX")
+};
UCLASS()
class SHOOTER_API AItem : public AActor
@@ -23,6 +49,14 @@ protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
+ // Sets the ActiveStars array of bools based on rarity
+ void setActiveStars();
+
+ /** Sets properties of the Item's components based on State */
+ void SetItemProperties(EItemState State);
+
+ /** Called when ItemInterpTimer is finished*/
+ void FinishInterping();
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
@@ -38,6 +72,8 @@ public:
void OnSphereEndOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex);
+ /** Handles item interpolation when in the EquipInterping state */
+ void ItemInterp(float DeltaTime);
private:
/* Skeletal mesh for the item */
@@ -56,6 +92,79 @@ private:
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
USphereComponent* AreaSphere;
+ /* The name which appears on the Pickup Widget */
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ FString ItemName;
+
+ /* Item count (Ammo, etc...) */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ int32 ItemCount;
+
+ /* Item rarity - determines number of stars in Pickup Widget */
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ EItemRarity ItemRarity;
+
+ /* Item rarity - determines number of stars in Pickup Widget */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ TArray ActiveStars;
+
+ /** State of the Item */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ EItemState ItemState;
+
+ /** The curve asset to use for the item's Z location when interping */
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ UCurveFloat* ItemZCurve;
+
+ /** Starting location when interping begins */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ FVector ItemInterpStartLocation;
+
+ /** Target interp location in front of the camera */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ FVector CameraTargetLocation;
+
+ /** true when interping */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ bool bInterping;
+
+
+ /** Plays when we start interping */
+ FTimerHandle ItemInterpTimer;
+
+ /** Duration of the curve and timer */
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ float ZCurveTime;
+
+
+ /** Pointer to the character */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ AShooterCharacter* Character;
+
+ /** X and Y for the item while interping in the EquipInterping state */
+ float ItemIntepX;
+ float ItemIntepY;
+
+ /** Initial Yaw offset between the camera and the interping item */
+ float InterpInitialYawOffset;
+
+ /** Curve used to scale the item when interping */
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = true))
+ UCurveFloat* ItemScaleCurve;
+
public:
FORCEINLINE UWidgetComponent* GetPickupWidget() const { return PickupWidget; }
+
+ FORCEINLINE USphereComponent* GetAreaSphere() const { return AreaSphere; }
+
+ FORCEINLINE UBoxComponent* GetCollisionBox() const { return CollisionBox; }
+
+ FORCEINLINE EItemState GetItemState() const { return ItemState; }
+
+ void SetItemState(EItemState State);
+
+ FORCEINLINE USkeletalMeshComponent* GetItemMesh() const { return ItemMesh; }
+
+ /** Called from the AShooterCharacter class */
+ void StartItemCurve(AShooterCharacter* Char);
};
diff --git a/Source/Shooter/ShooterCharacter.cpp b/Source/Shooter/ShooterCharacter.cpp
index 21d98dc1..c2574e81 100644
--- a/Source/Shooter/ShooterCharacter.cpp
+++ b/Source/Shooter/ShooterCharacter.cpp
@@ -2,9 +2,12 @@
#include "ShooterCharacter.h"
+#include "Weapon.h"
#include "Item.h"
#include "Camera/CameraComponent.h"
+#include "Components/SphereComponent.h"
+#include "Components/BoxComponent.h"
#include "Components/WidgetComponent.h"
#include "Engine/SkeletalMeshSocket.h"
#include "GameFramework/SpringArmComponent.h"
@@ -45,11 +48,19 @@ AShooterCharacter::AShooterCharacter() :
ShootTimeDuration(0.05f),
bFiringBullet(false),
// Automatic fire
- bShouldFire(true),
bFireButtonPressed(false),
+ bShouldFire(true),
AutomaticFireRate(0.1f),
// Item trace variables
- bShouldTraceForItems(false)
+ bShouldTraceForItems(false),
+ // Camera interp location variables
+ CameraInterpDistance(150.f),
+ CameraInterpElevation(55.f),
+ // Starting ammo amounts
+ Starting9mmAmmo(85),
+ StartingARAmmo(120),
+ // Combat variables
+ CombatState(ECombatState::ECS_Unoccupied)
{
// Set this character to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
@@ -95,6 +106,63 @@ void AShooterCharacter::BeginPlay()
CameraDefaultFOV = FollowCamera->FieldOfView;
CameraCurrentFOV = CameraDefaultFOV;
}
+
+ // Spawn the default weapon and equip it
+ EquipWeapon(SpawnDefaultWeapon());
+
+ InitializeAmmoMap();
+}
+
+// Called to bind functionality to input
+void AShooterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
+{
+ Super::SetupPlayerInputComponent(PlayerInputComponent);
+ check(PlayerInputComponent);
+
+ PlayerInputComponent->BindAxis("MoveForward", this, &AShooterCharacter::MoveForward);
+ PlayerInputComponent->BindAxis("MoveRight", this, &AShooterCharacter::MoveRight);
+ PlayerInputComponent->BindAxis("TurnRate", this, &AShooterCharacter::TurnAtRate);
+ PlayerInputComponent->BindAxis("LookUpRate", this, &AShooterCharacter::LookUpAtRate);
+ PlayerInputComponent->BindAxis("Turn", this, &AShooterCharacter::Turn);
+ PlayerInputComponent->BindAxis("LookUp", this, &AShooterCharacter::LookUp);
+
+ PlayerInputComponent->BindAction("Jump", IE_Pressed, this, &ACharacter::Jump);
+ PlayerInputComponent->BindAction("Jump", IE_Released, this, &ACharacter::StopJumping);
+
+ PlayerInputComponent->BindAction("FireButton", IE_Pressed, this,
+ &AShooterCharacter::FireButtonPressed);
+ PlayerInputComponent->BindAction("FireButton", IE_Released, this,
+ &AShooterCharacter::FireButtonReleased);
+
+ PlayerInputComponent->BindAction("Aiming", IE_Pressed, this,
+ &AShooterCharacter::AimingButtonPressed);
+ PlayerInputComponent->BindAction("Aiming", IE_Released, this,
+ &AShooterCharacter::AimingButtonReleased);
+
+ PlayerInputComponent->BindAction("Select", IE_Pressed, this,
+ &AShooterCharacter::SelectButtonPressed);
+ PlayerInputComponent->BindAction("Select", IE_Released, this,
+ &AShooterCharacter::SelectButtonReleased);
+
+ PlayerInputComponent->BindAction("Reload", IE_Pressed, this,
+ &AShooterCharacter::ReloadButtonPressed);
+}
+
+// Called every frame
+void AShooterCharacter::Tick(float DeltaTime)
+{
+ Super::Tick(DeltaTime);
+
+ // Handle interpolation for zoom when aiming
+ CameraInterpZoom(DeltaTime);
+
+ // Change look sensitivity based on aiming
+ SetLookRates();
+
+ // Calculate crosshair spread multiplier
+ CalculateCrosshairSpread(DeltaTime);
+
+ TraceForItems();
}
void AShooterCharacter::MoveForward(float Value)
@@ -162,84 +230,6 @@ void AShooterCharacter::LookUp(float Value)
AddControllerPitchInput(Value * LookUpScaleFactor);
}
-void AShooterCharacter::FireWeapon()
-{
- if (FireSound)
- {
- UGameplayStatics::PlaySound2D(this, FireSound);
- }
-
- const USkeletalMeshSocket* BarrelSocket = GetMesh()->GetSocketByName("BarrelSocket");
- if (BarrelSocket)
- {
- const FTransform SocketTransform = BarrelSocket->GetSocketTransform(GetMesh());
-
- if (MuzzleFlash)
- {
- UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), MuzzleFlash, SocketTransform);
- }
-
- FVector BeamEnd;
- bool bBeamEnd = GetBeamEndLocation(SocketTransform.GetLocation(),
- BeamEnd);
-
- if (bBeamEnd)
- {
- // Spawn impact particles after updating BeamEndPoint
- if (ImpactParticles)
- {
- UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticles,
- BeamEnd);
- }
-
- // Spawn smoke trail particles
- if (BeamParticles)
- {
- UParticleSystemComponent* Beam = UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), BeamParticles,
- SocketTransform);
- if (Beam)
- {
- Beam->SetVectorParameter("Target", BeamEnd);
- }
- }
- }
- }
-
- UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
-
- if (AnimInstance && HipFireMontage)
- {
- AnimInstance->Montage_Play(HipFireMontage);
- AnimInstance->Montage_JumpToSection(FName("StartFire"));
- }
-
- // Start bullet fire timer for crosshairs
- StartCrosshairBulletFire();
-}
-
-bool AShooterCharacter::GetBeamEndLocation(const FVector& MuzzleSocketLocation, FVector& OutBeamLocation)
-{
- // Check for crosshair trace hit
- FHitResult CrosshairHitResult;
- bool bCrosshairHit = TraceUnderCrosshairs(CrosshairHitResult, OutBeamLocation);
-
- // Perform a second trace, this time from the gun barrel
- FHitResult WeaponTraceHit;
- const FVector WeaponTraceStart{ MuzzleSocketLocation };
- const FVector StartToEnd{ OutBeamLocation - MuzzleSocketLocation };
- const FVector WeaponTraceEnd{ MuzzleSocketLocation + StartToEnd * 1.25f };
-
- GetWorld()->LineTraceSingleByChannel(WeaponTraceHit, WeaponTraceStart, WeaponTraceEnd,
- ECollisionChannel::ECC_Visibility);
-
- if (WeaponTraceHit.bBlockingHit) // Object between barrel and BeamEndPoint ?
- {
- OutBeamLocation = WeaponTraceHit.Location;
- return true;
- }
- return false;
-}
-
void AShooterCharacter::AimingButtonPressed()
{
bAiming = true;
@@ -286,6 +276,187 @@ void AShooterCharacter::SetLookRates()
}
}
+void AShooterCharacter::FireButtonPressed()
+{
+ bFireButtonPressed = true;
+ FireWeapon();
+}
+
+void AShooterCharacter::FireButtonReleased()
+{
+ bFireButtonPressed = false;
+}
+
+void AShooterCharacter::FireWeapon()
+{
+ if (!EquippedWeapon) return;
+ if (CombatState != ECombatState::ECS_Unoccupied) return;
+ if (!WeaponHasAmmo()) return;
+
+ PlayFireSound();
+ SendBullet();
+ PlayGunFireMontage();
+ EquippedWeapon->DecrementAmmo();
+ StartCrosshairBulletFire();
+ StartFireTimer();
+}
+
+void AShooterCharacter::StartFireTimer()
+{
+ CombatState = ECombatState::ECS_FireTimerInProgress;
+ GetWorldTimerManager().SetTimer(AutoFireTimer, this, &AShooterCharacter::AutoFireReset,
+ AutomaticFireRate);
+}
+
+void AShooterCharacter::AutoFireReset()
+{
+ CombatState = ECombatState::ECS_Unoccupied;
+ if (WeaponHasAmmo())
+ {
+ if (bFireButtonPressed)
+ {
+ FireWeapon();
+ }
+ }
+ else
+ {
+ ReloadWeapon();
+ }
+}
+
+void AShooterCharacter::PlayFireSound()
+{
+ // Play fire sound
+ if (FireSound)
+ {
+ UGameplayStatics::PlaySound2D(this, FireSound);
+ }
+}
+
+void AShooterCharacter::SendBullet()
+{
+ // Send bullet
+ const USkeletalMeshSocket* BarrelSocket = EquippedWeapon->GetItemMesh()->GetSocketByName("BarrelSocket");
+ if (!BarrelSocket) return;
+
+ const FTransform SocketTransform = BarrelSocket->GetSocketTransform(EquippedWeapon->GetItemMesh());
+
+ if (MuzzleFlash)
+ {
+ UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), MuzzleFlash, SocketTransform);
+ }
+
+ FVector BeamEnd;
+ bool bBeamEnd = GetBeamEndLocation(SocketTransform.GetLocation(), BeamEnd);
+
+ if (!bBeamEnd) return;
+
+ // Spawn impact particles after updating BeamEndPoint
+ if (ImpactParticles)
+ {
+ UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), ImpactParticles,
+ BeamEnd);
+ }
+
+ // Spawn smoke trail particles
+ if (BeamParticles)
+ {
+ UParticleSystemComponent* Beam = UGameplayStatics::SpawnEmitterAtLocation(GetWorld(), BeamParticles,
+ SocketTransform);
+ if (Beam)
+ {
+ Beam->SetVectorParameter("Target", BeamEnd);
+ }
+ }
+
+}
+
+void AShooterCharacter::PlayGunFireMontage()
+{
+ // Play gun fire montage
+ UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
+
+ if (AnimInstance && HipFireMontage)
+ {
+ AnimInstance->Montage_Play(HipFireMontage);
+ AnimInstance->Montage_JumpToSection(FName("StartFire"));
+ }
+}
+
+bool AShooterCharacter::GetBeamEndLocation(const FVector& MuzzleSocketLocation, FVector& OutBeamLocation)
+{
+ // Check for crosshair trace hit
+ FHitResult CrosshairHitResult;
+ bool bCrosshairHit = TraceUnderCrosshairs(CrosshairHitResult, OutBeamLocation);
+
+ // Perform a second trace, this time from the gun barrel
+ FHitResult WeaponTraceHit;
+ const FVector WeaponTraceStart{ MuzzleSocketLocation };
+ const FVector StartToEnd{ OutBeamLocation - MuzzleSocketLocation };
+ const FVector WeaponTraceEnd{ MuzzleSocketLocation + StartToEnd * 1.25f };
+
+ GetWorld()->LineTraceSingleByChannel(WeaponTraceHit, WeaponTraceStart, WeaponTraceEnd,
+ ECollisionChannel::ECC_Visibility);
+
+ if (WeaponTraceHit.bBlockingHit) // Object between barrel and BeamEndPoint ?
+ {
+ OutBeamLocation = WeaponTraceHit.Location;
+ return true;
+ }
+ return false;
+}
+
+bool AShooterCharacter::TraceUnderCrosshairs(FHitResult& OutHitResult, FVector& OutHitLocation)
+{
+ // Get Viewport Size
+ FVector2D ViewportSize;
+
+ if (GEngine && GEngine->GameViewport)
+ {
+ GEngine->GameViewport->GetViewportSize(ViewportSize);
+ }
+
+ // Get screen space location of crosshairs
+ FVector2D CrosshairLocation{ ViewportSize.X / 2.f, ViewportSize.Y / 2.f };
+
+ // Get world position and direction of crosshairs
+ FVector CrosshairWorldPosition;
+ FVector CrosshairWorldDirection;
+ bool bScreenToWorld = UGameplayStatics::DeprojectScreenToWorld(
+ UGameplayStatics::GetPlayerController(this, 0),
+ CrosshairLocation, CrosshairWorldPosition, CrosshairWorldDirection);
+
+ if (bScreenToWorld)
+ {
+ // Trace from Crosshair world location outward
+ const FVector Start{ CrosshairWorldPosition };
+ const FVector End{ Start + CrosshairWorldDirection * 50'000.f };
+ OutHitLocation = End;
+
+ GetWorld()->LineTraceSingleByChannel(OutHitResult, Start, End, ECollisionChannel::ECC_Visibility);
+
+ if (OutHitResult.bBlockingHit)
+ {
+ OutHitLocation = OutHitResult.Location;
+ return true;
+ }
+ }
+ return false;
+}
+
+void AShooterCharacter::StartCrosshairBulletFire()
+{
+ bFiringBullet = true;
+
+ GetWorldTimerManager().SetTimer(CrosshairShootTimer, this,
+ &AShooterCharacter::FinishCrosshairBulletFire, ShootTimeDuration);
+}
+
+void AShooterCharacter::FinishCrosshairBulletFire()
+{
+ bFiringBullet = false;
+}
+
void AShooterCharacter::CalculateCrosshairSpread(float DeltaTime)
{
FVector2D WalkSpeedRange{ 0.f, 600.f };
@@ -344,92 +515,8 @@ void AShooterCharacter::CalculateCrosshairSpread(float DeltaTime)
- CrosshairAimFactor;
}
-void AShooterCharacter::StartCrosshairBulletFire()
-{
- bFiringBullet = true;
-
- GetWorldTimerManager().SetTimer(CrosshairShootTimer, this,
- &AShooterCharacter::FinishCrosshairBulletFire, ShootTimeDuration);
-}
-
-void AShooterCharacter::FinishCrosshairBulletFire()
-{
- bFiringBullet = false;
-}
-
-void AShooterCharacter::FireButtonPressed()
-{
- bFireButtonPressed = true;
- StartFireTimer();
-}
-
-void AShooterCharacter::FireButtonReleased()
-{
- bFireButtonPressed = false;
-}
-
-void AShooterCharacter::StartFireTimer()
-{
- if (bShouldFire)
- {
- AShooterCharacter::FireWeapon();
- bShouldFire = false;
-
- GetWorldTimerManager().SetTimer(AutoFireTimer, this, &AShooterCharacter::AutoFireReset,
- AutomaticFireRate);
- }
-}
-
-void AShooterCharacter::AutoFireReset()
-{
- bShouldFire = true;
- if (bFireButtonPressed)
- {
- StartFireTimer();
- }
-}
-
-bool AShooterCharacter::TraceUnderCrosshairs(FHitResult& OutHitResult, FVector& OutHitLocation)
-{
- // Get Viewport Size
- FVector2D ViewportSize;
-
- if (GEngine && GEngine->GameViewport)
- {
- GEngine->GameViewport->GetViewportSize(ViewportSize);
- }
-
- // Get screen space location of crosshairs
- FVector2D CrosshairLocation{ ViewportSize.X / 2.f, ViewportSize.Y / 2.f };
-
- // Get world position and direction of crosshairs
- FVector CrosshairWorldPosition;
- FVector CrosshairWorldDirection;
- bool bScreenToWorld = UGameplayStatics::DeprojectScreenToWorld(
- UGameplayStatics::GetPlayerController(this, 0),
- CrosshairLocation, CrosshairWorldPosition, CrosshairWorldDirection);
-
- if (bScreenToWorld)
- {
- // Trace from Crosshair world location outward
- const FVector Start{ CrosshairWorldPosition };
- const FVector End{ Start + CrosshairWorldDirection * 50'000.f };
- OutHitLocation = End;
-
- GetWorld()->LineTraceSingleByChannel(OutHitResult, Start, End, ECollisionChannel::ECC_Visibility);
-
- if (OutHitResult.bBlockingHit)
- {
- OutHitLocation = OutHitResult.Location;
- return true;
- }
- }
- return false;
-}
-
void AShooterCharacter::TraceForItems()
{
- static AItem* HitItem;
if (bShouldTraceForItems)
{
FHitResult ItemTraceResult;
@@ -439,22 +526,22 @@ void AShooterCharacter::TraceForItems()
if (ItemTraceResult.bBlockingHit)
{
// If an item was being looked at from last frame, we should hide its widget
- SetItemPickupWidgetVisibility(HitItem, false);
+ SetItemPickupWidgetVisibility(TraceHitItem, false);
// Show the new item's widget
- HitItem = Cast(ItemTraceResult.GetActor());
- SetItemPickupWidgetVisibility(HitItem, true);
+ TraceHitItem = Cast(ItemTraceResult.GetActor());
+ SetItemPickupWidgetVisibility(TraceHitItem, true);
}
- else if (HitItem) // Hide widget for the item from last frame
+ else if (TraceHitItem) // Hide widget for the item from last frame
{
- SetItemPickupWidgetVisibility(HitItem, false);
- HitItem = nullptr;
+ SetItemPickupWidgetVisibility(TraceHitItem, false);
+ TraceHitItem = nullptr;
}
}
- else if (HitItem) // Hide widget for the item from last frame
+ else if (TraceHitItem) // Hide widget for the item from last frame
{
- SetItemPickupWidgetVisibility(HitItem, false);
- HitItem = nullptr;
+ SetItemPickupWidgetVisibility(TraceHitItem, false);
+ TraceHitItem = nullptr;
}
}
@@ -466,50 +553,74 @@ void AShooterCharacter::SetItemPickupWidgetVisibility(AItem* Item, bool visibili
}
}
-// Called every frame
-void AShooterCharacter::Tick(float DeltaTime)
+AWeapon* AShooterCharacter::SpawnDefaultWeapon()
{
- Super::Tick(DeltaTime);
+ // Check the TSubclassOf variable
+ if (DefaultWeaponClass)
+ {
+ // Spawn the weapon
+ return GetWorld()->SpawnActor(DefaultWeaponClass);
+ }
- // Handle interpolation for zoom when aiming
- CameraInterpZoom(DeltaTime);
-
- // Change look sensitivity based on aiming
- SetLookRates();
-
- // Calculate crosshair spread multiplier
- CalculateCrosshairSpread(DeltaTime);
-
- TraceForItems();
+ return nullptr;
}
-// Called to bind functionality to input
-void AShooterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
+void AShooterCharacter::EquipWeapon(AWeapon* WeaponToEquip)
{
- Super::SetupPlayerInputComponent(PlayerInputComponent);
- check(PlayerInputComponent);
+ // Get the hand socket
+ const USkeletalMeshSocket* HandSocket = GetMesh()->GetSocketByName(FName("RightHandSocket"));
- PlayerInputComponent->BindAxis("MoveForward", this, &AShooterCharacter::MoveForward);
- PlayerInputComponent->BindAxis("MoveRight", this, &AShooterCharacter::MoveRight);
- PlayerInputComponent->BindAxis("TurnRate", this, &AShooterCharacter::TurnAtRate);
- PlayerInputComponent->BindAxis("LookUpRate", this, &AShooterCharacter::LookUpAtRate);
- PlayerInputComponent->BindAxis("Turn", this, &AShooterCharacter::Turn);
- PlayerInputComponent->BindAxis("LookUp", this, &AShooterCharacter::LookUp);
+ if (HandSocket && WeaponToEquip)
+ {
+ // Attach the weapon to the hand socket RightHandSocket
+ HandSocket->AttachActor(WeaponToEquip, GetMesh());
- PlayerInputComponent->BindAction("Jump", IE_Pressed, this,
- &ACharacter::Jump);
- PlayerInputComponent->BindAction("Jump", IE_Released, this,
- &ACharacter::StopJumping);
+ EquippedWeapon = WeaponToEquip;
+ EquippedWeapon->SetItemState(EItemState::EIS_Equipped);
+ }
+}
- PlayerInputComponent->BindAction("FireButton", IE_Pressed, this,
- &AShooterCharacter::FireButtonPressed);
- PlayerInputComponent->BindAction("FireButton", IE_Released, this,
- &AShooterCharacter::FireButtonReleased);
+void AShooterCharacter::DropWeapon()
+{
+ if (EquippedWeapon)
+ {
+ FDetachmentTransformRules DetachmentTransformRules(EDetachmentRule::KeepWorld, true);
+ EquippedWeapon->GetItemMesh()->DetachFromComponent(DetachmentTransformRules);
- PlayerInputComponent->BindAction("Aiming", IE_Pressed, this,
- &AShooterCharacter::AimingButtonPressed);
- PlayerInputComponent->BindAction("Aiming", IE_Released, this,
- &AShooterCharacter::AimingButtonReleased);
+ EquippedWeapon->SetItemState(EItemState::EIS_Falling);
+ EquippedWeapon->ThrowWeapon();
+ }
+}
+
+void AShooterCharacter::SelectButtonPressed()
+{
+ if (TraceHitItem)
+ {
+ TraceHitItem->StartItemCurve(this);
+ }
+}
+
+void AShooterCharacter::SelectButtonReleased()
+{
+}
+
+void AShooterCharacter::SwapWeapon(AWeapon* WeaponToSwap)
+{
+ DropWeapon();
+ EquipWeapon(WeaponToSwap);
+}
+
+void AShooterCharacter::InitializeAmmoMap()
+{
+ AmmoMap.Add(EAmmoType::EAT_9mm, Starting9mmAmmo);
+ AmmoMap.Add(EAmmoType::EAT_AR, StartingARAmmo);
+}
+
+bool AShooterCharacter::WeaponHasAmmo()
+{
+ if (!EquippedWeapon) return false;
+
+ return (EquippedWeapon->GetAmmo() > 0);
}
float AShooterCharacter::GetCrosshairSpreadMultiplier() const
@@ -531,3 +642,83 @@ void AShooterCharacter::IncrementOverlappedItemCount(int8 Amount)
}
}
+FVector AShooterCharacter::GetCameraInterpLocation()
+{
+ const FVector CameraWorldLocation{ FollowCamera->GetComponentLocation() };
+ const FVector CameraForward{ FollowCamera->GetForwardVector() };
+
+ // Desired = CameraWorldLocation + Forward * A + Up * B
+ return CameraWorldLocation + CameraForward * CameraInterpDistance
+ + FVector(0.f, 0.f, CameraInterpElevation);
+}
+
+void AShooterCharacter::GetPickupItem(AItem* Item)
+{
+ auto Weapon = Cast(Item);
+
+ if (Weapon)
+ {
+ SwapWeapon(Weapon);
+ }
+}
+
+void AShooterCharacter::ReloadButtonPressed()
+{
+ ReloadWeapon();
+}
+
+void AShooterCharacter::ReloadWeapon()
+{
+ if (CombatState != ECombatState::ECS_Unoccupied) return;
+ if (!EquippedWeapon) return;
+
+ // Do we have ammo for the correct type
+ if (CarryingAmmo() && EquippedWeapon->GetAmmo() < EquippedWeapon->GetMagazineCapacity())
+ {
+ CombatState = ECombatState::ECS_Reloading;
+ UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
+ if (AnimInstance && ReloadMontage)
+ {
+ AnimInstance->Montage_Play(ReloadMontage);
+ AnimInstance->Montage_JumpToSection(EquippedWeapon->GetReloadMontageSection());
+ }
+ }
+}
+
+void AShooterCharacter::FinishReloading()
+{
+ CombatState = ECombatState::ECS_Unoccupied;
+ if (!EquippedWeapon) return;
+
+ if (const auto AmmoType { EquippedWeapon->GetAmmoType() }; AmmoMap.Contains(AmmoType))
+ {
+ int32 CarriedAmmo = AmmoMap[AmmoType];
+
+ if (const int32 MagEmptySpace = EquippedWeapon->GetMagazineCapacity() - EquippedWeapon->GetAmmo();
+ MagEmptySpace > CarriedAmmo)
+ {
+ // Reload the mag with all the ammo we're carrying
+ EquippedWeapon->ReloadAmmo(CarriedAmmo);
+ CarriedAmmo = 0;
+ AmmoMap.Add(AmmoType, CarriedAmmo);
+ }
+ else
+ {
+ // Fill the mag
+ EquippedWeapon->ReloadAmmo(MagEmptySpace);
+ CarriedAmmo -= MagEmptySpace;
+ AmmoMap.Add(AmmoType, CarriedAmmo);
+ }
+ }
+}
+
+bool AShooterCharacter::CarryingAmmo()
+{
+ if (!EquippedWeapon) return false;
+
+ if (const auto AmmoType = EquippedWeapon->GetAmmoType(); AmmoMap.Contains(AmmoType))
+ {
+ return AmmoMap[AmmoType] > 0;
+ }
+ return false;
+}
diff --git a/Source/Shooter/ShooterCharacter.h b/Source/Shooter/ShooterCharacter.h
index 9c98997a..dd0662dd 100644
--- a/Source/Shooter/ShooterCharacter.h
+++ b/Source/Shooter/ShooterCharacter.h
@@ -4,6 +4,9 @@
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
+
+#include "AmmoType.h"
+
#include "ShooterCharacter.generated.h"
class USpringArmComponent;
@@ -12,6 +15,18 @@ class USoundCue;
class UParticleSystem;
class UAnimMontage;
class AItem;
+class AWeapon;
+
+
+UENUM(BlueprintType)
+enum class ECombatState : uint8
+{
+ ECS_Unoccupied UMETA(DisplayName = "Unoccupied"),
+ ECS_FireTimerInProgress UMETA(DisplayName = "FireTimerInProgress"),
+ ECS_Reloading UMETA(DisplayName = "Reloading"),
+
+ ECS_MAX UMETA(DisplayName = "DefaultMax")
+};
UCLASS()
class SHOOTER_API AShooterCharacter : public ACharacter
@@ -22,6 +37,12 @@ public:
// Sets default values for this character's properties
AShooterCharacter();
+ // Called every frame
+ virtual void Tick(float DeltaTime) override;
+
+ // Called to bind functionality to input
+ virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
+
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
@@ -97,13 +118,41 @@ protected:
void SetItemPickupWidgetVisibility(AItem* Item, bool visibility);
-public:
- // Called every frame
- virtual void Tick(float DeltaTime) override;
+ /* Spawns a default weapon and equips it */
+ AWeapon* SpawnDefaultWeapon();
- // Called to bind functionality to input
- virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;
+ /* Takes a weapon and attaches it to the mesh */
+ void EquipWeapon(AWeapon* WeaponToEquip);
+ /** Detach weapon and let it fall to the ground */
+ void DropWeapon();
+
+ void SelectButtonPressed();
+ void SelectButtonReleased();
+
+ /** Drops currently equipped weapon and equips TraceHitItem */
+ void SwapWeapon(AWeapon* WeaponToSwap);
+
+ /** Initialize the ammo map with ammo values */
+ void InitializeAmmoMap();
+
+ /** Check to make sure this weapon has ammo */
+ bool WeaponHasAmmo();
+
+ /** FireWeapon functions */
+ void PlayFireSound();
+ void SendBullet();
+ void PlayGunFireMontage();
+
+ /** For reloading the weapon */
+ void ReloadButtonPressed();
+ void ReloadWeapon();
+
+ UFUNCTION(BlueprintCallable)
+ void FinishReloading();
+
+ /** Check to see if we have ammo of the EquippedWeapon's ammo type */
+ bool CarryingAmmo();
private:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Camera, meta = (AllowPrivateAccess = true))
USpringArmComponent* CameraBoom;
@@ -233,6 +282,46 @@ private:
/* Number of overlapped AItems */
int8 OverlappedItemCount;
+ /* Currently equipped weapon */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = true))
+ AWeapon * EquippedWeapon;
+
+ /* Set this in blueprints for the default weapon class */
+ UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = true))
+ TSubclassOf DefaultWeaponClass;
+
+ /** Item currently hit by our trace in TraceForItems() (could be null) */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = true))
+ AItem* TraceHitItem;
+
+ /** Distance outward from the camera for the interp destination */
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Items, meta = (AllowPrivateAccess = true))
+ float CameraInterpDistance;
+
+ /** Distance upward from the camera for the interp destination */
+ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Items, meta = (AllowPrivateAccess = true))
+ float CameraInterpElevation;
+
+ /** Map to keep track of ammo of the different weapon types */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Items, meta = (AllowPrivateAccess = true))
+ TMap AmmoMap;
+
+ /** Staring amount of 9mm ammo */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Items, meta = (AllowPrivateAccess = true))
+ int32 Starting9mmAmmo;
+
+ /** Staring amount of AR ammo */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Items, meta = (AllowPrivateAccess = true))
+ int32 StartingARAmmo;
+
+ /** Combat State can only fire or reload if Unoccupied */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Combat, meta = (AllowPrivateAccess = true))
+ ECombatState CombatState;
+
+ /* Montage for reloading the weapon */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Combat, meta = (AllowPrivateAccess = true))
+ UAnimMontage* ReloadMontage;
+
public:
/* Returns CameraBoom SubObject */
FORCEINLINE USpringArmComponent* GetCameraBoom() const { return CameraBoom; }
@@ -249,4 +338,8 @@ public:
/* Adds/Subtracts to/from OverlappedItemCount and updates bShouldTraceForItems */
void IncrementOverlappedItemCount(int8 Amount);
+
+ FVector GetCameraInterpLocation();
+
+ void GetPickupItem(AItem* Item);
};
diff --git a/Source/Shooter/ShooterPlayerController.cpp b/Source/Shooter/ShooterPlayerController.cpp
new file mode 100644
index 00000000..b3b6a4d6
--- /dev/null
+++ b/Source/Shooter/ShooterPlayerController.cpp
@@ -0,0 +1,27 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+
+#include "ShooterPlayerController.h"
+
+#include "Blueprint/UserWidget.h"
+
+AShooterPlayerController::AShooterPlayerController()
+{
+}
+
+void AShooterPlayerController::BeginPlay()
+{
+ Super::BeginPlay();
+
+ // Check our HUD Overlay TSubclassOf variable
+ if (HUDOverlayClass)
+ {
+ HUDOverlay = CreateWidget(this, HUDOverlayClass);
+
+ if (HUDOverlay)
+ {
+ HUDOverlay->AddToViewport();
+ HUDOverlay->SetVisibility(ESlateVisibility::Visible);
+ }
+ }
+}
diff --git a/Source/Shooter/ShooterPlayerController.h b/Source/Shooter/ShooterPlayerController.h
new file mode 100644
index 00000000..3ef5fa24
--- /dev/null
+++ b/Source/Shooter/ShooterPlayerController.h
@@ -0,0 +1,33 @@
+// Fill out your copyright notice in the Description page of Project Settings.
+
+#pragma once
+
+#include "CoreMinimal.h"
+#include "GameFramework/PlayerController.h"
+#include "ShooterPlayerController.generated.h"
+
+class UUserWidget;
+
+/**
+ *
+ */
+UCLASS()
+class SHOOTER_API AShooterPlayerController : public APlayerController
+{
+ GENERATED_BODY()
+public:
+ AShooterPlayerController();
+
+protected:
+ virtual void BeginPlay() override;
+
+private:
+
+ /** Reference to the overall HUD Overlay Blueprint class */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = Widgets, meta = (AllowPrivateAccess = "true"))
+ TSubclassOf HUDOverlayClass;
+
+ /** Variable to hold the HUD Overlay Widget after creating it */
+ UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Widgets, meta = (AllowPrivateAccess = "true"))
+ UUserWidget* HUDOverlay;
+};
diff --git a/Source/Shooter/Weapon.cpp b/Source/Shooter/Weapon.cpp
index 5fc34e0e..6f54f7db 100644
--- a/Source/Shooter/Weapon.cpp
+++ b/Source/Shooter/Weapon.cpp
@@ -3,3 +3,69 @@
#include "Weapon.h"
+AWeapon::AWeapon() :
+ ThrowWeaponTime(0.7f),
+ bFalling(false),
+ Ammo(30),
+ MagazineCapacity(30),
+ WeaponType(EWeaponType::EWT_SubmachineGun),
+ AmmoType(EAmmoType::EAT_9mm),
+ ReloadMontageSection(FName(TEXT("Reload SMG")))
+{
+ PrimaryActorTick.bCanEverTick = true;
+}
+
+void AWeapon::Tick(float DeltaTime)
+{
+ Super::Tick(DeltaTime);
+
+ /* Keep it upright */
+ if (GetItemState() == EItemState::EIS_Falling && bFalling)
+ {
+ FRotator MeshRotation{ 0.f, GetItemMesh()->GetComponentRotation().Yaw, 0.f };
+ GetItemMesh()->SetWorldRotation(MeshRotation, false,
+ nullptr, ETeleportType::TeleportPhysics);
+ }
+}
+
+void AWeapon::ThrowWeapon()
+{
+ FRotator MeshRotation{ 0.f, GetItemMesh()->GetComponentRotation().Yaw, 0.f };
+ GetItemMesh()->SetWorldRotation(MeshRotation, false,
+ nullptr, ETeleportType::TeleportPhysics);
+
+ const FVector MeshForward{ GetItemMesh()->GetForwardVector() };
+ const FVector MeshRight{ GetItemMesh()->GetRightVector() };
+
+ // Direction in which we throw the weapon
+ FVector ImpulseDirection = MeshRight.RotateAngleAxis(-20.f, MeshForward);
+
+ float RandomRotation{ 30.f };
+ ImpulseDirection = ImpulseDirection.RotateAngleAxis(RandomRotation, FVector(0.f, 0.f, 1.f));
+ ImpulseDirection *= 20000.f;
+ GetItemMesh()->AddImpulse(ImpulseDirection);
+
+ bFalling = true;
+ GetWorldTimerManager().SetTimer(ThrowWeaponTimer, this,
+ &AWeapon::StopFalling, ThrowWeaponTime);
+}
+
+void AWeapon::DecrementAmmo()
+{
+ if (Ammo - 1 <= 0)
+ Ammo = 0;
+ else
+ --Ammo;
+}
+
+void AWeapon::ReloadAmmo(int32 Amount)
+{
+ checkf(Ammo + Amount <= MagazineCapacity, TEXT("Attempted to reload with more than the magazine capacity!"))
+ Ammo += Amount;
+}
+
+void AWeapon::StopFalling()
+{
+ bFalling = false;
+ SetItemState(EItemState::EIS_Pickup);
+}
diff --git a/Source/Shooter/Weapon.h b/Source/Shooter/Weapon.h
index d5d6bea9..33c4daed 100644
--- a/Source/Shooter/Weapon.h
+++ b/Source/Shooter/Weapon.h
@@ -4,8 +4,21 @@
#include "CoreMinimal.h"
#include "Item.h"
+
+#include "AmmoType.h"
+
#include "Weapon.generated.h"
+
+UENUM(BlueprintType)
+enum class EWeaponType: uint8
+{
+ EWT_SubmachineGun UMETA(DisplayName = "SubmachineGun"),
+ EWT_AssaultRifle UMETA(DisplayName = "AssaultRifle"),
+
+ EWT_MAX UMETA(DisplayName = "DefaultMax"),
+};
+
/**
*
*/
@@ -13,5 +26,52 @@ UCLASS()
class SHOOTER_API AWeapon : public AItem
{
GENERATED_BODY()
+
+public:
+ AWeapon();
+
+ virtual void Tick(float DeltaTime) override;
+
+protected:
+ void StopFalling();
+
+private:
+ FTimerHandle ThrowWeaponTimer;
+ float ThrowWeaponTime;
+ bool bFalling;
+
+ /** Ammo count for this weapon */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
+ int32 Ammo;
+ /** Max ammo that our weapon can hold */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
+ int32 MagazineCapacity;
+
+ /** Type of weapon */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
+ EWeaponType WeaponType;
+
+ /** Type of ammo for this weapon */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
+ EAmmoType AmmoType;
+
+ /** FName for the reload montage section */
+ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Weapon Properties", meta = (AllowPrivateAccess = "true"))
+ FName ReloadMontageSection;
+public:
+ /** Adds an impulse to the weapon */
+ void ThrowWeapon();
+
+ FORCEINLINE int32 GetAmmo() const { return Ammo; }
+
+ /** Called from Character class when firing weapon */
+ void DecrementAmmo();
+
+ FORCEINLINE EWeaponType GetWeaponType() const { return WeaponType; }
+ FORCEINLINE EAmmoType GetAmmoType() const { return AmmoType; }
+ FORCEINLINE int32 GetMagazineCapacity() const { return MagazineCapacity; }
+ FORCEINLINE FName GetReloadMontageSection() const { return ReloadMontageSection; }
+
+ void ReloadAmmo(int32 Amount);
};
diff --git a/Source/ShooterEditor.Target.cs b/Source/ShooterEditor.Target.cs
index 465a008d..d89da5f3 100644
--- a/Source/ShooterEditor.Target.cs
+++ b/Source/ShooterEditor.Target.cs
@@ -9,6 +9,7 @@ public class ShooterEditorTarget : TargetRules
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
- ExtraModuleNames.AddRange( new string[] { "Shooter" } );
+ IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
+ ExtraModuleNames.AddRange( new string[] { "Shooter" } );
}
}