commit 26bde15faad3b7b987c518a9c1946e58e4bd2177 Author: y1lm0z Date: Sun Aug 2 22:34:52 2026 +0300 İlk yürütme diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f4334a5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +Binaries +DerivedDataCache +Intermediate +Saved +.vscode +.vs +*.VC.db +*.opensdf +*.opendb +*.sdf +*.sln +*.suo +*.xcodeproj +*.xcworkspace \ No newline at end of file diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini new file mode 100644 index 0000000..58552fa --- /dev/null +++ b/Config/DefaultEditor.ini @@ -0,0 +1,8 @@ +[UnrealEd.SimpleMap] +SimpleMapName=/Game/FirstPerson/Maps/FirstPersonExampleMap + +[EditoronlyBP] +bAllowClassAndBlueprintPinMatching=true +bReplaceBlueprintWithClass= true +bDontLoadBlueprintOutsideEditor= true +bBlueprintIsNotBlueprintType= true \ No newline at end of file diff --git a/Config/DefaultEditorPerProjectUserSettings.ini b/Config/DefaultEditorPerProjectUserSettings.ini new file mode 100644 index 0000000..220a551 --- /dev/null +++ b/Config/DefaultEditorPerProjectUserSettings.ini @@ -0,0 +1,2 @@ +[ContentBrowser] +ContentBrowserTab1.SelectedPaths=/Game/FirstPerson \ No newline at end of file diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini new file mode 100644 index 0000000..4329a3e --- /dev/null +++ b/Config/DefaultEngine.ini @@ -0,0 +1,271 @@ +[/Script/Engine.CollisionProfile] ++Profiles=(Name="Projectile",CollisionEnabled=QueryOnly,ObjectTypeName="Projectile",CustomResponses=,HelpMessage="Preset for projectiles",bCanModify=True) ++DefaultChannelResponses=(Channel=ECC_GameTraceChannel1,Name="Projectile",DefaultResponse=ECR_Block,bTraceType=False,bStaticObject=False) ++EditProfiles=(Name="Trigger",CustomResponses=((Channel=Projectile, Response=ECR_Ignore))) + +[/Script/EngineSettings.GameMapsSettings] +EditorStartupMap=/Game/FirstPerson/Lvl_FirstPerson.Lvl_FirstPerson +LocalMapOptions= +TransitionMap= +bUseSplitscreen=True +TwoPlayerSplitscreenLayout=Horizontal +ThreePlayerSplitscreenLayout=FavorTop +GameInstanceClass=/Script/Engine.GameInstance +GameDefaultMap=/Game/FirstPerson/Lvl_FirstPerson.Lvl_FirstPerson +ServerDefaultMap=/Engine/Maps/Entry +GlobalDefaultGameMode=/Game/FirstPerson/Blueprints/BP_FirstPersonGameMode.BP_FirstPersonGameMode_C +GlobalDefaultServerGameMode=None + +[/Script/Engine.RendererSettings] +r.Mobile.ShadingPath=0 +r.Mobile.AllowDeferredShadingOpenGL=False +r.Mobile.SupportGPUScene=True +r.Mobile.AntiAliasing=1 +r.Mobile.FloatPrecisionMode=0 +r.Mobile.AllowDitheredLODTransition=False +r.Mobile.VirtualTextures=False +r.DiscardUnusedQuality=False +r.AllowOcclusionQueries=True +r.MinScreenRadiusForLights=0.030000 +r.MinScreenRadiusForDepthPrepass=0.030000 +r.PrecomputedVisibilityWarning=False +r.TextureStreaming=True +Compat.UseDXT5NormalMaps=False +r.VirtualTextures=True +r.VirtualTexturedLightmaps=False +r.VT.TileSize=128 +r.VT.TileBorderSize=4 +r.VT.AnisotropicFiltering=False +r.VT.EnableAutoImport=False +bEnableVirtualTextureOpacityMask=False +r.MeshPaintVirtualTexture.Support=True +r.MeshPaintVirtualTexture.TileSize=32 +r.MeshPaintVirtualTexture.TileBorderSize=2 +r.MeshPaintVirtualTexture.UseCompression=True +r.StaticMesh.DefaultMeshPaintTextureSupport=True +r.MeshPaintVirtualTexture.DefaultTexelsPerVertex=4 +r.MeshPaintVirtualTexture.MaxTextureSize=4096 +r.vt.rvt.EnableBaseColor=True +r.vt.rvt.EnableBaseColorRoughness=True +r.vt.rvt.EnableBaseColorSpecular=True +r.vt.rvt.EnableMask4=True +r.vt.rvt.EnableWorldHeight=True +r.vt.rvt.EnableDisplacement=True +r.vt.rvt.HighQualityPerPixelHeight=True +WorkingColorSpaceChoice=sRGB +RedChromaticityCoordinate=(X=0.640000,Y=0.330000) +GreenChromaticityCoordinate=(X=0.300000,Y=0.600000) +BlueChromaticityCoordinate=(X=0.150000,Y=0.060000) +WhiteChromaticityCoordinate=(X=0.312700,Y=0.329000) +r.LegacyLuminanceFactors=False +r.ClearCoatNormal=False +r.DynamicGlobalIlluminationMethod=1 +r.ReflectionMethod=1 +r.ReflectionCaptureResolution=128 +r.ReflectionEnvironmentLightmapMixBasedOnRoughness=True +r.Lumen.HardwareRayTracing=True +r.Lumen.HardwareRayTracing.LightingMode=0 +r.Lumen.TranslucencyReflections.FrontLayer.EnableForProject=False +r.Lumen.TraceMeshSDFs=0 +r.Lumen.ScreenTracingSource=0 +r.Lumen.Reflections.HardwareRayTracing.Translucent.Refraction.EnableForProject=True +r.MegaLights.EnableForProject=False +r.RayTracing.Shadows=False +r.Shadow.Virtual.Enable=1 +r.RayTracing=True +r.RayTracing.RayTracingProxies.ProjectEnabled=True +r.RayTracing.UseTextureLod=False +r.PathTracing=True +r.GenerateMeshDistanceFields=True +r.DistanceFields.DefaultVoxelDensity=0.200000 +r.Nanite.ProjectEnabled=True +r.AllowStaticLighting=False +r.NormalMapsForStaticLighting=False +r.ForwardShading=False +r.VertexFoggingForOpaque=True +r.SeparateTranslucency=True +r.TranslucentSortPolicy=0 +TranslucentSortAxis=(X=0.000000,Y=-1.000000,Z=0.000000) +r.LocalFogVolume.ApplyOnTranslucent=False +xr.VRS.FoveationLevel=0 +xr.VRS.DynamicFoveation=False +r.CustomDepth=1 +r.CustomDepthTemporalAAJitter=True +r.PostProcessing.PropagateAlpha=False +r.Deferred.SupportPrimitiveAlphaHoldout=False +r.DefaultFeature.Bloom=True +r.DefaultFeature.AmbientOcclusion=True +r.DefaultFeature.AmbientOcclusionStaticFraction=True +r.DefaultFeature.AutoExposure=False +r.DefaultFeature.AutoExposure.Method=0 +r.DefaultFeature.AutoExposure.Bias=1.000000 +r.DefaultFeature.AutoExposure.ExtendDefaultLuminanceRange=True +r.DefaultFeature.LocalExposure.HighlightContrastScale=0.800000 +r.DefaultFeature.LocalExposure.ShadowContrastScale=0.800000 +r.DefaultFeature.MotionBlur=False +r.DefaultFeature.LensFlare=False +r.TemporalAA.Upsampling=True +r.AntiAliasingMethod=0 +r.MSAACount=4 +r.DefaultFeature.LightUnits=1 +r.DefaultBackBufferPixelFormat=4 +r.ScreenPercentage.Default=100.000000 +r.ScreenPercentage.Default.Desktop.Mode=1 +r.ScreenPercentage.Default.Mobile.Mode=0 +r.ScreenPercentage.Default.VR.Mode=0 +r.ScreenPercentage.Default.PathTracer.Mode=0 +r.Shadow.UnbuiltPreviewInGame=True +r.StencilForLODDither=False +r.EarlyZPass=3 +r.EarlyZPassOnlyMaterialMasking=False +r.Shadow.CSMCaching=False +r.DBuffer=True +r.ClearSceneMethod=1 +r.VelocityOutputPass=0 +r.Velocity.EnableVertexDeformation=2 +r.SelectiveBasePassOutputs=False +bDefaultParticleCutouts=False +fx.GPUSimulationTextureSizeX=1024 +fx.GPUSimulationTextureSizeY=1024 +r.AllowGlobalClipPlane=False +r.GBufferFormat=1 +r.MorphTarget.Mode=True +r.MorphTarget.MaxBlendWeight=5.000000 +r.SupportSkyAtmosphere=True +r.SupportSkyAtmosphereAffectsHeightFog=True +r.SupportExpFogMatchesVolumetricFog=False +r.SupportLocalFogVolumes=True +r.SupportCloudShadowOnForwardLitTranslucent=False +r.LightFunctionAtlas.Format=0 +r.VolumetricFog.LightFunction=True +r.Deferred.UsesLightFunctionAtlas=True +r.SingleLayerWater.UsesLightFunctionAtlas=False +r.Translucent.UsesLightFunctionAtlas=False +r.Translucent.UsesIESProfiles=False +r.Translucent.UsesRectLights=False +r.Translucent.UsesShadowedLocalLights=False +r.GPUCrashDebugging=False +vr.InstancedStereo=False +r.MobileHDR=True +vr.MobileMultiView=False +r.Mobile.UseHWsRGBEncoding=False +vr.RoundRobinOcclusion=False +r.MeshStreaming=False +r.HeterogeneousVolumes=True +r.HeterogeneousVolumes.Shadows=False +r.Translucency.HeterogeneousVolumes=False +r.WireframeCullThreshold=5.000000 +r.SupportStationarySkylight=True +r.SupportLowQualityLightmaps=True +r.SupportPointLightWholeSceneShadows=True +r.Shadow.TranslucentPerObject.ProjectEnabled=False +r.Water.SingleLayerWater.SupportCloudShadow=False +r.Substrate=False +r.Substrate.OpaqueMaterialRoughRefraction=False +r.Refraction.Blur=True +r.Substrate.Debug.AdvancedVisualizationShaders=False +r.Substrate.EnableLayerSupport=False +r.Material.RoughDiffuse=False +r.Material.EnergyConservation=False +r.Material.DefaultAutoMaterialUsage=True +r.OIT.SortedPixels=False +r.HairStrands.LODMode=True +r.SkinCache.CompileShaders=True +r.VRS.Support=True +r.SkinCache.SkipCompilingGPUSkinVF=False +r.SkinCache.DefaultBehavior=1 +r.SkinCache.SceneMemoryLimitInMB=128.000000 +r.Mobile.EnableStaticAndCSMShadowReceivers=True +r.Mobile.EnableMovableLightCSMShaderCulling=True +r.Mobile.Forward.EnableLocalLights=1 +r.Mobile.Forward.EnableClusteredReflections=False +r.Mobile.AllowDistanceFieldShadows=True +r.Mobile.EnableMovableSpotlightsShadow=False +r.GPUSkin.Support16BitBoneIndex=False +r.GPUSkin.Limit2BoneInfluences=False +r.SupportDepthOnlyIndexBuffers=False +r.SupportReversedIndexBuffers=False +r.Mobile.AmbientOcclusion=False +r.Mobile.DBuffer=False +r.GPUSkin.UnlimitedBoneInfluences=False +r.GPUSkin.AlwaysUseDeformerForUnlimitedBoneInfluences=False +r.GPUSkin.UnlimitedBoneInfluencesThreshold=8 +DefaultBoneInfluenceLimit=(Default=0,PerPlatform=()) +MaxSkinBones=(Default=65536,PerPlatform=(("Mobile", 256))) +r.Mobile.ScreenSpaceReflections=False +r.Mobile.SupportsGen4TAA=True +bStreamSkeletalMeshLODs=(Default=False,PerPlatform=()) +bDiscardSkeletalMeshOptionalLODs=(Default=False,PerPlatform=()) +VisualizeCalibrationColorMaterialPath=/Engine/EngineMaterials/PPM_DefaultCalibrationColor.PPM_DefaultCalibrationColor +VisualizeCalibrationCustomMaterialPath=None +VisualizeCalibrationGrayscaleMaterialPath=/Engine/EngineMaterials/PPM_DefaultCalibrationGrayscale.PPM_DefaultCalibrationGrayscale + +[/Script/WindowsTargetPlatform.WindowsTargetSettings] +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 +-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/LinuxTargetPlatform.LinuxTargetSettings] +-TargetedRHIs=SF_VULKAN_SM5 ++TargetedRHIs=SF_VULKAN_SM6 + +[/Script/AIModule.AISystem] +bForgetStaleActors=True + +[/Script/Engine.Engine] +NearClipPlane=5.000000 + + ++ActiveGameNameRedirects=(OldGameName="TP_FirstPerson",NewGameName="/Script/first") ++ActiveGameNameRedirects=(OldGameName="/Script/TP_FirstPerson",NewGameName="/Script/first") + ++ActiveClassRedirects=(OldClassName="TP_FirstPersonPlayerController",NewClassName="firstPlayerController") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonCameraManager",NewClassName="firstCameraManager") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonGameMode",NewClassName="firstGameMode") ++ActiveClassRedirects=(OldClassName="TP_FirstPersonCharacter",NewClassName="firstCharacter") + +[/Script/HardwareTargeting.HardwareTargetingSettings] +TargetedHardwareClass=Desktop +AppliedTargetedHardwareClass=Desktop +DefaultGraphicsPerformance=Scalable +AppliedDefaultGraphicsPerformance=Scalable + +[/Script/AndroidFileServerEditor.AndroidFileServerRuntimeSettings] +bEnablePlugin=True +bAllowNetworkConnection=True +SecurityToken=859F83A8FEAE4005A01A3D057DC4BE8C +bIncludeInShipping=False +bAllowExternalStartInShipping=False +bCompileAFSProject=False +bUseCompression=False +bLogFiles=False +bReportStats=False +ConnectionType=USBOnly +bUseManualIPAddress=False +ManualIPAddress= + diff --git a/Config/DefaultGame.ini b/Config/DefaultGame.ini new file mode 100644 index 0000000..f0a02c5 --- /dev/null +++ b/Config/DefaultGame.ini @@ -0,0 +1,6 @@ +[ProjectSettings] +ProjectID=(A=1823396784,B=1298598689,C=1743498150,D=-2048051708) +ProjectName=First Person Template + +[/Script/EngineSettings.GeneralProjectSettings] +ProjectID=91B3470713C043B5A106E733C70F407D diff --git a/Config/DefaultInput.ini b/Config/DefaultInput.ini new file mode 100644 index 0000000..0d0b0e5 --- /dev/null +++ b/Config/DefaultInput.ini @@ -0,0 +1,109 @@ +[/Script/Engine.InputSettings] +-AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.25,Exponent=1.f,Sensitivity=1.f)) +-AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) +-AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.f,Exponent=1.f,Sensitivity=0.07f)) ++AxisConfig=(AxisKeyName="Mouse2D",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightX",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightY",AxisProperties=(DeadZone=0.250000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseX",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseY",AxisProperties=(DeadZone=0.000000,Sensitivity=0.070000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MouseWheelAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_LeftTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_RightTriggerAxis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Gamepad_Special_Left_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="Vive_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="MixedReality_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Left_Trackpad_Touch",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Grip_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trigger_Axis",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Thumbstick_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_X",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Y",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="ValveIndex_Right_Trackpad_Force",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Left_ThumbRest",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Thumbstick",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton1",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_Trigger",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_FaceButton2",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_IndexPointing",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbUp",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusTouch_Right_ThumbRest",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_ThumbPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_IndexPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_MiddlePinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_RingPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Left_PinkPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_ThumbPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_IndexPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_MiddlePinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_RingPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) ++AxisConfig=(AxisKeyName="OculusHand_Right_PinkPinchStrength",AxisProperties=(DeadZone=0.000000,Sensitivity=1.000000,Exponent=1.000000,bInvert=False)) +bAltEnterTogglesFullscreen=True +bF11TogglesFullscreen=True +bUseMouseForTouch=False +bEnableMouseSmoothing=True +bEnableFOVScaling=True +bCaptureMouseOnLaunch=True +bEnableLegacyInputScales=True +bEnableMotionControls=True +bFilterInputByPlatformUser=False +bShouldFlushPressedKeysOnViewportFocusLost=True +bAlwaysShowTouchInterface=False +bShowConsoleOnFourFingerTap=True +bEnableGestureRecognizer=False +bUseAutocorrect=False +DefaultViewportMouseCaptureMode=CapturePermanently_IncludingInitialMouseDown +DefaultViewportMouseLockMode=LockOnCapture +FOVScale=0.011110 +DoubleClickTime=0.200000 +DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput +DefaultInputComponentClass=/Script/EnhancedInput.EnhancedInputComponent +DefaultTouchInterface=/Game/FirstPerson/Input/MobileControls.MobileControls +-ConsoleKeys=Tilde ++ConsoleKeys=Tilde + diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Back_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Back_01.uasset new file mode 100644 index 0000000..917cff8 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Death/MM_Death_Back_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_01.uasset new file mode 100644 index 0000000..ccfd8a9 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_02.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_02.uasset new file mode 100644 index 0000000..a5ccfc5 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_02.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_03.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_03.uasset new file mode 100644 index 0000000..d31ec0f Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Death/MM_Death_Front_03.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Left_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Left_01.uasset new file mode 100644 index 0000000..2ad429e Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Death/MM_Death_Left_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Death/MM_Death_Right_01.uasset b/Content/Characters/Mannequins/Anims/Death/MM_Death_Right_01.uasset new file mode 100644 index 0000000..bce3365 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Death/MM_Death_Right_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/AO_Pistol.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/AO_Pistol.uasset new file mode 100644 index 0000000..cc21f78 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Aim/AO_Pistol.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS1.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS1.uasset new file mode 100644 index 0000000..09c54fa Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS1.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CD.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CD.uasset new file mode 100644 index 0000000..94e36c7 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CD.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CU.uasset b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CU.uasset new file mode 100644 index 0000000..f8cd07f Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Aim/MF_Pistol_Idle_ADS_AO_CU.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd.uasset new file mode 100644 index 0000000..c5bc3a0 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Left.uasset new file mode 100644 index 0000000..1c0d6a0 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Right.uasset new file mode 100644 index 0000000..e934901 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Bwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd.uasset new file mode 100644 index 0000000..cc14f22 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Left.uasset new file mode 100644 index 0000000..955f71d Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Right.uasset new file mode 100644 index 0000000..bcd6de6 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Fwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Left.uasset new file mode 100644 index 0000000..d5f15aa Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Right.uasset new file mode 100644 index 0000000..e98c2d4 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jog/MF_Pistol_Jog_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Fall_Loop.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Fall_Loop.uasset new file mode 100644 index 0000000..7ca0d7c Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Fall_Loop.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_RecoveryAdditive.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_RecoveryAdditive.uasset new file mode 100644 index 0000000..9903187 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_RecoveryAdditive.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Start.uasset b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Start.uasset new file mode 100644 index 0000000..2e47a86 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Jump/MM_Pistol_Jump_Start.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/MF_Pistol_Idle_ADS.uasset b/Content/Characters/Mannequins/Anims/Pistol/MF_Pistol_Idle_ADS.uasset new file mode 100644 index 0000000..5829066 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/MF_Pistol_Idle_ADS.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_DryFire.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_DryFire.uasset new file mode 100644 index 0000000..d04d2f5 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_DryFire.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Equip.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Equip.uasset new file mode 100644 index 0000000..3c416f2 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Equip.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire.uasset new file mode 100644 index 0000000..7120917 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire_Montage.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire_Montage.uasset new file mode 100644 index 0000000..75d7c8c Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Fire_Montage.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Reload.uasset b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Reload.uasset new file mode 100644 index 0000000..077674e Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/MM_Pistol_Reload.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd.uasset new file mode 100644 index 0000000..2cd3e66 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Left.uasset new file mode 100644 index 0000000..eb16ba5 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Right.uasset new file mode 100644 index 0000000..c0e647d Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Bwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd.uasset new file mode 100644 index 0000000..dee4cde Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Left.uasset new file mode 100644 index 0000000..06eee3a Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Right.uasset new file mode 100644 index 0000000..2ff4293 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Fwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Left.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Left.uasset new file mode 100644 index 0000000..c277b2c Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Right.uasset b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Right.uasset new file mode 100644 index 0000000..885473d Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Pistol/Walk/MF_Pistol_Walk_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/AO_Rifle.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/AO_Rifle.uasset new file mode 100644 index 0000000..1b85a18 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/AIM/AO_Rifle.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CC.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CC.uasset new file mode 100644 index 0000000..95292ac Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CC.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CD.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CD.uasset new file mode 100644 index 0000000..c5c06f9 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CD.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CU.uasset b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CU.uasset new file mode 100644 index 0000000..eb8a080 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/AIM/MM_Rifle_Idle_ADS_AO_CU.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset new file mode 100644 index 0000000..74eb352 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Back_Med_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset new file mode 100644 index 0000000..396e9f3 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Hvy_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset new file mode 100644 index 0000000..a6846ff Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset new file mode 100644 index 0000000..d0bef37 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_02.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset new file mode 100644 index 0000000..dca4bc6 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_03.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset new file mode 100644 index 0000000..d134adb Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Lgt_04.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset new file mode 100644 index 0000000..70302cf Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset new file mode 100644 index 0000000..fe6d7d6 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/HitReact/MM_HitReact_Front_Med_02.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd.uasset new file mode 100644 index 0000000..cc1c3a2 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Left.uasset new file mode 100644 index 0000000..23a8ebe Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Right.uasset new file mode 100644 index 0000000..2cd5292 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Bwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd.uasset new file mode 100644 index 0000000..0cc1859 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Left.uasset new file mode 100644 index 0000000..6aa7b51 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Right.uasset new file mode 100644 index 0000000..924600c Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Fwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Left.uasset new file mode 100644 index 0000000..edbb191 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Right.uasset new file mode 100644 index 0000000..84e67fd Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jog/MF_Rifle_Jog_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Apex.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Apex.uasset new file mode 100644 index 0000000..858c4c5 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Apex.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Land.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Land.uasset new file mode 100644 index 0000000..b411ecc Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Land.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Loop.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Loop.uasset new file mode 100644 index 0000000..826ae53 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Fall_Loop.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_RecoveryAdditive.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_RecoveryAdditive.uasset new file mode 100644 index 0000000..9baadd3 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_RecoveryAdditive.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start.uasset new file mode 100644 index 0000000..513b51e Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start_Loop.uasset b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start_Loop.uasset new file mode 100644 index 0000000..fc1774b Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Jump/MM_Rifle_Jump_Start_Loop.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/MF_Rifle_Idle_ADS.uasset b/Content/Characters/Mannequins/Anims/Rifle/MF_Rifle_Idle_ADS.uasset new file mode 100644 index 0000000..f569392 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/MF_Rifle_Idle_ADS.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_DryFire.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_DryFire.uasset new file mode 100644 index 0000000..8db0457 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_DryFire.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Equip.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Equip.uasset new file mode 100644 index 0000000..faf20c7 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Equip.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Fire.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Fire.uasset new file mode 100644 index 0000000..3120009 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Fire.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Reload.uasset b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Reload.uasset new file mode 100644 index 0000000..ebee502 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/MM_Rifle_Reload.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd.uasset new file mode 100644 index 0000000..29f95fd Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Left.uasset new file mode 100644 index 0000000..86ed9ac Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Right.uasset new file mode 100644 index 0000000..aed754e Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Bwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd.uasset new file mode 100644 index 0000000..18f0501 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Left.uasset new file mode 100644 index 0000000..9ec1dc5 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Right.uasset new file mode 100644 index 0000000..de08560 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Fwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Left.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Left.uasset new file mode 100644 index 0000000..e421d11 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Right.uasset b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Right.uasset new file mode 100644 index 0000000..f324682 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Rifle/Walk/MF_Rifle_Walk_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset b/Content/Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset new file mode 100644 index 0000000..0ac838a Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/ABP_Unarmed.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_01.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_01.uasset new file mode 100644 index 0000000..58bd156 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_01.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_02.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_02.uasset new file mode 100644 index 0000000..ec5f1e3 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_02.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_03.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_03.uasset new file mode 100644 index 0000000..88efb9a Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_Attack_03.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_ChargedAttack.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_ChargedAttack.uasset new file mode 100644 index 0000000..a6dc463 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Attack/MM_ChargedAttack.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/BS_Idle_Walk_Run.uasset b/Content/Characters/Mannequins/Anims/Unarmed/BS_Idle_Walk_Run.uasset new file mode 100644 index 0000000..de46f07 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/BS_Idle_Walk_Run.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd.uasset new file mode 100644 index 0000000..21c9a0f Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Left.uasset new file mode 100644 index 0000000..34a4c9d Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Right.uasset new file mode 100644 index 0000000..c0c75e5 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Bwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd.uasset new file mode 100644 index 0000000..0a5fa59 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Left.uasset new file mode 100644 index 0000000..c6c5368 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Right.uasset new file mode 100644 index 0000000..112223b Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Fwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Left.uasset new file mode 100644 index 0000000..f9fe418 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Right.uasset new file mode 100644 index 0000000..e455a2e Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jog/MF_Unarmed_Jog_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Dash.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Dash.uasset new file mode 100644 index 0000000..69df391 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Dash.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Fall_Loop.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Fall_Loop.uasset new file mode 100644 index 0000000..86c58a1 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Fall_Loop.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Jump.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Jump.uasset new file mode 100644 index 0000000..5229aa9 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Jump.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Land.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Land.uasset new file mode 100644 index 0000000..9560d54 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_Land.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_WallJump.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_WallJump.uasset new file mode 100644 index 0000000..73a2af9 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Jump/MM_WallJump.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/MM_Idle.uasset b/Content/Characters/Mannequins/Anims/Unarmed/MM_Idle.uasset new file mode 100644 index 0000000..0f10045 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/MM_Idle.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd.uasset new file mode 100644 index 0000000..03db74a Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Left.uasset new file mode 100644 index 0000000..f7b1a96 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Right.uasset new file mode 100644 index 0000000..3a03801 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Bwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd.uasset new file mode 100644 index 0000000..d780a3a Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Left.uasset new file mode 100644 index 0000000..331e673 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Right.uasset new file mode 100644 index 0000000..b715bbe Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Fwd_Right.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Left.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Left.uasset new file mode 100644 index 0000000..5b5f188 Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Left.uasset differ diff --git a/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Right.uasset b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Right.uasset new file mode 100644 index 0000000..6d0ba3f Binary files /dev/null and b/Content/Characters/Mannequins/Anims/Unarmed/Walk/MF_Unarmed_Walk_Right.uasset differ diff --git a/Content/Characters/Mannequins/Materials/M_Mannequin.uasset b/Content/Characters/Mannequins/Materials/M_Mannequin.uasset new file mode 100644 index 0000000..0ffbe5c Binary files /dev/null and b/Content/Characters/Mannequins/Materials/M_Mannequin.uasset differ diff --git a/Content/Characters/Mannequins/Materials/Manny/MI_Manny_01_New.uasset b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_01_New.uasset new file mode 100644 index 0000000..2e7353f Binary files /dev/null and b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_01_New.uasset differ diff --git a/Content/Characters/Mannequins/Materials/Manny/MI_Manny_02_New.uasset b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_02_New.uasset new file mode 100644 index 0000000..035e15d Binary files /dev/null and b/Content/Characters/Mannequins/Materials/Manny/MI_Manny_02_New.uasset differ diff --git a/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_01.uasset b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_01.uasset new file mode 100644 index 0000000..b2d7eec Binary files /dev/null and b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_01.uasset differ diff --git a/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_02.uasset b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_02.uasset new file mode 100644 index 0000000..74bbb66 Binary files /dev/null and b/Content/Characters/Mannequins/Materials/Quinn/MI_Quinn_02.uasset differ diff --git a/Content/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset b/Content/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset new file mode 100644 index 0000000..c82202e Binary files /dev/null and b/Content/Characters/Mannequins/Meshes/SKM_Manny_Simple.uasset differ diff --git a/Content/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset b/Content/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset new file mode 100644 index 0000000..df9c636 Binary files /dev/null and b/Content/Characters/Mannequins/Meshes/SKM_Quinn_Simple.uasset differ diff --git a/Content/Characters/Mannequins/Meshes/SK_Mannequin.uasset b/Content/Characters/Mannequins/Meshes/SK_Mannequin.uasset new file mode 100644 index 0000000..60f16f0 Binary files /dev/null and b/Content/Characters/Mannequins/Meshes/SK_Mannequin.uasset differ diff --git a/Content/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset new file mode 100644 index 0000000..6032287 Binary files /dev/null and b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Body.uasset differ diff --git a/Content/Characters/Mannequins/Rigs/CR_Mannequin_FootIK.uasset b/Content/Characters/Mannequins/Rigs/CR_Mannequin_FootIK.uasset new file mode 100644 index 0000000..b4c4426 Binary files /dev/null and b/Content/Characters/Mannequins/Rigs/CR_Mannequin_FootIK.uasset differ diff --git a/Content/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset new file mode 100644 index 0000000..0b2c38d Binary files /dev/null and b/Content/Characters/Mannequins/Rigs/CR_Mannequin_Procedural.uasset differ diff --git a/Content/Characters/Mannequins/Rigs/PA_Mannequin.uasset b/Content/Characters/Mannequins/Rigs/PA_Mannequin.uasset new file mode 100644 index 0000000..3518d39 Binary files /dev/null and b/Content/Characters/Mannequins/Rigs/PA_Mannequin.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset new file mode 100644 index 0000000..2c4145b Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_BN.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset new file mode 100644 index 0000000..2e236b4 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_D.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_MRA.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_MRA.uasset new file mode 100644 index 0000000..faa8537 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_01_MRA.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset new file mode 100644 index 0000000..fbee995 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_BN.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset new file mode 100644 index 0000000..56262e6 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_D.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_MRA.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_MRA.uasset new file mode 100644 index 0000000..f2f4f83 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_MRA.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset new file mode 100644 index 0000000..e8e61da Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Manny/T_Manny_02_N.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_D.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_D.uasset new file mode 100644 index 0000000..d2e0ab2 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_D.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_MRA.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_MRA.uasset new file mode 100644 index 0000000..8244da9 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_MRA.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_N.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_N.uasset new file mode 100644 index 0000000..44bd3c8 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_01_N.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_D.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_D.uasset new file mode 100644 index 0000000..63bd3b7 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_D.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_MRA.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_MRA.uasset new file mode 100644 index 0000000..6c4a979 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_MRA.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_N.uasset b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_N.uasset new file mode 100644 index 0000000..3ba5513 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Quinn/T_Quinn_02_N.uasset differ diff --git a/Content/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset b/Content/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset new file mode 100644 index 0000000..1cc7ef6 Binary files /dev/null and b/Content/Characters/Mannequins/Textures/Shared/T_UE_Logo_M.uasset differ diff --git a/Content/FirstPerson/Anims/ABP_FP_Copy.uasset b/Content/FirstPerson/Anims/ABP_FP_Copy.uasset new file mode 100644 index 0000000..1a9b8f7 Binary files /dev/null and b/Content/FirstPerson/Anims/ABP_FP_Copy.uasset differ diff --git a/Content/FirstPerson/Anims/CtrlRig_FPWarp.uasset b/Content/FirstPerson/Anims/CtrlRig_FPWarp.uasset new file mode 100644 index 0000000..8a32d08 Binary files /dev/null and b/Content/FirstPerson/Anims/CtrlRig_FPWarp.uasset differ diff --git a/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset b/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset new file mode 100644 index 0000000..9e8efea Binary files /dev/null and b/Content/FirstPerson/Blueprints/BP_FirstPersonCharacter.uasset differ diff --git a/Content/FirstPerson/Blueprints/BP_FirstPersonGameMode.uasset b/Content/FirstPerson/Blueprints/BP_FirstPersonGameMode.uasset new file mode 100644 index 0000000..9493ba2 Binary files /dev/null and b/Content/FirstPerson/Blueprints/BP_FirstPersonGameMode.uasset differ diff --git a/Content/FirstPerson/Blueprints/BP_FirstPersonPlayerController.uasset b/Content/FirstPerson/Blueprints/BP_FirstPersonPlayerController.uasset new file mode 100644 index 0000000..3346007 Binary files /dev/null and b/Content/FirstPerson/Blueprints/BP_FirstPersonPlayerController.uasset differ diff --git a/Content/FirstPerson/Lvl_FirstPerson.umap b/Content/FirstPerson/Lvl_FirstPerson.umap new file mode 100644 index 0000000..b3153de Binary files /dev/null and b/Content/FirstPerson/Lvl_FirstPerson.umap differ diff --git a/Content/FirstPerson/MI_FirstPersonColorway.uasset b/Content/FirstPerson/MI_FirstPersonColorway.uasset new file mode 100644 index 0000000..0692429 Binary files /dev/null and b/Content/FirstPerson/MI_FirstPersonColorway.uasset differ diff --git a/Content/Input/Actions/IA_Jump.uasset b/Content/Input/Actions/IA_Jump.uasset new file mode 100644 index 0000000..49d209b Binary files /dev/null and b/Content/Input/Actions/IA_Jump.uasset differ diff --git a/Content/Input/Actions/IA_Look.uasset b/Content/Input/Actions/IA_Look.uasset new file mode 100644 index 0000000..d87d291 Binary files /dev/null and b/Content/Input/Actions/IA_Look.uasset differ diff --git a/Content/Input/Actions/IA_MouseLook.uasset b/Content/Input/Actions/IA_MouseLook.uasset new file mode 100644 index 0000000..6161fb0 Binary files /dev/null and b/Content/Input/Actions/IA_MouseLook.uasset differ diff --git a/Content/Input/Actions/IA_Move.uasset b/Content/Input/Actions/IA_Move.uasset new file mode 100644 index 0000000..892d571 Binary files /dev/null and b/Content/Input/Actions/IA_Move.uasset differ diff --git a/Content/Input/IMC_Default.uasset b/Content/Input/IMC_Default.uasset new file mode 100644 index 0000000..4dddf94 Binary files /dev/null and b/Content/Input/IMC_Default.uasset differ diff --git a/Content/Input/IMC_MouseLook.uasset b/Content/Input/IMC_MouseLook.uasset new file mode 100644 index 0000000..1216180 Binary files /dev/null and b/Content/Input/IMC_MouseLook.uasset differ diff --git a/Content/Input/Touch/BPI_TouchInterface.uasset b/Content/Input/Touch/BPI_TouchInterface.uasset new file mode 100644 index 0000000..f627245 Binary files /dev/null and b/Content/Input/Touch/BPI_TouchInterface.uasset differ diff --git a/Content/Input/Touch/UI_Thumbstick.uasset b/Content/Input/Touch/UI_Thumbstick.uasset new file mode 100644 index 0000000..f597a90 Binary files /dev/null and b/Content/Input/Touch/UI_Thumbstick.uasset differ diff --git a/Content/Input/Touch/UI_TouchSimple.uasset b/Content/Input/Touch/UI_TouchSimple.uasset new file mode 100644 index 0000000..3b6cb2b Binary files /dev/null and b/Content/Input/Touch/UI_TouchSimple.uasset differ diff --git a/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_Door.fbx b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_Door.fbx new file mode 100644 index 0000000..d8dcfc1 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_Door.fbx differ diff --git a/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_Door.uasset b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_Door.uasset new file mode 100644 index 0000000..7c8f76d Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_Door.uasset differ diff --git a/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Corner.fbx b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Corner.fbx new file mode 100644 index 0000000..6ed6ce9 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Corner.fbx differ diff --git a/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Corner.uasset b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Corner.uasset new file mode 100644 index 0000000..911036a Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Corner.uasset differ diff --git a/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Edge.uasset b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Edge.uasset new file mode 100644 index 0000000..f5453a5 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Edge.uasset differ diff --git a/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Strt.fbx b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Strt.fbx new file mode 100644 index 0000000..3e71cd5 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/Assets/Meshes/SM_DoorFrame_Strt.fbx differ diff --git a/Content/LevelPrototyping/Interactable/Door/BP_DoorFrame.uasset b/Content/LevelPrototyping/Interactable/Door/BP_DoorFrame.uasset new file mode 100644 index 0000000..b11ee72 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Door/BP_DoorFrame.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/MI_GlowNT.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/MI_GlowNT.uasset new file mode 100644 index 0000000..df55d5c Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/MI_GlowNT.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_GradientGlow.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_GradientGlow.uasset new file mode 100644 index 0000000..0db8b14 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_GradientGlow.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_SimpleGlow.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_SimpleGlow.uasset new file mode 100644 index 0000000..8b7eaba Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Materials/M_SimpleGlow.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.fbx b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.fbx new file mode 100644 index 0000000..453af1d Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.fbx differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.uasset new file mode 100644 index 0000000..4fe6d9a Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularBand.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.fbx b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.fbx new file mode 100644 index 0000000..f121c53 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.fbx differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.uasset new file mode 100644 index 0000000..86cecae Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/Meshes/SM_CircularGlow.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/Assets/NS_JumpPad.uasset b/Content/LevelPrototyping/Interactable/JumpPad/Assets/NS_JumpPad.uasset new file mode 100644 index 0000000..9981a30 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/Assets/NS_JumpPad.uasset differ diff --git a/Content/LevelPrototyping/Interactable/JumpPad/BP_JumpPad.uasset b/Content/LevelPrototyping/Interactable/JumpPad/BP_JumpPad.uasset new file mode 100644 index 0000000..6bcdcdb Binary files /dev/null and b/Content/LevelPrototyping/Interactable/JumpPad/BP_JumpPad.uasset differ diff --git a/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.fbx b/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.fbx new file mode 100644 index 0000000..47a3fbe Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.fbx differ diff --git a/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.uasset b/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.uasset new file mode 100644 index 0000000..f154a0e Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Target/Assets/SM_TargetBaseMesh.uasset differ diff --git a/Content/LevelPrototyping/Interactable/Target/BP_WobbleTarget.uasset b/Content/LevelPrototyping/Interactable/Target/BP_WobbleTarget.uasset new file mode 100644 index 0000000..c89f050 Binary files /dev/null and b/Content/LevelPrototyping/Interactable/Target/BP_WobbleTarget.uasset differ diff --git a/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset b/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset new file mode 100644 index 0000000..f3e6461 Binary files /dev/null and b/Content/LevelPrototyping/Materials/MF_ProcGrid.uasset differ diff --git a/Content/LevelPrototyping/Materials/MI_DefaultColorway.uasset b/Content/LevelPrototyping/Materials/MI_DefaultColorway.uasset new file mode 100644 index 0000000..76da848 Binary files /dev/null and b/Content/LevelPrototyping/Materials/MI_DefaultColorway.uasset differ diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset new file mode 100644 index 0000000..63a5bfa Binary files /dev/null and b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray.uasset differ diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset new file mode 100644 index 0000000..2accd35 Binary files /dev/null and b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_Gray_02.uasset differ diff --git a/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset new file mode 100644 index 0000000..bc39915 Binary files /dev/null and b/Content/LevelPrototyping/Materials/MI_PrototypeGrid_TopDark.uasset differ diff --git a/Content/LevelPrototyping/Materials/M_FlatCol.uasset b/Content/LevelPrototyping/Materials/M_FlatCol.uasset new file mode 100644 index 0000000..a182f0c Binary files /dev/null and b/Content/LevelPrototyping/Materials/M_FlatCol.uasset differ diff --git a/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset b/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset new file mode 100644 index 0000000..a998564 Binary files /dev/null and b/Content/LevelPrototyping/Materials/M_PrototypeGrid.uasset differ diff --git a/Content/LevelPrototyping/Meshes/SM_ChamferCube.fbx b/Content/LevelPrototyping/Meshes/SM_ChamferCube.fbx new file mode 100644 index 0000000..fb01d27 Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_ChamferCube.fbx differ diff --git a/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset b/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset new file mode 100644 index 0000000..a21e8e6 Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_ChamferCube.uasset differ diff --git a/Content/LevelPrototyping/Meshes/SM_Cube.uasset b/Content/LevelPrototyping/Meshes/SM_Cube.uasset new file mode 100644 index 0000000..064d510 Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_Cube.uasset differ diff --git a/Content/LevelPrototyping/Meshes/SM_Cylinder.fbx b/Content/LevelPrototyping/Meshes/SM_Cylinder.fbx new file mode 100644 index 0000000..290038a Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_Cylinder.fbx differ diff --git a/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset b/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset new file mode 100644 index 0000000..c9507f3 Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_Cylinder.uasset differ diff --git a/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.fbx b/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.fbx new file mode 100644 index 0000000..1d6d3b3 Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.fbx differ diff --git a/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset b/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset new file mode 100644 index 0000000..2e5bcee Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_QuarterCylinder.uasset differ diff --git a/Content/LevelPrototyping/Meshes/SM_Ramp.uasset b/Content/LevelPrototyping/Meshes/SM_Ramp.uasset new file mode 100644 index 0000000..e1293ee Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_Ramp.uasset differ diff --git a/Content/LevelPrototyping/Meshes/SM_SM_ChamferCube.fbx b/Content/LevelPrototyping/Meshes/SM_SM_ChamferCube.fbx new file mode 100644 index 0000000..0bd8ddb Binary files /dev/null and b/Content/LevelPrototyping/Meshes/SM_SM_ChamferCube.fbx differ diff --git a/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset b/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset new file mode 100644 index 0000000..e901d24 Binary files /dev/null and b/Content/LevelPrototyping/Textures/T_GridChecker_A.uasset differ diff --git a/Content/Variant_Horror/Blueprints/BP_HorrorCharacter.uasset b/Content/Variant_Horror/Blueprints/BP_HorrorCharacter.uasset new file mode 100644 index 0000000..e299b84 Binary files /dev/null and b/Content/Variant_Horror/Blueprints/BP_HorrorCharacter.uasset differ diff --git a/Content/Variant_Horror/Blueprints/BP_HorrorGameMode.uasset b/Content/Variant_Horror/Blueprints/BP_HorrorGameMode.uasset new file mode 100644 index 0000000..103f74d Binary files /dev/null and b/Content/Variant_Horror/Blueprints/BP_HorrorGameMode.uasset differ diff --git a/Content/Variant_Horror/Blueprints/BP_HorrorPlayerController.uasset b/Content/Variant_Horror/Blueprints/BP_HorrorPlayerController.uasset new file mode 100644 index 0000000..9f4af7f Binary files /dev/null and b/Content/Variant_Horror/Blueprints/BP_HorrorPlayerController.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Assets/Materials/LF_Flicker.uasset b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/LF_Flicker.uasset new file mode 100644 index 0000000..c0bb0ee Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/LF_Flicker.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Assets/Materials/MF_LightFlicker.uasset b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/MF_LightFlicker.uasset new file mode 100644 index 0000000..79017d5 Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/MF_LightFlicker.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Assets/Materials/MI_FlickeringLight.uasset b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/MI_FlickeringLight.uasset new file mode 100644 index 0000000..2975ce3 Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/MI_FlickeringLight.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Assets/Materials/M_DustMote.uasset b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/M_DustMote.uasset new file mode 100644 index 0000000..fce3e2a Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/M_DustMote.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Assets/Materials/M_Light.uasset b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/M_Light.uasset new file mode 100644 index 0000000..eba95bc Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Assets/Materials/M_Light.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Assets/NS_DustMote.uasset b/Content/Variant_Horror/Blueprints/Light/Assets/NS_DustMote.uasset new file mode 100644 index 0000000..691a1e6 Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Assets/NS_DustMote.uasset differ diff --git a/Content/Variant_Horror/Blueprints/Light/Light.uasset b/Content/Variant_Horror/Blueprints/Light/Light.uasset new file mode 100644 index 0000000..716a819 Binary files /dev/null and b/Content/Variant_Horror/Blueprints/Light/Light.uasset differ diff --git a/Content/Variant_Horror/Input/IA_Sprint.uasset b/Content/Variant_Horror/Input/IA_Sprint.uasset new file mode 100644 index 0000000..cab56d3 Binary files /dev/null and b/Content/Variant_Horror/Input/IA_Sprint.uasset differ diff --git a/Content/Variant_Horror/Input/IMC_Horror.uasset b/Content/Variant_Horror/Input/IMC_Horror.uasset new file mode 100644 index 0000000..146c952 Binary files /dev/null and b/Content/Variant_Horror/Input/IMC_Horror.uasset differ diff --git a/Content/Variant_Horror/Lvl_Horror.umap b/Content/Variant_Horror/Lvl_Horror.umap new file mode 100644 index 0000000..6f4cdfb Binary files /dev/null and b/Content/Variant_Horror/Lvl_Horror.umap differ diff --git a/Content/Variant_Horror/UI/M_FillBackground.uasset b/Content/Variant_Horror/UI/M_FillBackground.uasset new file mode 100644 index 0000000..2d1d4fd Binary files /dev/null and b/Content/Variant_Horror/UI/M_FillBackground.uasset differ diff --git a/Content/Variant_Horror/UI/UI_Horror.uasset b/Content/Variant_Horror/UI/UI_Horror.uasset new file mode 100644 index 0000000..3972af2 Binary files /dev/null and b/Content/Variant_Horror/UI/UI_Horror.uasset differ diff --git a/Content/Variant_Shooter/Anims/ABP_FP_Pistol.uasset b/Content/Variant_Shooter/Anims/ABP_FP_Pistol.uasset new file mode 100644 index 0000000..5de128b Binary files /dev/null and b/Content/Variant_Shooter/Anims/ABP_FP_Pistol.uasset differ diff --git a/Content/Variant_Shooter/Anims/ABP_FP_Weapon.uasset b/Content/Variant_Shooter/Anims/ABP_FP_Weapon.uasset new file mode 100644 index 0000000..972e141 Binary files /dev/null and b/Content/Variant_Shooter/Anims/ABP_FP_Weapon.uasset differ diff --git a/Content/Variant_Shooter/Anims/ABP_TP_Pistol.uasset b/Content/Variant_Shooter/Anims/ABP_TP_Pistol.uasset new file mode 100644 index 0000000..dfd70ee Binary files /dev/null and b/Content/Variant_Shooter/Anims/ABP_TP_Pistol.uasset differ diff --git a/Content/Variant_Shooter/Anims/ABP_TP_Rifle.uasset b/Content/Variant_Shooter/Anims/ABP_TP_Rifle.uasset new file mode 100644 index 0000000..6fb0cc6 Binary files /dev/null and b/Content/Variant_Shooter/Anims/ABP_TP_Rifle.uasset differ diff --git a/Content/Variant_Shooter/Anims/Ctrl_HandAdjusment.uasset b/Content/Variant_Shooter/Anims/Ctrl_HandAdjusment.uasset new file mode 100644 index 0000000..d2cef55 Binary files /dev/null and b/Content/Variant_Shooter/Anims/Ctrl_HandAdjusment.uasset differ diff --git a/Content/Variant_Shooter/Anims/Ctrl_HandAdjusment_Pistol.uasset b/Content/Variant_Shooter/Anims/Ctrl_HandAdjusment_Pistol.uasset new file mode 100644 index 0000000..32b276a Binary files /dev/null and b/Content/Variant_Shooter/Anims/Ctrl_HandAdjusment_Pistol.uasset differ diff --git a/Content/Variant_Shooter/Anims/FP_Rifle_Shoot_Montage.uasset b/Content/Variant_Shooter/Anims/FP_Rifle_Shoot_Montage.uasset new file mode 100644 index 0000000..5d83cdd Binary files /dev/null and b/Content/Variant_Shooter/Anims/FP_Rifle_Shoot_Montage.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/AI/BP_ShooterAIController.uasset b/Content/Variant_Shooter/Blueprints/AI/BP_ShooterAIController.uasset new file mode 100644 index 0000000..59a86ba Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/AI/BP_ShooterAIController.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/AI/BP_ShooterNPC.uasset b/Content/Variant_Shooter/Blueprints/AI/BP_ShooterNPC.uasset new file mode 100644 index 0000000..f93db4e Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/AI/BP_ShooterNPC.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/AI/EQS_FindRoamLocation.uasset b/Content/Variant_Shooter/Blueprints/AI/EQS_FindRoamLocation.uasset new file mode 100644 index 0000000..331014e Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/AI/EQS_FindRoamLocation.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/AI/EQS_FindSnipingLocation.uasset b/Content/Variant_Shooter/Blueprints/AI/EQS_FindSnipingLocation.uasset new file mode 100644 index 0000000..354740a Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/AI/EQS_FindSnipingLocation.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/AI/ST_Shooter.uasset b/Content/Variant_Shooter/Blueprints/AI/ST_Shooter.uasset new file mode 100644 index 0000000..d1a9fc6 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/AI/ST_Shooter.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/AI/ST_Shooter_ShootAtTarget.uasset b/Content/Variant_Shooter/Blueprints/AI/ST_Shooter_ShootAtTarget.uasset new file mode 100644 index 0000000..1985577 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/AI/ST_Shooter_ShootAtTarget.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/BP_ShooterCharacter.uasset b/Content/Variant_Shooter/Blueprints/BP_ShooterCharacter.uasset new file mode 100644 index 0000000..c769c7e Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/BP_ShooterCharacter.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/BP_ShooterGameMode.uasset b/Content/Variant_Shooter/Blueprints/BP_ShooterGameMode.uasset new file mode 100644 index 0000000..d52ea65 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/BP_ShooterGameMode.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/BP_ShooterPlayerController.uasset b/Content/Variant_Shooter/Blueprints/BP_ShooterPlayerController.uasset new file mode 100644 index 0000000..f225bff Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/BP_ShooterPlayerController.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/BP_ShooterPickup.uasset b/Content/Variant_Shooter/Blueprints/Pickups/BP_ShooterPickup.uasset new file mode 100644 index 0000000..b77132c Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/BP_ShooterPickup.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/BP_ShooterWeaponBase.uasset b/Content/Variant_Shooter/Blueprints/Pickups/BP_ShooterWeaponBase.uasset new file mode 100644 index 0000000..17afd23 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/BP_ShooterWeaponBase.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/DT_WeaponData.uasset b/Content/Variant_Shooter/Blueprints/Pickups/DT_WeaponData.uasset new file mode 100644 index 0000000..54f690f Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/DT_WeaponData.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterGrenadeExplosion.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterGrenadeExplosion.uasset new file mode 100644 index 0000000..4a94d24 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterGrenadeExplosion.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterProjectile_Bullet.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterProjectile_Bullet.uasset new file mode 100644 index 0000000..f6c84be Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterProjectile_Bullet.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterProjectile_Grenade.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterProjectile_Grenade.uasset new file mode 100644 index 0000000..49d93a8 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/BP_ShooterProjectile_Grenade.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/Materials/M_Explosion.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/Materials/M_Explosion.uasset new file mode 100644 index 0000000..cd8fbe5 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/Materials/M_Explosion.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/Meshes/SM_FoamBullet.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/Meshes/SM_FoamBullet.uasset new file mode 100644 index 0000000..926e706 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Projectiles/Meshes/SM_FoamBullet.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_GrenadeLauncher.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_GrenadeLauncher.uasset new file mode 100644 index 0000000..0613cb8 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_GrenadeLauncher.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_Pistol.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_Pistol.uasset new file mode 100644 index 0000000..d1015c2 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_Pistol.uasset differ diff --git a/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_Rifle.uasset b/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_Rifle.uasset new file mode 100644 index 0000000..1f76a66 Binary files /dev/null and b/Content/Variant_Shooter/Blueprints/Pickups/Weapons/BP_ShooterWeapon_Rifle.uasset differ diff --git a/Content/Variant_Shooter/Input/Actions/IA_Shoot.uasset b/Content/Variant_Shooter/Input/Actions/IA_Shoot.uasset new file mode 100644 index 0000000..3798a88 Binary files /dev/null and b/Content/Variant_Shooter/Input/Actions/IA_Shoot.uasset differ diff --git a/Content/Variant_Shooter/Input/Actions/IA_SwapWeapon.uasset b/Content/Variant_Shooter/Input/Actions/IA_SwapWeapon.uasset new file mode 100644 index 0000000..60b8806 Binary files /dev/null and b/Content/Variant_Shooter/Input/Actions/IA_SwapWeapon.uasset differ diff --git a/Content/Variant_Shooter/Input/BPI_Touch_Shooter.uasset b/Content/Variant_Shooter/Input/BPI_Touch_Shooter.uasset new file mode 100644 index 0000000..b2f53a7 Binary files /dev/null and b/Content/Variant_Shooter/Input/BPI_Touch_Shooter.uasset differ diff --git a/Content/Variant_Shooter/Input/IMC_Weapons.uasset b/Content/Variant_Shooter/Input/IMC_Weapons.uasset new file mode 100644 index 0000000..6e3f785 Binary files /dev/null and b/Content/Variant_Shooter/Input/IMC_Weapons.uasset differ diff --git a/Content/Variant_Shooter/Input/UI_TouchInterface_Shooter.uasset b/Content/Variant_Shooter/Input/UI_TouchInterface_Shooter.uasset new file mode 100644 index 0000000..cd8dce5 Binary files /dev/null and b/Content/Variant_Shooter/Input/UI_TouchInterface_Shooter.uasset differ diff --git a/Content/Variant_Shooter/Lvl_Shooter.umap b/Content/Variant_Shooter/Lvl_Shooter.umap new file mode 100644 index 0000000..19ab17b Binary files /dev/null and b/Content/Variant_Shooter/Lvl_Shooter.umap differ diff --git a/Content/Variant_Shooter/UI/M_BulletCounter.uasset b/Content/Variant_Shooter/UI/M_BulletCounter.uasset new file mode 100644 index 0000000..1e8ceda Binary files /dev/null and b/Content/Variant_Shooter/UI/M_BulletCounter.uasset differ diff --git a/Content/Variant_Shooter/UI/UI_Shooter.uasset b/Content/Variant_Shooter/UI/UI_Shooter.uasset new file mode 100644 index 0000000..011a445 Binary files /dev/null and b/Content/Variant_Shooter/UI/UI_Shooter.uasset differ diff --git a/Content/Variant_Shooter/UI/UI_ShooterBulletCounter.uasset b/Content/Variant_Shooter/UI/UI_ShooterBulletCounter.uasset new file mode 100644 index 0000000..ea31177 Binary files /dev/null and b/Content/Variant_Shooter/UI/UI_ShooterBulletCounter.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Audio/FirstPersonTemplateWeaponFire02.uasset b/Content/Weapons/GrenadeLauncher/Audio/FirstPersonTemplateWeaponFire02.uasset new file mode 100644 index 0000000..e94d3b7 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Audio/FirstPersonTemplateWeaponFire02.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Materials/M_GrenadeLauncher.uasset b/Content/Weapons/GrenadeLauncher/Materials/M_GrenadeLauncher.uasset new file mode 100644 index 0000000..d83dc70 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Materials/M_GrenadeLauncher.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Materials/M_ProjectileBullet.uasset b/Content/Weapons/GrenadeLauncher/Materials/M_ProjectileBullet.uasset new file mode 100644 index 0000000..d8419cf Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Materials/M_ProjectileBullet.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Meshes/FirstPersonProjectileMesh.uasset b/Content/Weapons/GrenadeLauncher/Meshes/FirstPersonProjectileMesh.uasset new file mode 100644 index 0000000..b01be83 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Meshes/FirstPersonProjectileMesh.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Meshes/PA_GrenadeLauncher.uasset b/Content/Weapons/GrenadeLauncher/Meshes/PA_GrenadeLauncher.uasset new file mode 100644 index 0000000..dc8a344 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Meshes/PA_GrenadeLauncher.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Meshes/SKM_GrenadeLauncher.uasset b/Content/Weapons/GrenadeLauncher/Meshes/SKM_GrenadeLauncher.uasset new file mode 100644 index 0000000..1abcd96 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Meshes/SKM_GrenadeLauncher.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Meshes/SK_GrenadeLauncher.uasset b/Content/Weapons/GrenadeLauncher/Meshes/SK_GrenadeLauncher.uasset new file mode 100644 index 0000000..f36a8cb Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Meshes/SK_GrenadeLauncher.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Meshes/SM_GrenadeLauncher.uasset b/Content/Weapons/GrenadeLauncher/Meshes/SM_GrenadeLauncher.uasset new file mode 100644 index 0000000..c7a61a4 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Meshes/SM_GrenadeLauncher.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Textures/T_FPGun_M.uasset b/Content/Weapons/GrenadeLauncher/Textures/T_FPGun_M.uasset new file mode 100644 index 0000000..f5db2c0 Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Textures/T_FPGun_M.uasset differ diff --git a/Content/Weapons/GrenadeLauncher/Textures/T_FPGun_N.uasset b/Content/Weapons/GrenadeLauncher/Textures/T_FPGun_N.uasset new file mode 100644 index 0000000..00adbcc Binary files /dev/null and b/Content/Weapons/GrenadeLauncher/Textures/T_FPGun_N.uasset differ diff --git a/Content/Weapons/Pistol/Materials/MI_Weapon_Pistol.uasset b/Content/Weapons/Pistol/Materials/MI_Weapon_Pistol.uasset new file mode 100644 index 0000000..2d494cf Binary files /dev/null and b/Content/Weapons/Pistol/Materials/MI_Weapon_Pistol.uasset differ diff --git a/Content/Weapons/Pistol/Meshes/PA_Pistol.uasset b/Content/Weapons/Pistol/Meshes/PA_Pistol.uasset new file mode 100644 index 0000000..b87ed41 Binary files /dev/null and b/Content/Weapons/Pistol/Meshes/PA_Pistol.uasset differ diff --git a/Content/Weapons/Pistol/Meshes/SKM_Pistol.uasset b/Content/Weapons/Pistol/Meshes/SKM_Pistol.uasset new file mode 100644 index 0000000..39dedf8 Binary files /dev/null and b/Content/Weapons/Pistol/Meshes/SKM_Pistol.uasset differ diff --git a/Content/Weapons/Pistol/Meshes/SK_Pistol.uasset b/Content/Weapons/Pistol/Meshes/SK_Pistol.uasset new file mode 100644 index 0000000..a792334 Binary files /dev/null and b/Content/Weapons/Pistol/Meshes/SK_Pistol.uasset differ diff --git a/Content/Weapons/Pistol/Meshes/SM_Pistol.uasset b/Content/Weapons/Pistol/Meshes/SM_Pistol.uasset new file mode 100644 index 0000000..3078675 Binary files /dev/null and b/Content/Weapons/Pistol/Meshes/SM_Pistol.uasset differ diff --git a/Content/Weapons/Pistol/Textures/T_Pistol_AORM.uasset b/Content/Weapons/Pistol/Textures/T_Pistol_AORM.uasset new file mode 100644 index 0000000..05d92f1 Binary files /dev/null and b/Content/Weapons/Pistol/Textures/T_Pistol_AORM.uasset differ diff --git a/Content/Weapons/Pistol/Textures/T_Pistol_D.uasset b/Content/Weapons/Pistol/Textures/T_Pistol_D.uasset new file mode 100644 index 0000000..98fedf0 Binary files /dev/null and b/Content/Weapons/Pistol/Textures/T_Pistol_D.uasset differ diff --git a/Content/Weapons/Pistol/Textures/T_Pistol_Masks.uasset b/Content/Weapons/Pistol/Textures/T_Pistol_Masks.uasset new file mode 100644 index 0000000..1032026 Binary files /dev/null and b/Content/Weapons/Pistol/Textures/T_Pistol_Masks.uasset differ diff --git a/Content/Weapons/Pistol/Textures/T_Pistol_N.uasset b/Content/Weapons/Pistol/Textures/T_Pistol_N.uasset new file mode 100644 index 0000000..74fccfd Binary files /dev/null and b/Content/Weapons/Pistol/Textures/T_Pistol_N.uasset differ diff --git a/Content/Weapons/Rifle/M_Weapon.uasset b/Content/Weapons/Rifle/M_Weapon.uasset new file mode 100644 index 0000000..08c93b6 Binary files /dev/null and b/Content/Weapons/Rifle/M_Weapon.uasset differ diff --git a/Content/Weapons/Rifle/Materials/M_Rifle.uasset b/Content/Weapons/Rifle/Materials/M_Rifle.uasset new file mode 100644 index 0000000..9ce89ae Binary files /dev/null and b/Content/Weapons/Rifle/Materials/M_Rifle.uasset differ diff --git a/Content/Weapons/Rifle/Materials/M_Weapon.uasset b/Content/Weapons/Rifle/Materials/M_Weapon.uasset new file mode 100644 index 0000000..e265f92 Binary files /dev/null and b/Content/Weapons/Rifle/Materials/M_Weapon.uasset differ diff --git a/Content/Weapons/Rifle/Meshes/PA_Rifle.uasset b/Content/Weapons/Rifle/Meshes/PA_Rifle.uasset new file mode 100644 index 0000000..bc65934 Binary files /dev/null and b/Content/Weapons/Rifle/Meshes/PA_Rifle.uasset differ diff --git a/Content/Weapons/Rifle/Meshes/SKM_Rifle.uasset b/Content/Weapons/Rifle/Meshes/SKM_Rifle.uasset new file mode 100644 index 0000000..1712710 Binary files /dev/null and b/Content/Weapons/Rifle/Meshes/SKM_Rifle.uasset differ diff --git a/Content/Weapons/Rifle/Meshes/SK_Rifle.uasset b/Content/Weapons/Rifle/Meshes/SK_Rifle.uasset new file mode 100644 index 0000000..ba5debe Binary files /dev/null and b/Content/Weapons/Rifle/Meshes/SK_Rifle.uasset differ diff --git a/Content/Weapons/Rifle/Meshes/SM_Rifle.uasset b/Content/Weapons/Rifle/Meshes/SM_Rifle.uasset new file mode 100644 index 0000000..98d7337 Binary files /dev/null and b/Content/Weapons/Rifle/Meshes/SM_Rifle.uasset differ diff --git a/Content/Weapons/Rifle/Textures/T_Rifle_BC.uasset b/Content/Weapons/Rifle/Textures/T_Rifle_BC.uasset new file mode 100644 index 0000000..9856203 Binary files /dev/null and b/Content/Weapons/Rifle/Textures/T_Rifle_BC.uasset differ diff --git a/Content/Weapons/Rifle/Textures/T_Rifle_N.uasset b/Content/Weapons/Rifle/Textures/T_Rifle_N.uasset new file mode 100644 index 0000000..5f34abb Binary files /dev/null and b/Content/Weapons/Rifle/Textures/T_Rifle_N.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/44/E30ITTGIQYU50RQY5Y9XCY.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/44/E30ITTGIQYU50RQY5Y9XCY.uasset new file mode 100644 index 0000000..379d915 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/44/E30ITTGIQYU50RQY5Y9XCY.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/56/I0F38RE5S8MZ8PNQ5GDDSS.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/56/I0F38RE5S8MZ8PNQ5GDDSS.uasset new file mode 100644 index 0000000..3fcbfcf Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/56/I0F38RE5S8MZ8PNQ5GDDSS.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/9C/F5Z2JNQMT747Y7QES5KOP7.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/9C/F5Z2JNQMT747Y7QES5KOP7.uasset new file mode 100644 index 0000000..4253bec Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/9C/F5Z2JNQMT747Y7QES5KOP7.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/ER/GJUIXEEO8HUV9WZCSZR9GH.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/ER/GJUIXEEO8HUV9WZCSZR9GH.uasset new file mode 100644 index 0000000..c26fb67 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/ER/GJUIXEEO8HUV9WZCSZR9GH.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/GZ/TTBKQTM7H2HDLWB3T16ZLY.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/GZ/TTBKQTM7H2HDLWB3T16ZLY.uasset new file mode 100644 index 0000000..728a0a6 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/GZ/TTBKQTM7H2HDLWB3T16ZLY.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/QF/0MZRSMWGNM91UYLLVJ3D8E.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/QF/0MZRSMWGNM91UYLLVJ3D8E.uasset new file mode 100644 index 0000000..4d8c2fa Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/0/QF/0MZRSMWGNM91UYLLVJ3D8E.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/2T/XLTJQ7V46UNMQF707MQDQK.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/2T/XLTJQ7V46UNMQF707MQDQK.uasset new file mode 100644 index 0000000..a24f4dc Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/2T/XLTJQ7V46UNMQF707MQDQK.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/CC/0JTUNI8VQLSXUN7CSUXHGJ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/CC/0JTUNI8VQLSXUN7CSUXHGJ.uasset new file mode 100644 index 0000000..0e67f5f Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/CC/0JTUNI8VQLSXUN7CSUXHGJ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/IH/6AC5KKMX2JQTMBRMPI2QXX.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/IH/6AC5KKMX2JQTMBRMPI2QXX.uasset new file mode 100644 index 0000000..bdbe4ea Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/IH/6AC5KKMX2JQTMBRMPI2QXX.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/TT/AN7EDCE3WNBXY7C6MLPGQH.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/TT/AN7EDCE3WNBXY7C6MLPGQH.uasset new file mode 100644 index 0000000..df94692 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/TT/AN7EDCE3WNBXY7C6MLPGQH.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/WL/M7MJFQ0T76JWU6F1Z7YH8J.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/WL/M7MJFQ0T76JWU6F1Z7YH8J.uasset new file mode 100644 index 0000000..746f21a Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/1/WL/M7MJFQ0T76JWU6F1Z7YH8J.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/1X/SN5R6LIXKDO3W51X1TVUTZ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/1X/SN5R6LIXKDO3W51X1TVUTZ.uasset new file mode 100644 index 0000000..1f922e9 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/1X/SN5R6LIXKDO3W51X1TVUTZ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/EG/CIZR6W2NYH4Y5P8G67XOU0.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/EG/CIZR6W2NYH4Y5P8G67XOU0.uasset new file mode 100644 index 0000000..44773b6 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/EG/CIZR6W2NYH4Y5P8G67XOU0.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/NN/UPER9K07U6B78EE80PY058.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/NN/UPER9K07U6B78EE80PY058.uasset new file mode 100644 index 0000000..40a71dd Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/NN/UPER9K07U6B78EE80PY058.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/OC/XS0DUOELE7HJY3F9XZSBNV.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/OC/XS0DUOELE7HJY3F9XZSBNV.uasset new file mode 100644 index 0000000..09b14db Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/OC/XS0DUOELE7HJY3F9XZSBNV.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/SP/2T0RTK13XAOOIQD0QTXDQ9.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/SP/2T0RTK13XAOOIQD0QTXDQ9.uasset new file mode 100644 index 0000000..0d7f238 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/2/SP/2T0RTK13XAOOIQD0QTXDQ9.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/3/8B/S2VB6OCHYGRYWAD0QGDM9H.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/3/8B/S2VB6OCHYGRYWAD0QGDM9H.uasset new file mode 100644 index 0000000..30658ce Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/3/8B/S2VB6OCHYGRYWAD0QGDM9H.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/3/BN/PJBVMDVV9BICN8MLKJ849X.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/3/BN/PJBVMDVV9BICN8MLKJ849X.uasset new file mode 100644 index 0000000..0e41979 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/3/BN/PJBVMDVV9BICN8MLKJ849X.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/3X/YJ94LSV2G9NAIYZIK96QLE.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/3X/YJ94LSV2G9NAIYZIK96QLE.uasset new file mode 100644 index 0000000..b364a17 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/3X/YJ94LSV2G9NAIYZIK96QLE.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/6J/NUEDVP0K274K8FKJ6Y0WEX.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/6J/NUEDVP0K274K8FKJ6Y0WEX.uasset new file mode 100644 index 0000000..f1a2809 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/6J/NUEDVP0K274K8FKJ6Y0WEX.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/8V/Q896X99E5DMTT521YEXM9A.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/8V/Q896X99E5DMTT521YEXM9A.uasset new file mode 100644 index 0000000..3ee6220 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/8V/Q896X99E5DMTT521YEXM9A.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/IJ/E7WQWO4MJ84GWAX8H4UR84.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/IJ/E7WQWO4MJ84GWAX8H4UR84.uasset new file mode 100644 index 0000000..379008e Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/IJ/E7WQWO4MJ84GWAX8H4UR84.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/N3/FQV2FW1I8D4Z06TF38UTCR.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/N3/FQV2FW1I8D4Z06TF38UTCR.uasset new file mode 100644 index 0000000..317dd03 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/N3/FQV2FW1I8D4Z06TF38UTCR.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/QB/9YXJRQGLS33G0BEH37USBX.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/QB/9YXJRQGLS33G0BEH37USBX.uasset new file mode 100644 index 0000000..4a1476d Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/QB/9YXJRQGLS33G0BEH37USBX.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/XL/U0BAKX7624EKY7QR8W4QDX.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/XL/U0BAKX7624EKY7QR8W4QDX.uasset new file mode 100644 index 0000000..4211a13 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/4/XL/U0BAKX7624EKY7QR8W4QDX.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/TI/UOUH4EXJHIGJNF2D0Y7CPX.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/TI/UOUH4EXJHIGJNF2D0Y7CPX.uasset new file mode 100644 index 0000000..6e1fe11 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/TI/UOUH4EXJHIGJNF2D0Y7CPX.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/UU/1ZY1QFVHRWZSP8YI4VZLMK.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/UU/1ZY1QFVHRWZSP8YI4VZLMK.uasset new file mode 100644 index 0000000..6f47709 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/UU/1ZY1QFVHRWZSP8YI4VZLMK.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/V6/DING1S8EVR2AQW03U1ABGV.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/V6/DING1S8EVR2AQW03U1ABGV.uasset new file mode 100644 index 0000000..45bbd60 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/5/V6/DING1S8EVR2AQW03U1ABGV.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/6I/29E05UQXOAGP6TCP5CN0BQ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/6I/29E05UQXOAGP6TCP5CN0BQ.uasset new file mode 100644 index 0000000..b51d154 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/6I/29E05UQXOAGP6TCP5CN0BQ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/96/JEF6NHSL8XXSCQTOUZMFM6.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/96/JEF6NHSL8XXSCQTOUZMFM6.uasset new file mode 100644 index 0000000..8c7f16b Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/96/JEF6NHSL8XXSCQTOUZMFM6.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/I5/5U3R0J6P3EIOET939AGA6V.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/I5/5U3R0J6P3EIOET939AGA6V.uasset new file mode 100644 index 0000000..fa78f89 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/I5/5U3R0J6P3EIOET939AGA6V.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/U8/LL0QNHFPYL403X5YW0FGG6.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/U8/LL0QNHFPYL403X5YW0FGG6.uasset new file mode 100644 index 0000000..6e6e7a7 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/6/U8/LL0QNHFPYL403X5YW0FGG6.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/7/HV/3VH3D4CLM38OC4F8ICXDVQ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/7/HV/3VH3D4CLM38OC4F8ICXDVQ.uasset new file mode 100644 index 0000000..8c9d7c7 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/7/HV/3VH3D4CLM38OC4F8ICXDVQ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/7/NI/7Z9KFUHGDC33I0LYBUUYUQ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/7/NI/7Z9KFUHGDC33I0LYBUUYUQ.uasset new file mode 100644 index 0000000..564c15c Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/7/NI/7Z9KFUHGDC33I0LYBUUYUQ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/2H/HS4VI3UZJT1LNKM6HC7PL2.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/2H/HS4VI3UZJT1LNKM6HC7PL2.uasset new file mode 100644 index 0000000..5fd1b46 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/2H/HS4VI3UZJT1LNKM6HC7PL2.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/7M/FNN1ELJOC3KQT4JN0YDHT6.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/7M/FNN1ELJOC3KQT4JN0YDHT6.uasset new file mode 100644 index 0000000..cadce2c Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/7M/FNN1ELJOC3KQT4JN0YDHT6.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/I3/0VVXG3S0B4RN6QSHFSGKGX.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/I3/0VVXG3S0B4RN6QSHFSGKGX.uasset new file mode 100644 index 0000000..d692e6c Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/I3/0VVXG3S0B4RN6QSHFSGKGX.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/KL/17EY7JSE7TF01OWV9LBSC1.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/KL/17EY7JSE7TF01OWV9LBSC1.uasset new file mode 100644 index 0000000..ac7a883 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/KL/17EY7JSE7TF01OWV9LBSC1.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/QY/FSMNL3KLM133J5VKZAU0BE.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/QY/FSMNL3KLM133J5VKZAU0BE.uasset new file mode 100644 index 0000000..bf5d0ea Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/QY/FSMNL3KLM133J5VKZAU0BE.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/W2/920TYXDM12T8GKK1E0M892.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/W2/920TYXDM12T8GKK1E0M892.uasset new file mode 100644 index 0000000..748499d Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/8/W2/920TYXDM12T8GKK1E0M892.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/3M/CN6DASGRPPAPEICARMETU3.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/3M/CN6DASGRPPAPEICARMETU3.uasset new file mode 100644 index 0000000..2a243cd Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/3M/CN6DASGRPPAPEICARMETU3.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/8O/BVYOAIREBMOAK7193TKE2N.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/8O/BVYOAIREBMOAK7193TKE2N.uasset new file mode 100644 index 0000000..9a96641 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/8O/BVYOAIREBMOAK7193TKE2N.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/9S/AT66MUZW91DYUD6WM5FH0P.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/9S/AT66MUZW91DYUD6WM5FH0P.uasset new file mode 100644 index 0000000..f1288b5 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/9S/AT66MUZW91DYUD6WM5FH0P.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/AC/RFQ7INIHB1Q1JWY7DWYQ5Y.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/AC/RFQ7INIHB1Q1JWY7DWYQ5Y.uasset new file mode 100644 index 0000000..b1927de Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/AC/RFQ7INIHB1Q1JWY7DWYQ5Y.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/D2/66RZ3E9MEBJPV125V7SWQ6.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/D2/66RZ3E9MEBJPV125V7SWQ6.uasset new file mode 100644 index 0000000..243bb9b Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/D2/66RZ3E9MEBJPV125V7SWQ6.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/LJ/OQX9YN9UJ9NNRX6ERJ3PPZ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/LJ/OQX9YN9UJ9NNRX6ERJ3PPZ.uasset new file mode 100644 index 0000000..b37967e Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/9/LJ/OQX9YN9UJ9NNRX6ERJ3PPZ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/2N/XWEBNOYZ7JA5DZOPBGZ71S.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/2N/XWEBNOYZ7JA5DZOPBGZ71S.uasset new file mode 100644 index 0000000..3877a3c Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/2N/XWEBNOYZ7JA5DZOPBGZ71S.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/HH/BIAWP2Z8HW32809JWMRLU3.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/HH/BIAWP2Z8HW32809JWMRLU3.uasset new file mode 100644 index 0000000..7a14e36 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/HH/BIAWP2Z8HW32809JWMRLU3.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/J3/JQWZC33CXMXDX87CAIWJ94.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/J3/JQWZC33CXMXDX87CAIWJ94.uasset new file mode 100644 index 0000000..868edef Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/J3/JQWZC33CXMXDX87CAIWJ94.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/U0/N7D7PHGDI2A4EOLD58TA92.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/U0/N7D7PHGDI2A4EOLD58TA92.uasset new file mode 100644 index 0000000..17aba3a Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/A/U0/N7D7PHGDI2A4EOLD58TA92.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/B/TG/2MDU2GF02TMAKTSII7ZI7V.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/B/TG/2MDU2GF02TMAKTSII7ZI7V.uasset new file mode 100644 index 0000000..298ff65 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/B/TG/2MDU2GF02TMAKTSII7ZI7V.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/B/U9/AHG6736Q2Y3SGC1JQONLFJ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/B/U9/AHG6736Q2Y3SGC1JQONLFJ.uasset new file mode 100644 index 0000000..a911d42 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/B/U9/AHG6736Q2Y3SGC1JQONLFJ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/C/0I/0PXPLZ76IWADZO9D6J4VWA.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/C/0I/0PXPLZ76IWADZO9D6J4VWA.uasset new file mode 100644 index 0000000..2607938 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/C/0I/0PXPLZ76IWADZO9D6J4VWA.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/C/GO/765U52T3ZSF8D2MPGLVRR0.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/C/GO/765U52T3ZSF8D2MPGLVRR0.uasset new file mode 100644 index 0000000..ac25baf Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/C/GO/765U52T3ZSF8D2MPGLVRR0.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/BL/WB7S47W2IE4F23EZ9SLQ1B.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/BL/WB7S47W2IE4F23EZ9SLQ1B.uasset new file mode 100644 index 0000000..aa41cea Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/BL/WB7S47W2IE4F23EZ9SLQ1B.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/C7/LHEOZ28EA00LZG55QEAGFH.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/C7/LHEOZ28EA00LZG55QEAGFH.uasset new file mode 100644 index 0000000..0aedcc8 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/C7/LHEOZ28EA00LZG55QEAGFH.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/IP/FTEAYZDQR9M2KDS0TEPHA0.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/IP/FTEAYZDQR9M2KDS0TEPHA0.uasset new file mode 100644 index 0000000..2b33f44 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/IP/FTEAYZDQR9M2KDS0TEPHA0.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/LE/5ZDRK6QRB1CF1JSS3HJKPV.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/LE/5ZDRK6QRB1CF1JSS3HJKPV.uasset new file mode 100644 index 0000000..a621324 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/LE/5ZDRK6QRB1CF1JSS3HJKPV.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/R5/8FN93FIP5FEZUI0RECK61K.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/R5/8FN93FIP5FEZUI0RECK61K.uasset new file mode 100644 index 0000000..2ddc396 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/R5/8FN93FIP5FEZUI0RECK61K.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/TO/58Y2HCG1B7M6VAJN1E38IS.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/TO/58Y2HCG1B7M6VAJN1E38IS.uasset new file mode 100644 index 0000000..3fc7d22 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/TO/58Y2HCG1B7M6VAJN1E38IS.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/V1/DLNCFC4C5RQ8EDPCDYCKHQ.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/V1/DLNCFC4C5RQ8EDPCDYCKHQ.uasset new file mode 100644 index 0000000..7dc3afb Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/V1/DLNCFC4C5RQ8EDPCDYCKHQ.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/W0/RTEFXSATTAVCPYEQHKNEY1.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/W0/RTEFXSATTAVCPYEQHKNEY1.uasset new file mode 100644 index 0000000..e5b0e49 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/D/W0/RTEFXSATTAVCPYEQHKNEY1.uasset differ diff --git a/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/E/P7/9DOH3BZKA2A8C7ZTDWILWC.uasset b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/E/P7/9DOH3BZKA2A8C7ZTDWILWC.uasset new file mode 100644 index 0000000..23d0cc8 Binary files /dev/null and b/Content/__ExternalActors__/FirstPerson/Lvl_FirstPerson/E/P7/9DOH3BZKA2A8C7ZTDWILWC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/9N/XNV375O8KPWILSKVGEFNR7.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/9N/XNV375O8KPWILSKVGEFNR7.uasset new file mode 100644 index 0000000..6666176 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/9N/XNV375O8KPWILSKVGEFNR7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/H4/6XP4MN111ML9O0QCEYRKH2.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/H4/6XP4MN111ML9O0QCEYRKH2.uasset new file mode 100644 index 0000000..8d0b408 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/H4/6XP4MN111ML9O0QCEYRKH2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/UL/NBOXI91CXDV03LG1XB034Y.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/UL/NBOXI91CXDV03LG1XB034Y.uasset new file mode 100644 index 0000000..ef4fc63 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/0/UL/NBOXI91CXDV03LG1XB034Y.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/BG/SUO39IID039W2OIT4A9WHD.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/BG/SUO39IID039W2OIT4A9WHD.uasset new file mode 100644 index 0000000..ad8fd08 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/BG/SUO39IID039W2OIT4A9WHD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/IF/NN5BW9XQMA6PPAIDJ7SMAQ.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/IF/NN5BW9XQMA6PPAIDJ7SMAQ.uasset new file mode 100644 index 0000000..27479ce Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/IF/NN5BW9XQMA6PPAIDJ7SMAQ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/XK/00H4DFA6S89FDUNS6VXWUB.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/XK/00H4DFA6S89FDUNS6VXWUB.uasset new file mode 100644 index 0000000..954d98c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/1/XK/00H4DFA6S89FDUNS6VXWUB.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/64/I7XEQFHVL5DIB1CJZBSBRU.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/64/I7XEQFHVL5DIB1CJZBSBRU.uasset new file mode 100644 index 0000000..9799daf Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/64/I7XEQFHVL5DIB1CJZBSBRU.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/6N/K64CJI6KHKILLZWQSQ7IAN.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/6N/K64CJI6KHKILLZWQSQ7IAN.uasset new file mode 100644 index 0000000..51e861c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/6N/K64CJI6KHKILLZWQSQ7IAN.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/9C/1NTY6MECNAM0L7QUTBTWTC.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/9C/1NTY6MECNAM0L7QUTBTWTC.uasset new file mode 100644 index 0000000..7f5f7dd Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/9C/1NTY6MECNAM0L7QUTBTWTC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/B7/QY8ULQWFS49XORXUUJYHBV.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/B7/QY8ULQWFS49XORXUUJYHBV.uasset new file mode 100644 index 0000000..aca1d08 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/B7/QY8ULQWFS49XORXUUJYHBV.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/JU/S4QLU8WK2BN4J46DP9RPNN.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/JU/S4QLU8WK2BN4J46DP9RPNN.uasset new file mode 100644 index 0000000..310a224 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/JU/S4QLU8WK2BN4J46DP9RPNN.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/LP/X22M42YXL5MXZCB4XVRYG9.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/LP/X22M42YXL5MXZCB4XVRYG9.uasset new file mode 100644 index 0000000..7298d89 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/LP/X22M42YXL5MXZCB4XVRYG9.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/PD/B1KLFOWOLE3HXLMQBBLOPE.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/PD/B1KLFOWOLE3HXLMQBBLOPE.uasset new file mode 100644 index 0000000..4444565 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/2/PD/B1KLFOWOLE3HXLMQBBLOPE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/6N/OFZ2R5U7SYT7F3CB3XEANE.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/6N/OFZ2R5U7SYT7F3CB3XEANE.uasset new file mode 100644 index 0000000..a495c9c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/6N/OFZ2R5U7SYT7F3CB3XEANE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/8G/ZPBH7EIP0LIE3IEE3X5I9P.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/8G/ZPBH7EIP0LIE3IEE3X5I9P.uasset new file mode 100644 index 0000000..d78f3a4 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/8G/ZPBH7EIP0LIE3IEE3X5I9P.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/AD/4ANYKIAZ7LHW90QHRA8XXY.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/AD/4ANYKIAZ7LHW90QHRA8XXY.uasset new file mode 100644 index 0000000..a0b44b0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/AD/4ANYKIAZ7LHW90QHRA8XXY.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/GK/3ZJBQHCJ1O8II9Z86X5JZ8.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/GK/3ZJBQHCJ1O8II9Z86X5JZ8.uasset new file mode 100644 index 0000000..94510fc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/GK/3ZJBQHCJ1O8II9Z86X5JZ8.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/HE/OG8UP7YLDKLJGZ6KZI41ZV.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/HE/OG8UP7YLDKLJGZ6KZI41ZV.uasset new file mode 100644 index 0000000..cfebb89 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/HE/OG8UP7YLDKLJGZ6KZI41ZV.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/JM/JB5K424E7XL6HOHHKAGZ44.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/JM/JB5K424E7XL6HOHHKAGZ44.uasset new file mode 100644 index 0000000..ca14606 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/JM/JB5K424E7XL6HOHHKAGZ44.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/L5/T7HZAJOHJ8Z18VN4WJBHUF.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/L5/T7HZAJOHJ8Z18VN4WJBHUF.uasset new file mode 100644 index 0000000..d840bfc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/L5/T7HZAJOHJ8Z18VN4WJBHUF.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/PZ/4LJ5CNYK9QNGK7I6CKWDDP.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/PZ/4LJ5CNYK9QNGK7I6CKWDDP.uasset new file mode 100644 index 0000000..d6a6e4a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/PZ/4LJ5CNYK9QNGK7I6CKWDDP.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/QB/9KU2R8SEQ5NZF4EGCALVVD.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/QB/9KU2R8SEQ5NZF4EGCALVVD.uasset new file mode 100644 index 0000000..be912cc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/QB/9KU2R8SEQ5NZF4EGCALVVD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/U3/8G5Q2ACBQL028FQW3TNA83.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/U3/8G5Q2ACBQL028FQW3TNA83.uasset new file mode 100644 index 0000000..a7c4ad7 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/U3/8G5Q2ACBQL028FQW3TNA83.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/XH/ZI2O8JLKELBZHG2VGWB2BY.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/XH/ZI2O8JLKELBZHG2VGWB2BY.uasset new file mode 100644 index 0000000..8e93f4f Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/3/XH/ZI2O8JLKELBZHG2VGWB2BY.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/1N/6ZCWCW0P2JN8XT3L45YXLS.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/1N/6ZCWCW0P2JN8XT3L45YXLS.uasset new file mode 100644 index 0000000..8f5d1ff Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/1N/6ZCWCW0P2JN8XT3L45YXLS.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/3O/7P5L1R6H2S9W36WVJFO7C2.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/3O/7P5L1R6H2S9W36WVJFO7C2.uasset new file mode 100644 index 0000000..e2858f0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/3O/7P5L1R6H2S9W36WVJFO7C2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/CU/3X5T5KEXZ9AFNDPZO353I4.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/CU/3X5T5KEXZ9AFNDPZO353I4.uasset new file mode 100644 index 0000000..7568519 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/CU/3X5T5KEXZ9AFNDPZO353I4.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/LW/63SRQSBPGN1O19F38FOJJI.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/LW/63SRQSBPGN1O19F38FOJJI.uasset new file mode 100644 index 0000000..7667540 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/LW/63SRQSBPGN1O19F38FOJJI.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/YO/H0MBGL3CLVB8BC3LTOTEJZ.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/YO/H0MBGL3CLVB8BC3LTOTEJZ.uasset new file mode 100644 index 0000000..3d9d27f Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/YO/H0MBGL3CLVB8BC3LTOTEJZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/YQ/U25QS32O4D60A2JP4UZWAL.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/YQ/U25QS32O4D60A2JP4UZWAL.uasset new file mode 100644 index 0000000..38c255a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/4/YQ/U25QS32O4D60A2JP4UZWAL.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/9G/8PH3B28FAWBUO5LZGIKBPY.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/9G/8PH3B28FAWBUO5LZGIKBPY.uasset new file mode 100644 index 0000000..b3e9731 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/9G/8PH3B28FAWBUO5LZGIKBPY.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/RE/41ING9B1UUSXVFVQAR67TW.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/RE/41ING9B1UUSXVFVQAR67TW.uasset new file mode 100644 index 0000000..6179f21 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/RE/41ING9B1UUSXVFVQAR67TW.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/TR/3KZ317G6QAISBA8KVHXNID.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/TR/3KZ317G6QAISBA8KVHXNID.uasset new file mode 100644 index 0000000..45f35d7 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/TR/3KZ317G6QAISBA8KVHXNID.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/V8/ELVBBJP6FQBB46EOR16SNV.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/V8/ELVBBJP6FQBB46EOR16SNV.uasset new file mode 100644 index 0000000..c6fc15a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/V8/ELVBBJP6FQBB46EOR16SNV.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/XB/P3903AEGCCLEKH4X762BHW.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/XB/P3903AEGCCLEKH4X762BHW.uasset new file mode 100644 index 0000000..3cddafc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/5/XB/P3903AEGCCLEKH4X762BHW.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/2Q/U1Q6LWD0LO8TBYP8XAG1HZ.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/2Q/U1Q6LWD0LO8TBYP8XAG1HZ.uasset new file mode 100644 index 0000000..a4e6621 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/2Q/U1Q6LWD0LO8TBYP8XAG1HZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/BR/8VZFJT0FO7JL9XP9AKBVU0.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/BR/8VZFJT0FO7JL9XP9AKBVU0.uasset new file mode 100644 index 0000000..4104e77 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/BR/8VZFJT0FO7JL9XP9AKBVU0.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/FN/P6DHQRHWG5A4ANBB6IVE9X.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/FN/P6DHQRHWG5A4ANBB6IVE9X.uasset new file mode 100644 index 0000000..7d03fa5 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/FN/P6DHQRHWG5A4ANBB6IVE9X.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/NR/EKR8BAGTREZL6130JK27PM.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/NR/EKR8BAGTREZL6130JK27PM.uasset new file mode 100644 index 0000000..e00fb10 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/NR/EKR8BAGTREZL6130JK27PM.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/ST/OY6MMZK8D42GBJO5FHWZLC.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/ST/OY6MMZK8D42GBJO5FHWZLC.uasset new file mode 100644 index 0000000..95ba58d Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/6/ST/OY6MMZK8D42GBJO5FHWZLC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/7/H6/HH9TF15E2MP5ZWX3UGV7P3.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/7/H6/HH9TF15E2MP5ZWX3UGV7P3.uasset new file mode 100644 index 0000000..cd1d58e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/7/H6/HH9TF15E2MP5ZWX3UGV7P3.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/4F/T21R05MMSCET8BZ2EG6SWS.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/4F/T21R05MMSCET8BZ2EG6SWS.uasset new file mode 100644 index 0000000..9a82934 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/4F/T21R05MMSCET8BZ2EG6SWS.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/9N/KESGN0131EL35XN79RTO8S.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/9N/KESGN0131EL35XN79RTO8S.uasset new file mode 100644 index 0000000..6691681 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/9N/KESGN0131EL35XN79RTO8S.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/GM/VJPIOZG5M5HV9SMJQGRMD7.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/GM/VJPIOZG5M5HV9SMJQGRMD7.uasset new file mode 100644 index 0000000..d507ad5 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/GM/VJPIOZG5M5HV9SMJQGRMD7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/VA/9SHJ6ONF0NO9EQH3EUOZ67.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/VA/9SHJ6ONF0NO9EQH3EUOZ67.uasset new file mode 100644 index 0000000..1cd0ee6 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/8/VA/9SHJ6ONF0NO9EQH3EUOZ67.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/8K/OGFT07X88T4YB1XZANAEWK.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/8K/OGFT07X88T4YB1XZANAEWK.uasset new file mode 100644 index 0000000..d3525db Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/8K/OGFT07X88T4YB1XZANAEWK.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/8P/HXB7QO5CUITP877I1SNGVT.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/8P/HXB7QO5CUITP877I1SNGVT.uasset new file mode 100644 index 0000000..bc8bd91 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/8P/HXB7QO5CUITP877I1SNGVT.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/DJ/PDAUG5BCKDEAJ2FGTRYQW7.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/DJ/PDAUG5BCKDEAJ2FGTRYQW7.uasset new file mode 100644 index 0000000..ecd6d29 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/DJ/PDAUG5BCKDEAJ2FGTRYQW7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/J6/KXD20TVKFIAWADS9P5K6T3.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/J6/KXD20TVKFIAWADS9P5K6T3.uasset new file mode 100644 index 0000000..0af6aff Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/J6/KXD20TVKFIAWADS9P5K6T3.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/L1/8PH18ZESFPZR6AFQNZZJHY.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/L1/8PH18ZESFPZR6AFQNZZJHY.uasset new file mode 100644 index 0000000..6eb72a1 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/L1/8PH18ZESFPZR6AFQNZZJHY.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/NW/3TP5SO08C78O361MV635WZ.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/NW/3TP5SO08C78O361MV635WZ.uasset new file mode 100644 index 0000000..897ff8e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/NW/3TP5SO08C78O361MV635WZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/PO/Z5JQ3715U90GC78LF8YVZE.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/PO/Z5JQ3715U90GC78LF8YVZE.uasset new file mode 100644 index 0000000..d9eccd9 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/PO/Z5JQ3715U90GC78LF8YVZE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/PQ/FUO1PC0ZE1T7HGD5M7WH3M.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/PQ/FUO1PC0ZE1T7HGD5M7WH3M.uasset new file mode 100644 index 0000000..77820ac Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/PQ/FUO1PC0ZE1T7HGD5M7WH3M.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/SQ/MI31B44UZ0O83WZ92D8YYJ.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/SQ/MI31B44UZ0O83WZ92D8YYJ.uasset new file mode 100644 index 0000000..e34e86c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/9/SQ/MI31B44UZ0O83WZ92D8YYJ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/4E/Z2RVP4X49TRJ8PV1TG7F99.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/4E/Z2RVP4X49TRJ8PV1TG7F99.uasset new file mode 100644 index 0000000..ba0be76 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/4E/Z2RVP4X49TRJ8PV1TG7F99.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/A0/0ZNCGT5BJTSIS7GE8BBTBR.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/A0/0ZNCGT5BJTSIS7GE8BBTBR.uasset new file mode 100644 index 0000000..0a4eacc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/A0/0ZNCGT5BJTSIS7GE8BBTBR.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/RE/2051XEA4LGIN555FZ9R41D.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/RE/2051XEA4LGIN555FZ9R41D.uasset new file mode 100644 index 0000000..c56b0e1 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/RE/2051XEA4LGIN555FZ9R41D.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/TT/PEKH451HOOMAWN4TUYPAXE.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/TT/PEKH451HOOMAWN4TUYPAXE.uasset new file mode 100644 index 0000000..110a477 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/TT/PEKH451HOOMAWN4TUYPAXE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/WM/PVV6DOCSPK8FAIAI96F846.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/WM/PVV6DOCSPK8FAIAI96F846.uasset new file mode 100644 index 0000000..2b6d362 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/A/WM/PVV6DOCSPK8FAIAI96F846.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/2Z/V55SREFRW1QNPJ6CMEYPID.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/2Z/V55SREFRW1QNPJ6CMEYPID.uasset new file mode 100644 index 0000000..4af6679 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/2Z/V55SREFRW1QNPJ6CMEYPID.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/CQ/T05AOFB8X3Y7RPQEZ703H3.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/CQ/T05AOFB8X3Y7RPQEZ703H3.uasset new file mode 100644 index 0000000..d0bf8d4 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/CQ/T05AOFB8X3Y7RPQEZ703H3.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/DR/JY8SVZB41D6BLQJZT15DEL.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/DR/JY8SVZB41D6BLQJZT15DEL.uasset new file mode 100644 index 0000000..ee93365 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/DR/JY8SVZB41D6BLQJZT15DEL.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/E5/HXHMPRE5K9TQ8IMYNUFT0K.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/E5/HXHMPRE5K9TQ8IMYNUFT0K.uasset new file mode 100644 index 0000000..6535389 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/E5/HXHMPRE5K9TQ8IMYNUFT0K.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/FY/LE2HVZRIWYTD4D2LOE75Z7.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/FY/LE2HVZRIWYTD4D2LOE75Z7.uasset new file mode 100644 index 0000000..7a1f2be Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/FY/LE2HVZRIWYTD4D2LOE75Z7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/JT/XP386E2S52UV4Y1UWONFOG.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/JT/XP386E2S52UV4Y1UWONFOG.uasset new file mode 100644 index 0000000..17252b2 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/JT/XP386E2S52UV4Y1UWONFOG.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/LN/PZBDBOZ4P0GSOF0G4UQO24.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/LN/PZBDBOZ4P0GSOF0G4UQO24.uasset new file mode 100644 index 0000000..8f8410c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/LN/PZBDBOZ4P0GSOF0G4UQO24.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/U8/WEFKJYFRD6NOQWK1CYE8MC.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/U8/WEFKJYFRD6NOQWK1CYE8MC.uasset new file mode 100644 index 0000000..36cbea3 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/B/U8/WEFKJYFRD6NOQWK1CYE8MC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/6B/R2H3DQMJE0N712J72DUGZM.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/6B/R2H3DQMJE0N712J72DUGZM.uasset new file mode 100644 index 0000000..3e387a9 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/6B/R2H3DQMJE0N712J72DUGZM.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/F2/KD7ZDAX5WSTHYZHAIHIVOE.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/F2/KD7ZDAX5WSTHYZHAIHIVOE.uasset new file mode 100644 index 0000000..4f62a26 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/F2/KD7ZDAX5WSTHYZHAIHIVOE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/VN/3X14DSC2WBO2DN31WFFFEC.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/VN/3X14DSC2WBO2DN31WFFFEC.uasset new file mode 100644 index 0000000..6cd0505 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/C/VN/3X14DSC2WBO2DN31WFFFEC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/G7/X9LYXH5KHAQDRL4H74W1CV.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/G7/X9LYXH5KHAQDRL4H74W1CV.uasset new file mode 100644 index 0000000..3ec6fa0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/G7/X9LYXH5KHAQDRL4H74W1CV.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/GK/ZY5JAZ69GEG4DXEH3ABYGY.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/GK/ZY5JAZ69GEG4DXEH3ABYGY.uasset new file mode 100644 index 0000000..a27b597 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/GK/ZY5JAZ69GEG4DXEH3ABYGY.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/XI/NKDB0RUCK5SBQ97LIA6W5N.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/XI/NKDB0RUCK5SBQ97LIA6W5N.uasset new file mode 100644 index 0000000..b0a07c0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/XI/NKDB0RUCK5SBQ97LIA6W5N.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/ZA/2D8B8Y2TMBHSQR4C5FUHOM.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/ZA/2D8B8Y2TMBHSQR4C5FUHOM.uasset new file mode 100644 index 0000000..b6f490b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/D/ZA/2D8B8Y2TMBHSQR4C5FUHOM.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/7J/9BJEHFBRWNQ4Y19IW2AX89.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/7J/9BJEHFBRWNQ4Y19IW2AX89.uasset new file mode 100644 index 0000000..6e7464b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/7J/9BJEHFBRWNQ4Y19IW2AX89.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/ID/VDROBGOSK9AYG8F03X20KO.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/ID/VDROBGOSK9AYG8F03X20KO.uasset new file mode 100644 index 0000000..913c9e7 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/ID/VDROBGOSK9AYG8F03X20KO.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/IM/098ZZWGR4KV9W9OSXMLS3F.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/IM/098ZZWGR4KV9W9OSXMLS3F.uasset new file mode 100644 index 0000000..80edec0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/IM/098ZZWGR4KV9W9OSXMLS3F.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/OZ/EWBP9T0DZVQI1I0D108ARK.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/OZ/EWBP9T0DZVQI1I0D108ARK.uasset new file mode 100644 index 0000000..17f7dde Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/E/OZ/EWBP9T0DZVQI1I0D108ARK.uasset differ diff --git a/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/F/30/Q30QC3KM9PIKZM4AGT7MT8.uasset b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/F/30/Q30QC3KM9PIKZM4AGT7MT8.uasset new file mode 100644 index 0000000..551d47e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Horror/Lvl_Horror/F/30/Q30QC3KM9PIKZM4AGT7MT8.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/0M/2W7A0TQFW2RQ2JSGI4EAAU.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/0M/2W7A0TQFW2RQ2JSGI4EAAU.uasset new file mode 100644 index 0000000..bbba299 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/0M/2W7A0TQFW2RQ2JSGI4EAAU.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/3W/4OWTQGAFHRSSWPHLF17GDA.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/3W/4OWTQGAFHRSSWPHLF17GDA.uasset new file mode 100644 index 0000000..0b3e9e4 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/3W/4OWTQGAFHRSSWPHLF17GDA.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/AF/ZF7MEEQXMQ4L1ZLTG98CF2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/AF/ZF7MEEQXMQ4L1ZLTG98CF2.uasset new file mode 100644 index 0000000..afded80 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/AF/ZF7MEEQXMQ4L1ZLTG98CF2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/F4/YDO8QO1YCWW4FK9C6JXB13.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/F4/YDO8QO1YCWW4FK9C6JXB13.uasset new file mode 100644 index 0000000..3bcf001 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/F4/YDO8QO1YCWW4FK9C6JXB13.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/GO/V9XAM3GMJV136EQQRF4AX6.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/GO/V9XAM3GMJV136EQQRF4AX6.uasset new file mode 100644 index 0000000..30942f3 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/GO/V9XAM3GMJV136EQQRF4AX6.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/NI/MG4LD5RUV0OUVPW5ILC24A.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/NI/MG4LD5RUV0OUVPW5ILC24A.uasset new file mode 100644 index 0000000..f7678e9 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/NI/MG4LD5RUV0OUVPW5ILC24A.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/SB/8XCGDZOPH9K2GTXGM0NZ9Z.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/SB/8XCGDZOPH9K2GTXGM0NZ9Z.uasset new file mode 100644 index 0000000..f28fabc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/SB/8XCGDZOPH9K2GTXGM0NZ9Z.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/Z7/F9FGM7QMM5OJ69Q0FQVPI2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/Z7/F9FGM7QMM5OJ69Q0FQVPI2.uasset new file mode 100644 index 0000000..3fe9740 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/0/Z7/F9FGM7QMM5OJ69Q0FQVPI2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/C4/DK472FPXL56BWBL5GTSRYC.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/C4/DK472FPXL56BWBL5GTSRYC.uasset new file mode 100644 index 0000000..fa34476 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/C4/DK472FPXL56BWBL5GTSRYC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/E0/YOQ2IEWKHEFVIYLKEOACFS.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/E0/YOQ2IEWKHEFVIYLKEOACFS.uasset new file mode 100644 index 0000000..7838c5e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/E0/YOQ2IEWKHEFVIYLKEOACFS.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/J3/5P2KEO4NI8FORQR8QBNI47.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/J3/5P2KEO4NI8FORQR8QBNI47.uasset new file mode 100644 index 0000000..9b1cdf9 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/J3/5P2KEO4NI8FORQR8QBNI47.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/TR/H93R1S6H13LSMPCN0XLH1U.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/TR/H93R1S6H13LSMPCN0XLH1U.uasset new file mode 100644 index 0000000..5347f0b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/TR/H93R1S6H13LSMPCN0XLH1U.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/W6/NU6H0B1N4KZ39T0WFGMC85.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/W6/NU6H0B1N4KZ39T0WFGMC85.uasset new file mode 100644 index 0000000..3c18761 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/W6/NU6H0B1N4KZ39T0WFGMC85.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/X5/OJ9O1Z0V1RA2I60X0E1MCB.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/X5/OJ9O1Z0V1RA2I60X0E1MCB.uasset new file mode 100644 index 0000000..21bf6f8 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/1/X5/OJ9O1Z0V1RA2I60X0E1MCB.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/21/OPIKYSZSUNYQ6FCTTCKNH2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/21/OPIKYSZSUNYQ6FCTTCKNH2.uasset new file mode 100644 index 0000000..636452d Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/21/OPIKYSZSUNYQ6FCTTCKNH2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/2I/LP90LR7MNBZK6BK6WBYWE0.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/2I/LP90LR7MNBZK6BK6WBYWE0.uasset new file mode 100644 index 0000000..ee47c2c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/2I/LP90LR7MNBZK6BK6WBYWE0.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/3S/QP7RC5S7TEGQTEGEPKYS7S.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/3S/QP7RC5S7TEGQTEGEPKYS7S.uasset new file mode 100644 index 0000000..12358f7 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/3S/QP7RC5S7TEGQTEGEPKYS7S.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/47/EPSQHQIUJ0PMGCKIRS4P3D.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/47/EPSQHQIUJ0PMGCKIRS4P3D.uasset new file mode 100644 index 0000000..164aecd Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/47/EPSQHQIUJ0PMGCKIRS4P3D.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/4R/OLEQXEVNQITH993RA1K72C.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/4R/OLEQXEVNQITH993RA1K72C.uasset new file mode 100644 index 0000000..eaef86e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/4R/OLEQXEVNQITH993RA1K72C.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/71/YW8CI30OGK3D0E0UFPW345.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/71/YW8CI30OGK3D0E0UFPW345.uasset new file mode 100644 index 0000000..e211ecc Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/71/YW8CI30OGK3D0E0UFPW345.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/A7/N2VQC81615YBX5QQ4DD1DH.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/A7/N2VQC81615YBX5QQ4DD1DH.uasset new file mode 100644 index 0000000..d07be1b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/A7/N2VQC81615YBX5QQ4DD1DH.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/EL/ZCMASU9FA69X4FRWIOZXLF.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/EL/ZCMASU9FA69X4FRWIOZXLF.uasset new file mode 100644 index 0000000..dea6003 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/EL/ZCMASU9FA69X4FRWIOZXLF.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/TF/5V1R4R14ALRKBVE4EB3IE5.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/TF/5V1R4R14ALRKBVE4EB3IE5.uasset new file mode 100644 index 0000000..09f9dd5 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/TF/5V1R4R14ALRKBVE4EB3IE5.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/VV/8T4IS7U0HG2KEYF3554ZMT.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/VV/8T4IS7U0HG2KEYF3554ZMT.uasset new file mode 100644 index 0000000..070061d Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/VV/8T4IS7U0HG2KEYF3554ZMT.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/XB/NXHNT4IWLYE5N4Q5JWHKQT.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/XB/NXHNT4IWLYE5N4Q5JWHKQT.uasset new file mode 100644 index 0000000..773ae27 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/2/XB/NXHNT4IWLYE5N4Q5JWHKQT.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/D1/BFO7PDRG6PWTEPAEPCNPD3.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/D1/BFO7PDRG6PWTEPAEPCNPD3.uasset new file mode 100644 index 0000000..1d93483 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/D1/BFO7PDRG6PWTEPAEPCNPD3.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/EF/ONB59WKPJIJQFIU8TQF5HB.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/EF/ONB59WKPJIJQFIU8TQF5HB.uasset new file mode 100644 index 0000000..764c3cf Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/EF/ONB59WKPJIJQFIU8TQF5HB.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/FK/B8JHTMJJT6RAJNB20BVLHG.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/FK/B8JHTMJJT6RAJNB20BVLHG.uasset new file mode 100644 index 0000000..197e291 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/FK/B8JHTMJJT6RAJNB20BVLHG.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/G0/CNMKSON899NRH3LSKRTO8B.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/G0/CNMKSON899NRH3LSKRTO8B.uasset new file mode 100644 index 0000000..46079b0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/G0/CNMKSON899NRH3LSKRTO8B.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/KQ/U2GB5PAQ7IKHBWZX9B3E5C.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/KQ/U2GB5PAQ7IKHBWZX9B3E5C.uasset new file mode 100644 index 0000000..543fae0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/KQ/U2GB5PAQ7IKHBWZX9B3E5C.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/L4/X2RT7LNEHCGGGU1MI95AT3.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/L4/X2RT7LNEHCGGGU1MI95AT3.uasset new file mode 100644 index 0000000..b8c2a7e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/L4/X2RT7LNEHCGGGU1MI95AT3.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/LP/VOOY55N5QBASMJ3MB5FBF8.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/LP/VOOY55N5QBASMJ3MB5FBF8.uasset new file mode 100644 index 0000000..4ea6af7 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/LP/VOOY55N5QBASMJ3MB5FBF8.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/NR/2FFVMWVCFXP8BHOTFV9ZYZ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/NR/2FFVMWVCFXP8BHOTFV9ZYZ.uasset new file mode 100644 index 0000000..83bbf50 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/NR/2FFVMWVCFXP8BHOTFV9ZYZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/ZO/UGHL175SLLXY39PQUI16U7.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/ZO/UGHL175SLLXY39PQUI16U7.uasset new file mode 100644 index 0000000..63e067a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/3/ZO/UGHL175SLLXY39PQUI16U7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/3S/AY58X4SHLU19PXGLVCJLCU.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/3S/AY58X4SHLU19PXGLVCJLCU.uasset new file mode 100644 index 0000000..2e39a3e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/3S/AY58X4SHLU19PXGLVCJLCU.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/4A/VTCLSHIX2YXQ8FSREY3I5O.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/4A/VTCLSHIX2YXQ8FSREY3I5O.uasset new file mode 100644 index 0000000..6707a85 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/4A/VTCLSHIX2YXQ8FSREY3I5O.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/74/E8REIFZ2JXZGKXPAG377ZI.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/74/E8REIFZ2JXZGKXPAG377ZI.uasset new file mode 100644 index 0000000..6b56611 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/74/E8REIFZ2JXZGKXPAG377ZI.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/8R/4KE7PNR39XBST18TQVKQD2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/8R/4KE7PNR39XBST18TQVKQD2.uasset new file mode 100644 index 0000000..f430645 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/8R/4KE7PNR39XBST18TQVKQD2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/CB/MKHCMIGW9MTCBYZ2ENCHZI.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/CB/MKHCMIGW9MTCBYZ2ENCHZI.uasset new file mode 100644 index 0000000..28fa03e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/CB/MKHCMIGW9MTCBYZ2ENCHZI.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/F9/IYHQGBLXUFEQ4FSL3LGMKP.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/F9/IYHQGBLXUFEQ4FSL3LGMKP.uasset new file mode 100644 index 0000000..185fa3e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/F9/IYHQGBLXUFEQ4FSL3LGMKP.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/FK/N0I7ZGW3RHRDWQJANEWT2R.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/FK/N0I7ZGW3RHRDWQJANEWT2R.uasset new file mode 100644 index 0000000..c3098dd Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/FK/N0I7ZGW3RHRDWQJANEWT2R.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/QR/Y2VZNQLMIRRT4AF72G5PJY.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/QR/Y2VZNQLMIRRT4AF72G5PJY.uasset new file mode 100644 index 0000000..a72c3d2 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/QR/Y2VZNQLMIRRT4AF72G5PJY.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/X8/2YV05QMX7SE54V3NZM2SUR.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/X8/2YV05QMX7SE54V3NZM2SUR.uasset new file mode 100644 index 0000000..5aa428d Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/4/X8/2YV05QMX7SE54V3NZM2SUR.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/1C/A3UKEQ70E1RMOB72D74WHO.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/1C/A3UKEQ70E1RMOB72D74WHO.uasset new file mode 100644 index 0000000..b799bd2 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/1C/A3UKEQ70E1RMOB72D74WHO.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/4N/8930XQ2F5PXX5UP7J3NZWP.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/4N/8930XQ2F5PXX5UP7J3NZWP.uasset new file mode 100644 index 0000000..b5fe21c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/4N/8930XQ2F5PXX5UP7J3NZWP.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/82/3FXC2P85LEFD9UWU50YMVL.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/82/3FXC2P85LEFD9UWU50YMVL.uasset new file mode 100644 index 0000000..2f27d8d Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/82/3FXC2P85LEFD9UWU50YMVL.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/EX/SPBUY5TP7JPB25VIYJCI4N.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/EX/SPBUY5TP7JPB25VIYJCI4N.uasset new file mode 100644 index 0000000..dba0a55 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/EX/SPBUY5TP7JPB25VIYJCI4N.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/GY/1OQ2XTVN6TLOZQR3TZZHWO.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/GY/1OQ2XTVN6TLOZQR3TZZHWO.uasset new file mode 100644 index 0000000..66f1922 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/GY/1OQ2XTVN6TLOZQR3TZZHWO.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/MJ/6PQD4KP1RTD6RK0X2WYDRD.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/MJ/6PQD4KP1RTD6RK0X2WYDRD.uasset new file mode 100644 index 0000000..1e0cd02 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/MJ/6PQD4KP1RTD6RK0X2WYDRD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/PY/CZVJVA9FVPJCDZW8N0DY0E.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/PY/CZVJVA9FVPJCDZW8N0DY0E.uasset new file mode 100644 index 0000000..b1e7158 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/PY/CZVJVA9FVPJCDZW8N0DY0E.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/QI/EVFNMBE7BZTBXFSLA3MNGI.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/QI/EVFNMBE7BZTBXFSLA3MNGI.uasset new file mode 100644 index 0000000..195673f Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/QI/EVFNMBE7BZTBXFSLA3MNGI.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/RU/F7I0JH45UMMDWQKJ3B0IES.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/RU/F7I0JH45UMMDWQKJ3B0IES.uasset new file mode 100644 index 0000000..a739a1c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/RU/F7I0JH45UMMDWQKJ3B0IES.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/UG/2IAK7M3SWBNKRNSUQDDLRF.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/UG/2IAK7M3SWBNKRNSUQDDLRF.uasset new file mode 100644 index 0000000..0e4e9d5 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/UG/2IAK7M3SWBNKRNSUQDDLRF.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/UG/PX4LZ68G18XX9UTSXQAF8R.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/UG/PX4LZ68G18XX9UTSXQAF8R.uasset new file mode 100644 index 0000000..4644854 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/5/UG/PX4LZ68G18XX9UTSXQAF8R.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/81/TPBZUMZA7ZAO0NAMA5WZE6.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/81/TPBZUMZA7ZAO0NAMA5WZE6.uasset new file mode 100644 index 0000000..d11d64a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/81/TPBZUMZA7ZAO0NAMA5WZE6.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/85/IAUIZH1MNBX5K5S4C76STA.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/85/IAUIZH1MNBX5K5S4C76STA.uasset new file mode 100644 index 0000000..9c128da Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/85/IAUIZH1MNBX5K5S4C76STA.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/8N/MFMXWD65LGY7YKQ3QKC7IB.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/8N/MFMXWD65LGY7YKQ3QKC7IB.uasset new file mode 100644 index 0000000..6bf6101 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/8N/MFMXWD65LGY7YKQ3QKC7IB.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/EG/ML1BFF59ATFJJFFG0FBMPJ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/EG/ML1BFF59ATFJJFFG0FBMPJ.uasset new file mode 100644 index 0000000..05fa55a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/EG/ML1BFF59ATFJJFFG0FBMPJ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/HK/WBN373R14SBX6NJ2K8QXXG.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/HK/WBN373R14SBX6NJ2K8QXXG.uasset new file mode 100644 index 0000000..2b65105 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/HK/WBN373R14SBX6NJ2K8QXXG.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/JX/HBTUH10XOH0KFVBAHOIL2X.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/JX/HBTUH10XOH0KFVBAHOIL2X.uasset new file mode 100644 index 0000000..b7a3fe6 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/JX/HBTUH10XOH0KFVBAHOIL2X.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/UV/ITSLYO85KH2FWAZPPGLCO2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/UV/ITSLYO85KH2FWAZPPGLCO2.uasset new file mode 100644 index 0000000..dbb7018 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/6/UV/ITSLYO85KH2FWAZPPGLCO2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/0F/CLSM7G0KP9S3SKWG7BP65A.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/0F/CLSM7G0KP9S3SKWG7BP65A.uasset new file mode 100644 index 0000000..aca4d53 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/0F/CLSM7G0KP9S3SKWG7BP65A.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/4Q/SE3163RHB7C0OIJ715G8XJ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/4Q/SE3163RHB7C0OIJ715G8XJ.uasset new file mode 100644 index 0000000..7dbc5c5 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/4Q/SE3163RHB7C0OIJ715G8XJ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/7F/JS7TSR3L8BG7QAMXGPE8KZ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/7F/JS7TSR3L8BG7QAMXGPE8KZ.uasset new file mode 100644 index 0000000..0d299d3 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/7F/JS7TSR3L8BG7QAMXGPE8KZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/8P/4RJMNHEYLO9LBSKTWAP3K0.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/8P/4RJMNHEYLO9LBSKTWAP3K0.uasset new file mode 100644 index 0000000..5aafdba Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/8P/4RJMNHEYLO9LBSKTWAP3K0.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/A4/GM34X4MV7JKOEVMT9BD6DK.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/A4/GM34X4MV7JKOEVMT9BD6DK.uasset new file mode 100644 index 0000000..acf9a1c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/A4/GM34X4MV7JKOEVMT9BD6DK.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/ES/AZ00WJD36GHTQFGAA3M640.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/ES/AZ00WJD36GHTQFGAA3M640.uasset new file mode 100644 index 0000000..639b077 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/ES/AZ00WJD36GHTQFGAA3M640.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/FY/DZULLSRWN7CLU58WEZBQBD.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/FY/DZULLSRWN7CLU58WEZBQBD.uasset new file mode 100644 index 0000000..647f005 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/FY/DZULLSRWN7CLU58WEZBQBD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/QR/5L81GGT6LFA1SR1E1HOHAF.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/QR/5L81GGT6LFA1SR1E1HOHAF.uasset new file mode 100644 index 0000000..3304b59 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/QR/5L81GGT6LFA1SR1E1HOHAF.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/TM/IKFTKD1ZP1KLUJC4DQ8KVE.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/TM/IKFTKD1ZP1KLUJC4DQ8KVE.uasset new file mode 100644 index 0000000..7add81b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/7/TM/IKFTKD1ZP1KLUJC4DQ8KVE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/2A/XHGPJ0ECCIW2GOB3K8SHKN.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/2A/XHGPJ0ECCIW2GOB3K8SHKN.uasset new file mode 100644 index 0000000..9e24ccf Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/2A/XHGPJ0ECCIW2GOB3K8SHKN.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/3N/EBHCOJGXSI7GEKQVASGUTT.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/3N/EBHCOJGXSI7GEKQVASGUTT.uasset new file mode 100644 index 0000000..c291fc1 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/3N/EBHCOJGXSI7GEKQVASGUTT.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/5D/WSN91CNHUAVJ5XDYC4FAC4.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/5D/WSN91CNHUAVJ5XDYC4FAC4.uasset new file mode 100644 index 0000000..afe4aeb Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/5D/WSN91CNHUAVJ5XDYC4FAC4.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/8M/VITU9EX4VWF006RSKKKE8H.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/8M/VITU9EX4VWF006RSKKKE8H.uasset new file mode 100644 index 0000000..07ef9e1 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/8M/VITU9EX4VWF006RSKKKE8H.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/8V/DETGNY7T4LFNIO9AW8AJ2Y.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/8V/DETGNY7T4LFNIO9AW8AJ2Y.uasset new file mode 100644 index 0000000..888b544 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/8V/DETGNY7T4LFNIO9AW8AJ2Y.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/E4/SHIWMFW5LS6BMG8YLQF90P.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/E4/SHIWMFW5LS6BMG8YLQF90P.uasset new file mode 100644 index 0000000..cffb55a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/E4/SHIWMFW5LS6BMG8YLQF90P.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/J2/NJSICP75S1AAG0RX0WWEV8.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/J2/NJSICP75S1AAG0RX0WWEV8.uasset new file mode 100644 index 0000000..305303c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/J2/NJSICP75S1AAG0RX0WWEV8.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/PA/GKTBLM66BNQLPZV4E8XZL2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/PA/GKTBLM66BNQLPZV4E8XZL2.uasset new file mode 100644 index 0000000..69c8028 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/PA/GKTBLM66BNQLPZV4E8XZL2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/SH/AIAQJXTFOA1VCWQOW2E4RR.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/SH/AIAQJXTFOA1VCWQOW2E4RR.uasset new file mode 100644 index 0000000..fdf17e0 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/SH/AIAQJXTFOA1VCWQOW2E4RR.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/U0/X7YRBKY2NXUICG2T2L9HFS.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/U0/X7YRBKY2NXUICG2T2L9HFS.uasset new file mode 100644 index 0000000..cdd3f2d Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/8/U0/X7YRBKY2NXUICG2T2L9HFS.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/11/S85EET3C30AER5UMTBB972.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/11/S85EET3C30AER5UMTBB972.uasset new file mode 100644 index 0000000..da3962c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/11/S85EET3C30AER5UMTBB972.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/68/5UFLOC7TYTREZUJD4TVN5J.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/68/5UFLOC7TYTREZUJD4TVN5J.uasset new file mode 100644 index 0000000..f497533 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/68/5UFLOC7TYTREZUJD4TVN5J.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/B4/XH06CNJM9F5JBUW37K8ZGU.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/B4/XH06CNJM9F5JBUW37K8ZGU.uasset new file mode 100644 index 0000000..571e14f Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/B4/XH06CNJM9F5JBUW37K8ZGU.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/CD/WSMTLK2F2LHYHZ1ODL6U8I.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/CD/WSMTLK2F2LHYHZ1ODL6U8I.uasset new file mode 100644 index 0000000..e1d2350 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/CD/WSMTLK2F2LHYHZ1ODL6U8I.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/CV/UORV0S2ARLO4XJO8GJVJYP.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/CV/UORV0S2ARLO4XJO8GJVJYP.uasset new file mode 100644 index 0000000..e31336a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/CV/UORV0S2ARLO4XJO8GJVJYP.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EA/IFDP9Q20ZABLKDWU3JG0XI.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EA/IFDP9Q20ZABLKDWU3JG0XI.uasset new file mode 100644 index 0000000..0bba940 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EA/IFDP9Q20ZABLKDWU3JG0XI.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EF/TX8KPTY73QLOGBRUT0K7QO.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EF/TX8KPTY73QLOGBRUT0K7QO.uasset new file mode 100644 index 0000000..f58d7b1 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EF/TX8KPTY73QLOGBRUT0K7QO.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EY/FC7NMRYAN0Y77NPAC5S5K2.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EY/FC7NMRYAN0Y77NPAC5S5K2.uasset new file mode 100644 index 0000000..78ecc68 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/EY/FC7NMRYAN0Y77NPAC5S5K2.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/GW/JEA64HFPIFEUWSJWGTPHOD.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/GW/JEA64HFPIFEUWSJWGTPHOD.uasset new file mode 100644 index 0000000..221b6cf Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/GW/JEA64HFPIFEUWSJWGTPHOD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/I2/5ND7QZ3YOE1FN57S92PCC6.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/I2/5ND7QZ3YOE1FN57S92PCC6.uasset new file mode 100644 index 0000000..6037d19 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/I2/5ND7QZ3YOE1FN57S92PCC6.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/KF/E8ZVIKZWKZVYOPCOJLJJDC.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/KF/E8ZVIKZWKZVYOPCOJLJJDC.uasset new file mode 100644 index 0000000..55d9c49 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/KF/E8ZVIKZWKZVYOPCOJLJJDC.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/OQ/WIWCALTDEKEGJB0TLM45SL.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/OQ/WIWCALTDEKEGJB0TLM45SL.uasset new file mode 100644 index 0000000..2ada74c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/OQ/WIWCALTDEKEGJB0TLM45SL.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/P2/ZPU2HDJ9PZWQ718JH95FB7.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/P2/ZPU2HDJ9PZWQ718JH95FB7.uasset new file mode 100644 index 0000000..342361a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/P2/ZPU2HDJ9PZWQ718JH95FB7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/RL/Z64VCCBBIKFGKMJSXMOLRD.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/RL/Z64VCCBBIKFGKMJSXMOLRD.uasset new file mode 100644 index 0000000..81f5b13 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/RL/Z64VCCBBIKFGKMJSXMOLRD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/S7/MS6LGAZB30JAO6LZXG9NCQ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/S7/MS6LGAZB30JAO6LZXG9NCQ.uasset new file mode 100644 index 0000000..5ecf48a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/S7/MS6LGAZB30JAO6LZXG9NCQ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/T1/Y5TFOGZA2J90AXOJ1X2SI3.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/T1/Y5TFOGZA2J90AXOJ1X2SI3.uasset new file mode 100644 index 0000000..f27b6dd Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/T1/Y5TFOGZA2J90AXOJ1X2SI3.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/WI/M7RG491UCWT2BKDWW40DQ1.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/WI/M7RG491UCWT2BKDWW40DQ1.uasset new file mode 100644 index 0000000..1f98dbd Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/WI/M7RG491UCWT2BKDWW40DQ1.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/WM/11IA1T7W705Z0XRZR2F3RN.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/WM/11IA1T7W705Z0XRZR2F3RN.uasset new file mode 100644 index 0000000..3f4a1a6 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/9/WM/11IA1T7W705Z0XRZR2F3RN.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/HE/VU8B6ST3EIXVOIQ7RDLJXD.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/HE/VU8B6ST3EIXVOIQ7RDLJXD.uasset new file mode 100644 index 0000000..3c4f446 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/HE/VU8B6ST3EIXVOIQ7RDLJXD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/HT/64QNI431ITASWGXQVEP9GZ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/HT/64QNI431ITASWGXQVEP9GZ.uasset new file mode 100644 index 0000000..fe157e3 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/HT/64QNI431ITASWGXQVEP9GZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/KN/QKE5ONGFK6KBAWKGOX5EFP.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/KN/QKE5ONGFK6KBAWKGOX5EFP.uasset new file mode 100644 index 0000000..74fd24b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/KN/QKE5ONGFK6KBAWKGOX5EFP.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/O1/JPCT6UKOQUR6ZBFSX0R3YW.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/O1/JPCT6UKOQUR6ZBFSX0R3YW.uasset new file mode 100644 index 0000000..a662b46 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/O1/JPCT6UKOQUR6ZBFSX0R3YW.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/OG/ID8G9B27E6SMDDH5XN7JAE.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/OG/ID8G9B27E6SMDDH5XN7JAE.uasset new file mode 100644 index 0000000..daace37 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/OG/ID8G9B27E6SMDDH5XN7JAE.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/OR/8M18FS2XGZVEKEZCD9M9G5.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/OR/8M18FS2XGZVEKEZCD9M9G5.uasset new file mode 100644 index 0000000..eaf6378 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/OR/8M18FS2XGZVEKEZCD9M9G5.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/PS/2HHOJ2I7VB009PVNZSASSP.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/PS/2HHOJ2I7VB009PVNZSASSP.uasset new file mode 100644 index 0000000..581e2e4 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/PS/2HHOJ2I7VB009PVNZSASSP.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/RB/DH88LLLXULXZVJKUSKUY65.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/RB/DH88LLLXULXZVJKUSKUY65.uasset new file mode 100644 index 0000000..708a30b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/RB/DH88LLLXULXZVJKUSKUY65.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/WS/OD81AP87WA1TF62223ZRF1.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/WS/OD81AP87WA1TF62223ZRF1.uasset new file mode 100644 index 0000000..c158de2 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/WS/OD81AP87WA1TF62223ZRF1.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/WY/LVFUG6K1BKN13XE4KQQ40K.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/WY/LVFUG6K1BKN13XE4KQQ40K.uasset new file mode 100644 index 0000000..1e9da44 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/A/WY/LVFUG6K1BKN13XE4KQQ40K.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/D9/Z57RGITVPW1E9TYTA44LWH.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/D9/Z57RGITVPW1E9TYTA44LWH.uasset new file mode 100644 index 0000000..abb5148 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/D9/Z57RGITVPW1E9TYTA44LWH.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/K6/H3CZPHI7O0HFA0DHKWFFB1.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/K6/H3CZPHI7O0HFA0DHKWFFB1.uasset new file mode 100644 index 0000000..91b2459 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/K6/H3CZPHI7O0HFA0DHKWFFB1.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/NY/ZXIJINPFFQNCKX34HPQEDZ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/NY/ZXIJINPFFQNCKX34HPQEDZ.uasset new file mode 100644 index 0000000..f7a3762 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/NY/ZXIJINPFFQNCKX34HPQEDZ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/T9/WTK0WZ7YP778QRTNM2ASIH.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/T9/WTK0WZ7YP778QRTNM2ASIH.uasset new file mode 100644 index 0000000..edb28ab Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/T9/WTK0WZ7YP778QRTNM2ASIH.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/Y2/NO03Q09VKP8EMBQAGCK9MU.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/Y2/NO03Q09VKP8EMBQAGCK9MU.uasset new file mode 100644 index 0000000..ebc9e48 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/B/Y2/NO03Q09VKP8EMBQAGCK9MU.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/7O/0L9RYRRBQG7VEGHR8Q98BD.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/7O/0L9RYRRBQG7VEGHR8Q98BD.uasset new file mode 100644 index 0000000..08c4008 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/7O/0L9RYRRBQG7VEGHR8Q98BD.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/C3/Q48R0F7C7BXL14R1P7QC22.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/C3/Q48R0F7C7BXL14R1P7QC22.uasset new file mode 100644 index 0000000..7949657 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/C3/Q48R0F7C7BXL14R1P7QC22.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/DO/HZ34Q26I12KNKJVQEF18EM.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/DO/HZ34Q26I12KNKJVQEF18EM.uasset new file mode 100644 index 0000000..af2ca42 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/DO/HZ34Q26I12KNKJVQEF18EM.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/EC/KA71OOH03YKI068HDGL3VB.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/EC/KA71OOH03YKI068HDGL3VB.uasset new file mode 100644 index 0000000..b698589 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/EC/KA71OOH03YKI068HDGL3VB.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/SI/8DCD2UP9VNXNP2N5WMXNUQ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/SI/8DCD2UP9VNXNP2N5WMXNUQ.uasset new file mode 100644 index 0000000..eeb7616 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/C/SI/8DCD2UP9VNXNP2N5WMXNUQ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/5O/XGIEUX13MQCOU125YK3X2C.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/5O/XGIEUX13MQCOU125YK3X2C.uasset new file mode 100644 index 0000000..233675c Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/5O/XGIEUX13MQCOU125YK3X2C.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/9H/36KF3AMIT683JEIMNB4XAA.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/9H/36KF3AMIT683JEIMNB4XAA.uasset new file mode 100644 index 0000000..00a074b Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/9H/36KF3AMIT683JEIMNB4XAA.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/G8/7GP7X2YYJWIGC7PC3AVPXQ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/G8/7GP7X2YYJWIGC7PC3AVPXQ.uasset new file mode 100644 index 0000000..3386036 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/G8/7GP7X2YYJWIGC7PC3AVPXQ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/HW/I1794TW7FPLR5XAV3TW7L6.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/HW/I1794TW7FPLR5XAV3TW7L6.uasset new file mode 100644 index 0000000..935fd33 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/D/HW/I1794TW7FPLR5XAV3TW7L6.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/44/H4Q0ZTK0XODVRU6OS62V6B.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/44/H4Q0ZTK0XODVRU6OS62V6B.uasset new file mode 100644 index 0000000..06d9a81 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/44/H4Q0ZTK0XODVRU6OS62V6B.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/4V/C1AI26EB3D2ORY2QX3LI4V.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/4V/C1AI26EB3D2ORY2QX3LI4V.uasset new file mode 100644 index 0000000..2bf0443 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/4V/C1AI26EB3D2ORY2QX3LI4V.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/8K/GQDG92R9FRUQLYSQOFAMKI.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/8K/GQDG92R9FRUQLYSQOFAMKI.uasset new file mode 100644 index 0000000..1cf3184 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/8K/GQDG92R9FRUQLYSQOFAMKI.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/AG/V9HGVOTOBYIE10UPD6CPRU.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/AG/V9HGVOTOBYIE10UPD6CPRU.uasset new file mode 100644 index 0000000..576a48e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/AG/V9HGVOTOBYIE10UPD6CPRU.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/CY/PYU8OGSFL0C5HOKJTOQJ18.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/CY/PYU8OGSFL0C5HOKJTOQJ18.uasset new file mode 100644 index 0000000..516bea5 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/CY/PYU8OGSFL0C5HOKJTOQJ18.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/OV/WP567OU0GDSNI7DV6OHSHL.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/OV/WP567OU0GDSNI7DV6OHSHL.uasset new file mode 100644 index 0000000..5a8ce03 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/OV/WP567OU0GDSNI7DV6OHSHL.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/PP/0FS30TRW5307EXU14BXFWH.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/PP/0FS30TRW5307EXU14BXFWH.uasset new file mode 100644 index 0000000..fef9f3e Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/PP/0FS30TRW5307EXU14BXFWH.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/RC/YWG76NICZRGBLF21JJXNPV.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/RC/YWG76NICZRGBLF21JJXNPV.uasset new file mode 100644 index 0000000..28cd53a Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/RC/YWG76NICZRGBLF21JJXNPV.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/TB/LAHFA52TW10239NQOCP5VJ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/TB/LAHFA52TW10239NQOCP5VJ.uasset new file mode 100644 index 0000000..fdd2e8f Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/E/TB/LAHFA52TW10239NQOCP5VJ.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/F/1S/0E5W9QWRKKYALBDU8J7OJ7.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/F/1S/0E5W9QWRKKYALBDU8J7OJ7.uasset new file mode 100644 index 0000000..378e9eb Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/F/1S/0E5W9QWRKKYALBDU8J7OJ7.uasset differ diff --git a/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/F/3Q/D5C015VFBWHJPBUNK6LYQZ.uasset b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/F/3Q/D5C015VFBWHJPBUNK6LYQZ.uasset new file mode 100644 index 0000000..d986478 Binary files /dev/null and b/Content/__ExternalActors__/Variant_Shooter/Lvl_Shooter/F/3Q/D5C015VFBWHJPBUNK6LYQZ.uasset differ diff --git a/Content/__ExternalObjects__/FirstPerson/Lvl_FirstPerson/1/E5/IOQOGT9AJYYZQ06SOLO6RW.uasset b/Content/__ExternalObjects__/FirstPerson/Lvl_FirstPerson/1/E5/IOQOGT9AJYYZQ06SOLO6RW.uasset new file mode 100644 index 0000000..7dd9c6c Binary files /dev/null and b/Content/__ExternalObjects__/FirstPerson/Lvl_FirstPerson/1/E5/IOQOGT9AJYYZQ06SOLO6RW.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Horror/Lvl_Horror/E/4S/MTC0EUCY5X4PPSGG0YEW81.uasset b/Content/__ExternalObjects__/Variant_Horror/Lvl_Horror/E/4S/MTC0EUCY5X4PPSGG0YEW81.uasset new file mode 100644 index 0000000..3899343 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Horror/Lvl_Horror/E/4S/MTC0EUCY5X4PPSGG0YEW81.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/1/YM/YQOYN83O0AY6EIUCED607T.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/1/YM/YQOYN83O0AY6EIUCED607T.uasset new file mode 100644 index 0000000..7dcc7e6 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/1/YM/YQOYN83O0AY6EIUCED607T.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/3/2W/ZNRQ5WHS64UROQO8IYBQ8K.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/3/2W/ZNRQ5WHS64UROQO8IYBQ8K.uasset new file mode 100644 index 0000000..d6e5c64 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/3/2W/ZNRQ5WHS64UROQO8IYBQ8K.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/3/GX/9T107TEODWHN5T1WPYBUQ7.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/3/GX/9T107TEODWHN5T1WPYBUQ7.uasset new file mode 100644 index 0000000..801d71e Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/3/GX/9T107TEODWHN5T1WPYBUQ7.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/5/VB/10P3UZA0QNYFH1YBTDGMZ1.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/5/VB/10P3UZA0QNYFH1YBTDGMZ1.uasset new file mode 100644 index 0000000..a22397b Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/5/VB/10P3UZA0QNYFH1YBTDGMZ1.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/6/CO/XIQDOOHSXSPVKBOZEQMPYA.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/6/CO/XIQDOOHSXSPVKBOZEQMPYA.uasset new file mode 100644 index 0000000..74f2165 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/6/CO/XIQDOOHSXSPVKBOZEQMPYA.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/A/U2/YWYC9H20DSG3PUCQB8WBZY.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/A/U2/YWYC9H20DSG3PUCQB8WBZY.uasset new file mode 100644 index 0000000..099a81e Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/A/U2/YWYC9H20DSG3PUCQB8WBZY.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/A/X7/68F5K6E8SAVZAFAA6X809G.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/A/X7/68F5K6E8SAVZAFAA6X809G.uasset new file mode 100644 index 0000000..792edfe Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/A/X7/68F5K6E8SAVZAFAA6X809G.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/C/EV/FYOQKZQDM3AYZEKRQRNWNL.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/C/EV/FYOQKZQDM3AYZEKRQRNWNL.uasset new file mode 100644 index 0000000..5f2dfd7 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/C/EV/FYOQKZQDM3AYZEKRQRNWNL.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/D/H2/NB2B3NDNJ5EHLF4RBHMD8K.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/D/H2/NB2B3NDNJ5EHLF4RBHMD8K.uasset new file mode 100644 index 0000000..77a01c4 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/D/H2/NB2B3NDNJ5EHLF4RBHMD8K.uasset differ diff --git a/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/E/9R/OEDP71GC0TR19P70FPV3QX.uasset b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/E/9R/OEDP71GC0TR19P70FPV3QX.uasset new file mode 100644 index 0000000..f22e7e8 Binary files /dev/null and b/Content/__ExternalObjects__/Variant_Shooter/Lvl_Shooter/E/9R/OEDP71GC0TR19P70FPV3QX.uasset differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..dff7566 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# first + +Developed with Unreal Engine 5 diff --git a/Source/first.Target.cs b/Source/first.Target.cs new file mode 100644 index 0000000..128aa2a --- /dev/null +++ b/Source/first.Target.cs @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; +using System.Collections.Generic; + +public class firstTarget : TargetRules +{ + public firstTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Game; + DefaultBuildSettings = BuildSettingsVersion.V5; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_6; + ExtraModuleNames.Add("first"); + } +} diff --git a/Source/first/Variant_Horror/HorrorCharacter.cpp b/Source/first/Variant_Horror/HorrorCharacter.cpp new file mode 100644 index 0000000..d3e76ed --- /dev/null +++ b/Source/first/Variant_Horror/HorrorCharacter.cpp @@ -0,0 +1,143 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Horror/HorrorCharacter.h" +#include "Engine/World.h" +#include "TimerManager.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "Camera/CameraComponent.h" +#include "Components/SpotLightComponent.h" +#include "EnhancedInputComponent.h" +#include "InputAction.h" + +AHorrorCharacter::AHorrorCharacter() +{ + // create the spotlight + SpotLight = CreateDefaultSubobject(TEXT("SpotLight")); + SpotLight->SetupAttachment(GetFirstPersonCameraComponent()); + + SpotLight->SetRelativeLocationAndRotation(FVector(30.0f, 17.5f, -5.0f), FRotator(-18.6f, -1.3f, 5.26f)); + SpotLight->Intensity = 0.5; + SpotLight->SetIntensityUnits(ELightUnits::Lumens); + SpotLight->AttenuationRadius = 1050.0f; + SpotLight->InnerConeAngle = 18.7f; + SpotLight->OuterConeAngle = 45.24f; +} + +void AHorrorCharacter::BeginPlay() +{ + Super::BeginPlay(); + + // initialize sprint meter to max + SprintMeter = SprintTime; + + // Initialize the walk speed + GetCharacterMovement()->MaxWalkSpeed = WalkSpeed; + + // start the sprint tick timer + GetWorld()->GetTimerManager().SetTimer(SprintTimer, this, &AHorrorCharacter::SprintFixedTick, SprintFixedTickTime, true); +} + +void AHorrorCharacter::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the sprint timer + GetWorld()->GetTimerManager().ClearTimer(SprintTimer); +} + +void AHorrorCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + Super::SetupPlayerInputComponent(PlayerInputComponent); + + { + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + // Sprinting + EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Started, this, &AHorrorCharacter::DoStartSprint); + EnhancedInputComponent->BindAction(SprintAction, ETriggerEvent::Completed, this, &AHorrorCharacter::DoEndSprint); + + } + } +} + +void AHorrorCharacter::DoStartSprint() +{ + // set the sprinting flag + bSprinting = true; + + // are we out of recovery mode? + if (!bRecovering) + { + // set the sprint walk speed + GetCharacterMovement()->MaxWalkSpeed = SprintSpeed; + + // call the sprint state changed delegate + OnSprintStateChanged.Broadcast(true); + } + +} + +void AHorrorCharacter::DoEndSprint() +{ + // set the sprinting flag + bSprinting = false; + + // are we out of recovery mode? + if (!bRecovering) + { + // set the default walk speed + GetCharacterMovement()->MaxWalkSpeed = WalkSpeed; + + // call the sprint state changed delegate + OnSprintStateChanged.Broadcast(false); + } +} + +void AHorrorCharacter::SprintFixedTick() +{ + // are we out of recovery, still have stamina and are moving faster than our walk speed? + if (bSprinting && !bRecovering && GetVelocity().Length() > WalkSpeed) + { + + // do we still have meter to burn? + if (SprintMeter > 0.0f) + { + // update the sprint meter + SprintMeter = FMath::Max(SprintMeter - SprintFixedTickTime, 0.0f); + + // have we run out of stamina? + if (SprintMeter <= 0.0f) + { + // raise the recovering flag + bRecovering = true; + + // set the recovering walk speed + GetCharacterMovement()->MaxWalkSpeed = RecoveringWalkSpeed; + } + } + + } else { + + // recover stamina + SprintMeter = FMath::Min(SprintMeter + SprintFixedTickTime, SprintTime); + + if (SprintMeter >= SprintTime) + { + // lower the recovering flag + bRecovering = false; + + // set the walk or sprint speed depending on whether the sprint button is down + GetCharacterMovement()->MaxWalkSpeed = bSprinting ? SprintSpeed : WalkSpeed; + + // update the sprint state depending on whether the button is down or not + OnSprintStateChanged.Broadcast(bSprinting); + } + + } + + // broadcast the sprint meter updated delegate + OnSprintMeterUpdated.Broadcast(SprintMeter / SprintTime); + +} diff --git a/Source/first/Variant_Horror/HorrorCharacter.h b/Source/first/Variant_Horror/HorrorCharacter.h new file mode 100644 index 0000000..48bd57b --- /dev/null +++ b/Source/first/Variant_Horror/HorrorCharacter.h @@ -0,0 +1,104 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "firstCharacter.h" +#include "HorrorCharacter.generated.h" + +class USpotLightComponent; +class UInputAction; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FUpdateSprintMeterDelegate, float, Percentage); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FSprintStateChangedDelegate, bool, bSprinting); + +/** + * Simple first person horror character + * Provides stamina-based sprinting + */ +UCLASS(abstract) +class FIRST_API AHorrorCharacter : public AfirstCharacter +{ + GENERATED_BODY() + + /** Player light source */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USpotLightComponent* SpotLight; + +protected: + + /** Fire weapon input action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* SprintAction; + + /** If true, we're sprinting */ + bool bSprinting = false; + + /** If true, we're recovering stamina */ + bool bRecovering = false; + + /** Default walk speed when not sprinting or recovering */ + UPROPERTY(EditAnywhere, Category="Walk") + float WalkSpeed = 250.0f; + + /** Time interval for sprinting stamina ticks */ + UPROPERTY(EditAnywhere, Category="Sprint", meta = (ClampMin = 0, ClampMax = 1, Units = "s")) + float SprintFixedTickTime = 0.03333f; + + /** Sprint stamina amount. Maxes at SprintTime */ + float SprintMeter = 0.0f; + + /** How long we can sprint for, in seconds */ + UPROPERTY(EditAnywhere, Category="Sprint", meta = (ClampMin = 0, ClampMax = 10, Units = "s")) + float SprintTime = 3.0f; + + /** Walk speed while sprinting */ + UPROPERTY(EditAnywhere, Category="Sprint", meta = (ClampMin = 0, ClampMax = 10, Units = "cm/s")) + float SprintSpeed = 600.0f; + + /** Walk speed while recovering stamina */ + UPROPERTY(EditAnywhere, Category="Recovery", meta = (ClampMin = 0, ClampMax = 10, Units = "cm/s")) + float RecoveringWalkSpeed = 150.0f; + + /** Time it takes for the sprint meter to recover */ + UPROPERTY(EditAnywhere, Category="Recovery", meta = (ClampMin = 0, ClampMax = 10, Units = "s")) + float RecoveryTime = 0.0f; + + /** Sprint tick timer */ + FTimerHandle SprintTimer; + +public: + + /** Delegate called when the sprint meter should be updated */ + FUpdateSprintMeterDelegate OnSprintMeterUpdated; + + /** Delegate called when we start and stop sprinting */ + FSprintStateChangedDelegate OnSprintStateChanged; + +protected: + + /** Constructor */ + AHorrorCharacter(); + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Gameplay cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + + /** Set up input action bindings */ + virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override; + +protected: + + /** Starts sprinting behavior */ + UFUNCTION(BlueprintCallable, Category = "Input") + void DoStartSprint(); + + /** Stops sprinting behavior */ + UFUNCTION(BlueprintCallable, Category="Input") + void DoEndSprint(); + + /** Called while sprinting at a fixed time interval */ + void SprintFixedTick(); +}; diff --git a/Source/first/Variant_Horror/HorrorGameMode.cpp b/Source/first/Variant_Horror/HorrorGameMode.cpp new file mode 100644 index 0000000..b0621d3 --- /dev/null +++ b/Source/first/Variant_Horror/HorrorGameMode.cpp @@ -0,0 +1,9 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Horror/HorrorGameMode.h" + +AHorrorGameMode::AHorrorGameMode() +{ + // stub +} diff --git a/Source/first/Variant_Horror/HorrorGameMode.h b/Source/first/Variant_Horror/HorrorGameMode.h new file mode 100644 index 0000000..0196813 --- /dev/null +++ b/Source/first/Variant_Horror/HorrorGameMode.h @@ -0,0 +1,21 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "HorrorGameMode.generated.h" + +/** + * Simple GameMode for a first person horror game + */ +UCLASS(abstract) +class FIRST_API AHorrorGameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + + /** Constructor */ + AHorrorGameMode(); +}; diff --git a/Source/first/Variant_Horror/HorrorPlayerController.cpp b/Source/first/Variant_Horror/HorrorPlayerController.cpp new file mode 100644 index 0000000..7a93ade --- /dev/null +++ b/Source/first/Variant_Horror/HorrorPlayerController.cpp @@ -0,0 +1,92 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Horror/HorrorPlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "Engine/LocalPlayer.h" +#include "InputMappingContext.h" +#include "firstCameraManager.h" +#include "HorrorCharacter.h" +#include "HorrorUI.h" +#include "first.h" +#include "Widgets/Input/SVirtualJoystick.h" + +AHorrorPlayerController::AHorrorPlayerController() +{ + // set the player camera manager class + PlayerCameraManagerClass = AfirstCameraManager::StaticClass(); +} + +void AHorrorPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // only spawn touch controls on local player controllers + if (SVirtualJoystick::ShouldDisplayTouchInterface() && IsLocalPlayerController()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(Logfirst, Error, TEXT("Could not spawn mobile controls widget.")); + + } + + } +} + +void AHorrorPlayerController::OnPossess(APawn* aPawn) +{ + Super::OnPossess(aPawn); + + // only spawn UI on local player controllers + if (IsLocalPlayerController()) + { + // set up the UI for the character + if (AHorrorCharacter* HorrorCharacter = Cast(aPawn)) + { + // create the UI + if (!HorrorUI) + { + HorrorUI = CreateWidget(this, HorrorUIClass); + HorrorUI->AddToViewport(0); + } + + HorrorUI->SetupCharacter(HorrorCharacter); + } + } + +} + +void AHorrorPlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // Add Input Mapping Contexts + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!SVirtualJoystick::ShouldDisplayTouchInterface()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } +} diff --git a/Source/first/Variant_Horror/HorrorPlayerController.h b/Source/first/Variant_Horror/HorrorPlayerController.h new file mode 100644 index 0000000..3cc9cd0 --- /dev/null +++ b/Source/first/Variant_Horror/HorrorPlayerController.h @@ -0,0 +1,62 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "HorrorPlayerController.generated.h" + +class UInputMappingContext; +class UHorrorUI; + +/** + * Player Controller for a first person horror game + * Manages input mappings + * Manages UI + */ +UCLASS(abstract) +class FIRST_API AHorrorPlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Type of UI widget to spawn */ + UPROPERTY(EditAnywhere, Category="Horror|UI") + TSubclassOf HorrorUIClass; + + /** Pointer to the UI widget */ + TObjectPtr HorrorUI; + +public: + + /** Constructor */ + AHorrorPlayerController(); + +protected: + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category ="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + TObjectPtr MobileControlsWidget; + + /** Gameplay Initialization */ + virtual void BeginPlay() override; + + /** Possessed pawn initialization */ + virtual void OnPossess(APawn* aPawn) override; + + /** Input mapping context setup */ + virtual void SetupInputComponent() override; + +}; diff --git a/Source/first/Variant_Horror/UI/HorrorUI.cpp b/Source/first/Variant_Horror/UI/HorrorUI.cpp new file mode 100644 index 0000000..78d17bd --- /dev/null +++ b/Source/first/Variant_Horror/UI/HorrorUI.cpp @@ -0,0 +1,23 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "HorrorUI.h" +#include "HorrorCharacter.h" + +void UHorrorUI::SetupCharacter(AHorrorCharacter* HorrorCharacter) +{ + HorrorCharacter->OnSprintMeterUpdated.AddDynamic(this, &UHorrorUI::OnSprintMeterUpdated); + HorrorCharacter->OnSprintStateChanged.AddDynamic(this, &UHorrorUI::OnSprintStateChanged); +} + +void UHorrorUI::OnSprintMeterUpdated(float Percent) +{ + // call the BP handler + BP_SprintMeterUpdated(Percent); +} + +void UHorrorUI::OnSprintStateChanged(bool bSprinting) +{ + // call the BP handler + BP_SprintStateChanged(bSprinting); +} diff --git a/Source/first/Variant_Horror/UI/HorrorUI.h b/Source/first/Variant_Horror/UI/HorrorUI.h new file mode 100644 index 0000000..4c06ebc --- /dev/null +++ b/Source/first/Variant_Horror/UI/HorrorUI.h @@ -0,0 +1,42 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "HorrorUI.generated.h" + +class AHorrorCharacter; + +/** + * Simple UI for a first person horror game + * Manages character sprint meter display + */ +UCLASS(abstract) +class FIRST_API UHorrorUI : public UUserWidget +{ + GENERATED_BODY() + +public: + + /** Sets up delegate listeners for the passed character */ + void SetupCharacter(AHorrorCharacter* HorrorCharacter); + + /** Called when the character's sprint meter is updated */ + UFUNCTION() + void OnSprintMeterUpdated(float Percent); + + /** Called when the character's sprint state changes */ + UFUNCTION() + void OnSprintStateChanged(bool bSprinting); + +protected: + + /** Passes control to Blueprint to update the sprint meter widgets */ + UFUNCTION(BlueprintImplementableEvent, Category="Horror", meta = (DisplayName = "Sprint Meter Updated")) + void BP_SprintMeterUpdated(float Percent); + + /** Passes control to Blueprint to update the sprint meter status */ + UFUNCTION(BlueprintImplementableEvent, Category="Horror", meta = (DisplayName = "Sprint State Changed")) + void BP_SprintStateChanged(bool bSprinting); +}; diff --git a/Source/first/Variant_Shooter/AI/EnvQueryContext_Target.cpp b/Source/first/Variant_Shooter/AI/EnvQueryContext_Target.cpp new file mode 100644 index 0000000..7a45abe --- /dev/null +++ b/Source/first/Variant_Shooter/AI/EnvQueryContext_Target.cpp @@ -0,0 +1,27 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Shooter/AI/EnvQueryContext_Target.h" +#include "EnvironmentQuery/Items/EnvQueryItemType_Actor.h" +#include "EnvironmentQuery/EnvQueryTypes.h" +#include "ShooterAIController.h" + +void UEnvQueryContext_Target::ProvideContext(FEnvQueryInstance& QueryInstance, FEnvQueryContextData& ContextData) const +{ + // get the controller from the query instance + if (AShooterAIController* Controller = Cast(QueryInstance.Owner)) + { + // ensure the target is valid + if (IsValid(Controller->GetCurrentTarget())) + { + // add the controller's target actor to the context + UEnvQueryItemType_Actor::SetContextHelper(ContextData, Controller->GetCurrentTarget()); + + } else { + + // if for any reason there's no target, default to the controller + UEnvQueryItemType_Actor::SetContextHelper(ContextData, Controller); + } + } + +} diff --git a/Source/first/Variant_Shooter/AI/EnvQueryContext_Target.h b/Source/first/Variant_Shooter/AI/EnvQueryContext_Target.h new file mode 100644 index 0000000..2754517 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/EnvQueryContext_Target.h @@ -0,0 +1,22 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "EnvironmentQuery/EnvQueryContext.h" +#include "EnvQueryContext_Target.generated.h" + +/** + * Custom EnvQuery Context that returns the actor currently targeted by an NPC + */ +UCLASS() +class FIRST_API UEnvQueryContext_Target : public UEnvQueryContext +{ + GENERATED_BODY() + +public: + + /** Provides the context locations or actors for this EnvQuery */ + virtual void ProvideContext(FEnvQueryInstance& QueryInstance, FEnvQueryContextData& ContextData) const override; + +}; diff --git a/Source/first/Variant_Shooter/AI/ShooterAIController.cpp b/Source/first/Variant_Shooter/AI/ShooterAIController.cpp new file mode 100644 index 0000000..f1697c3 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/ShooterAIController.cpp @@ -0,0 +1,74 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Shooter/AI/ShooterAIController.h" +#include "ShooterNPC.h" +#include "Components/StateTreeAIComponent.h" +#include "Perception/AIPerceptionComponent.h" +#include "Navigation/PathFollowingComponent.h" +#include "AI/Navigation/PathFollowingAgentInterface.h" + +AShooterAIController::AShooterAIController() +{ + // create the StateTree component + StateTreeAI = CreateDefaultSubobject(TEXT("StateTreeAI")); + + // create the AI perception component. It will be configured in BP + AIPerception = CreateDefaultSubobject(TEXT("AIPerception")); + + // subscribe to the AI perception delegates + AIPerception->OnTargetPerceptionUpdated.AddDynamic(this, &AShooterAIController::OnPerceptionUpdated); + AIPerception->OnTargetPerceptionForgotten.AddDynamic(this, &AShooterAIController::OnPerceptionForgotten); +} + +void AShooterAIController::OnPossess(APawn* InPawn) +{ + Super::OnPossess(InPawn); + + // ensure we're possessing an NPC + if (AShooterNPC* NPC = Cast(InPawn)) + { + // add the team tag to the pawn + NPC->Tags.Add(TeamTag); + + // subscribe to the pawn's OnDeath delegate + NPC->OnPawnDeath.AddDynamic(this, &AShooterAIController::OnPawnDeath); + } +} + +void AShooterAIController::OnPawnDeath() +{ + // stop movement + GetPathFollowingComponent()->AbortMove(*this, FPathFollowingResultFlags::UserAbort); + + // stop StateTree logic + StateTreeAI->StopLogic(FString("")); + + // unpossess the pawn + UnPossess(); + + // destroy this controller + Destroy(); +} + +void AShooterAIController::SetCurrentTarget(AActor* Target) +{ + TargetEnemy = Target; +} + +void AShooterAIController::ClearCurrentTarget() +{ + TargetEnemy = nullptr; +} + +void AShooterAIController::OnPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus) +{ + // pass the data to the StateTree delegate hook + OnShooterPerceptionUpdated.ExecuteIfBound(Actor, Stimulus); +} + +void AShooterAIController::OnPerceptionForgotten(AActor* Actor) +{ + // pass the data to the StateTree delegate hook + OnShooterPerceptionForgotten.ExecuteIfBound(Actor); +} diff --git a/Source/first/Variant_Shooter/AI/ShooterAIController.h b/Source/first/Variant_Shooter/AI/ShooterAIController.h new file mode 100644 index 0000000..7590f84 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/ShooterAIController.h @@ -0,0 +1,85 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "AIController.h" +#include "ShooterAIController.generated.h" + +class UStateTreeAIComponent; +class UAIPerceptionComponent; +struct FAIStimulus; + +DECLARE_DELEGATE_TwoParams(FShooterPerceptionUpdatedDelegate, AActor*, const FAIStimulus&); +DECLARE_DELEGATE_OneParam(FShooterPerceptionForgottenDelegate, AActor*); + +/** + * Simple AI Controller for a first person shooter enemy + */ +UCLASS(abstract) +class FIRST_API AShooterAIController : public AAIController +{ + GENERATED_BODY() + + /** Runs the behavior StateTree for this NPC */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UStateTreeAIComponent* StateTreeAI; + + /** Detects other actors through sight, hearing and other senses */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UAIPerceptionComponent* AIPerception; + +protected: + + /** Team tag for pawn friend or foe identification */ + UPROPERTY(EditAnywhere, Category="Shooter") + FName TeamTag = FName("Enemy"); + + /** Enemy currently being targeted */ + TObjectPtr TargetEnemy; + +public: + + /** Called when an AI perception has been updated. StateTree task delegate hook */ + FShooterPerceptionUpdatedDelegate OnShooterPerceptionUpdated; + + /** Called when an AI perception has been forgotten. StateTree task delegate hook */ + FShooterPerceptionForgottenDelegate OnShooterPerceptionForgotten; + +public: + + /** Constructor */ + AShooterAIController(); + +protected: + + /** Pawn initialization */ + virtual void OnPossess(APawn* InPawn) override; + +protected: + + /** Called when the possessed pawn dies */ + UFUNCTION() + void OnPawnDeath(); + +public: + + /** Sets the targeted enemy */ + void SetCurrentTarget(AActor* Target); + + /** Clears the targeted enemy */ + void ClearCurrentTarget(); + + /** Returns the targeted enemy */ + AActor* GetCurrentTarget() const { return TargetEnemy; }; + +protected: + + /** Called when the AI perception component updates a perception on a given actor */ + UFUNCTION() + void OnPerceptionUpdated(AActor* Actor, FAIStimulus Stimulus); + + /** Called when the AI perception component forgets a given actor */ + UFUNCTION() + void OnPerceptionForgotten(AActor* Actor); +}; diff --git a/Source/first/Variant_Shooter/AI/ShooterNPC.cpp b/Source/first/Variant_Shooter/AI/ShooterNPC.cpp new file mode 100644 index 0000000..6d59f15 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/ShooterNPC.cpp @@ -0,0 +1,208 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Shooter/AI/ShooterNPC.h" +#include "ShooterWeapon.h" +#include "Components/SkeletalMeshComponent.h" +#include "Camera/CameraComponent.h" +#include "Kismet/KismetMathLibrary.h" +#include "Engine/World.h" +#include "ShooterGameMode.h" +#include "Components/CapsuleComponent.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "TimerManager.h" + +void AShooterNPC::BeginPlay() +{ + Super::BeginPlay(); + + // spawn the weapon + FActorSpawnParameters SpawnParams; + SpawnParams.Owner = this; + SpawnParams.Instigator = this; + SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + + Weapon = GetWorld()->SpawnActor(WeaponClass, GetActorTransform(), SpawnParams); +} + +void AShooterNPC::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the death timer + GetWorld()->GetTimerManager().ClearTimer(DeathTimer); +} + +float AShooterNPC::TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) +{ + // ignore if already dead + if (bIsDead) + { + return 0.0f; + } + + // Reduce HP + CurrentHP -= Damage; + + // Have we depleted HP? + if (CurrentHP <= 0.0f) + { + Die(); + } + + return Damage; +} + +void AShooterNPC::AttachWeaponMeshes(AShooterWeapon* WeaponToAttach) +{ + const FAttachmentTransformRules AttachmentRule(EAttachmentRule::SnapToTarget, false); + + // attach the weapon actor + WeaponToAttach->AttachToActor(this, AttachmentRule); + + // attach the weapon meshes + WeaponToAttach->GetFirstPersonMesh()->AttachToComponent(GetFirstPersonMesh(), AttachmentRule, FirstPersonWeaponSocket); + WeaponToAttach->GetThirdPersonMesh()->AttachToComponent(GetMesh(), AttachmentRule, FirstPersonWeaponSocket); +} + +void AShooterNPC::PlayFiringMontage(UAnimMontage* Montage) +{ + // unused +} + +void AShooterNPC::AddWeaponRecoil(float Recoil) +{ + // unused +} + +void AShooterNPC::UpdateWeaponHUD(int32 CurrentAmmo, int32 MagazineSize) +{ + // unused +} + +FVector AShooterNPC::GetWeaponTargetLocation() +{ + // start aiming from the camera location + const FVector AimSource = GetFirstPersonCameraComponent()->GetComponentLocation(); + + FVector AimDir, AimTarget = FVector::ZeroVector; + + // do we have an aim target? + if (CurrentAimTarget) + { + // target the actor location + AimTarget = CurrentAimTarget->GetActorLocation(); + + // apply a vertical offset to target head/feet + AimTarget.Z += FMath::RandRange(MinAimOffsetZ, MaxAimOffsetZ); + + // get the aim direction and apply randomness in a cone + AimDir = (AimTarget - AimSource).GetSafeNormal(); + AimDir = UKismetMathLibrary::RandomUnitVectorInConeInDegrees(AimDir, AimVarianceHalfAngle); + + + } else { + + // no aim target, so just use the camera facing + AimDir = UKismetMathLibrary::RandomUnitVectorInConeInDegrees(GetFirstPersonCameraComponent()->GetForwardVector(), AimVarianceHalfAngle); + + } + + // calculate the unobstructed aim target location + AimTarget = AimSource + (AimDir * AimRange); + + // run a visibility trace to see if there's obstructions + FHitResult OutHit; + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + GetWorld()->LineTraceSingleByChannel(OutHit, AimSource, AimTarget, ECC_Visibility, QueryParams); + + // return either the impact point or the trace end + return OutHit.bBlockingHit ? OutHit.ImpactPoint : OutHit.TraceEnd; +} + +void AShooterNPC::AddWeaponClass(const TSubclassOf& InWeaponClass) +{ + // unused +} + +void AShooterNPC::OnWeaponActivated(AShooterWeapon* InWeapon) +{ + // unused +} + +void AShooterNPC::OnWeaponDeactivated(AShooterWeapon* InWeapon) +{ + // unused +} + +void AShooterNPC::OnSemiWeaponRefire() +{ + // are we still shooting? + if (bIsShooting) + { + // fire the weapon + Weapon->StartFiring(); + } +} + +void AShooterNPC::Die() +{ + // ignore if already dead + if (bIsDead) + { + return; + } + + // raise the dead flag + bIsDead = true; + + // increment the team score + if (AShooterGameMode* GM = Cast(GetWorld()->GetAuthGameMode())) + { + GM->IncrementTeamScore(TeamByte); + } + + // disable capsule collision + GetCapsuleComponent()->SetCollisionEnabled(ECollisionEnabled::NoCollision); + + // stop movement + GetCharacterMovement()->StopMovementImmediately(); + GetCharacterMovement()->StopActiveMovement(); + + // enable ragdoll physics on the third person mesh + GetMesh()->SetCollisionProfileName(RagdollCollisionProfile); + GetMesh()->SetSimulatePhysics(true); + GetMesh()->SetPhysicsBlendWeight(1.0f); + + // schedule actor destruction + GetWorld()->GetTimerManager().SetTimer(DeathTimer, this, &AShooterNPC::DeferredDestruction, DeferredDestructionTime, false); +} + +void AShooterNPC::DeferredDestruction() +{ + Destroy(); +} + +void AShooterNPC::StartShooting(AActor* ActorToShoot) +{ + // save the aim target + CurrentAimTarget = ActorToShoot; + + // raise the flag + bIsShooting = true; + + // signal the weapon + Weapon->StartFiring(); +} + +void AShooterNPC::StopShooting() +{ + // lower the flag + bIsShooting = false; + + // signal the weapon + Weapon->StopFiring(); +} diff --git a/Source/first/Variant_Shooter/AI/ShooterNPC.h b/Source/first/Variant_Shooter/AI/ShooterNPC.h new file mode 100644 index 0000000..40bc049 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/ShooterNPC.h @@ -0,0 +1,153 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "firstCharacter.h" +#include "ShooterWeaponHolder.h" +#include "ShooterNPC.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FPawnDeathDelegate); + +class AShooterWeapon; + +/** + * A simple AI-controlled shooter game NPC + * Executes its behavior through a StateTree managed by its AI Controller + * Holds and manages a weapon + */ +UCLASS(abstract) +class FIRST_API AShooterNPC : public AfirstCharacter, public IShooterWeaponHolder +{ + GENERATED_BODY() + +public: + + /** Current HP for this character. It dies if it reaches zero through damage */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Damage") + float CurrentHP = 100.0f; + +protected: + + /** Name of the collision profile to use during ragdoll death */ + UPROPERTY(EditAnywhere, Category="Damage") + FName RagdollCollisionProfile = FName("Ragdoll"); + + /** Time to wait after death before destroying this actor */ + UPROPERTY(EditAnywhere, Category="Damage") + float DeferredDestructionTime = 5.0f; + + /** Team byte for this character */ + UPROPERTY(EditAnywhere, Category="Team") + uint8 TeamByte = 1; + + /** Pointer to the equipped weapon */ + TObjectPtr Weapon; + + /** Type of weapon to spawn for this character */ + UPROPERTY(EditAnywhere, Category="Weapon") + TSubclassOf WeaponClass; + + /** Name of the first person mesh weapon socket */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category ="Weapons") + FName FirstPersonWeaponSocket = FName("HandGrip_R"); + + /** Name of the third person mesh weapon socket */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category ="Weapons") + FName ThirdPersonWeaponSocket = FName("HandGrip_R"); + + /** Max range for aiming calculations */ + UPROPERTY(EditAnywhere, Category="Aim") + float AimRange = 10000.0f; + + /** Cone variance to apply while aiming */ + UPROPERTY(EditAnywhere, Category="Aim") + float AimVarianceHalfAngle = 10.0f; + + /** Minimum vertical offset from the target center to apply when aiming */ + UPROPERTY(EditAnywhere, Category="Aim") + float MinAimOffsetZ = -35.0f; + + /** Maximum vertical offset from the target center to apply when aiming */ + UPROPERTY(EditAnywhere, Category="Aim") + float MaxAimOffsetZ = -60.0f; + + /** Actor currently being targeted */ + TObjectPtr CurrentAimTarget; + + /** If true, this character is currently shooting its weapon */ + bool bIsShooting = false; + + /** If true, this character has already died */ + bool bIsDead = false; + + /** Deferred destruction on death timer */ + FTimerHandle DeathTimer; + +public: + + /** Delegate called when this NPC dies */ + FPawnDeathDelegate OnPawnDeath; + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Gameplay cleanup */ + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + +public: + + /** Handle incoming damage */ + virtual float TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override; + +public: + + //~Begin IShooterWeaponHolder interface + + /** Attaches a weapon's meshes to the owner */ + virtual void AttachWeaponMeshes(AShooterWeapon* Weapon) override; + + /** Plays the firing montage for the weapon */ + virtual void PlayFiringMontage(UAnimMontage* Montage) override; + + /** Applies weapon recoil to the owner */ + virtual void AddWeaponRecoil(float Recoil) override; + + /** Updates the weapon's HUD with the current ammo count */ + virtual void UpdateWeaponHUD(int32 CurrentAmmo, int32 MagazineSize) override; + + /** Calculates and returns the aim location for the weapon */ + virtual FVector GetWeaponTargetLocation() override; + + /** Gives a weapon of this class to the owner */ + virtual void AddWeaponClass(const TSubclassOf& WeaponClass) override; + + /** Activates the passed weapon */ + virtual void OnWeaponActivated(AShooterWeapon* Weapon) override; + + /** Deactivates the passed weapon */ + virtual void OnWeaponDeactivated(AShooterWeapon* Weapon) override; + + /** Notifies the owner that the weapon cooldown has expired and it's ready to shoot again */ + virtual void OnSemiWeaponRefire() override; + + //~End IShooterWeaponHolder interface + +protected: + + /** Called when HP is depleted and the character should die */ + void Die(); + + /** Called after death to destroy the actor */ + void DeferredDestruction(); + +public: + + /** Signals this character to start shooting at the passed actor */ + void StartShooting(AActor* ActorToShoot); + + /** Signals this character to stop shooting */ + void StopShooting(); +}; diff --git a/Source/first/Variant_Shooter/AI/ShooterStateTreeUtility.cpp b/Source/first/Variant_Shooter/AI/ShooterStateTreeUtility.cpp new file mode 100644 index 0000000..6943378 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/ShooterStateTreeUtility.cpp @@ -0,0 +1,366 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Shooter/AI/ShooterStateTreeUtility.h" +#include "StateTreeExecutionContext.h" +#include "ShooterNPC.h" +#include "Camera/CameraComponent.h" +#include "AIController.h" +#include "Perception/AIPerceptionComponent.h" +#include "ShooterAIController.h" +#include "StateTreeAsyncExecutionContext.h" + +bool FStateTreeLineOfSightToTargetCondition::TestCondition(FStateTreeExecutionContext& Context) const +{ + const FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // ensure the target is valid + if (!IsValid(InstanceData.Target)) + { + return !InstanceData.bMustHaveLineOfSight; + } + + // check if the character is facing towards the target + const FVector TargetDir = (InstanceData.Target->GetActorLocation() - InstanceData.Character->GetActorLocation()).GetSafeNormal(); + + const float FacingDot = FVector::DotProduct(TargetDir, InstanceData.Character->GetActorForwardVector()); + const float MaxDot = FMath::Cos(FMath::DegreesToRadians(InstanceData.LineOfSightConeAngle)); + + // is the facing outside of our cone half angle? + if (FacingDot <= MaxDot) + { + return !InstanceData.bMustHaveLineOfSight; + } + + // get the target's bounding box + FVector CenterOfMass, Extent; + InstanceData.Target->GetActorBounds(true, CenterOfMass, Extent, false); + + // divide the vertical extent by the number of line of sight checks we'll do + const float ExtentZOffset = Extent.Z * 2.0f / InstanceData.NumberOfVerticalLineOfSightChecks; + + // get the character's camera location as the source for the line checks + const FVector Start = InstanceData.Character->GetFirstPersonCameraComponent()->GetComponentLocation(); + + // ignore the character and target. We want to ensure there's an unobstructed trace not counting them + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(InstanceData.Character); + QueryParams.AddIgnoredActor(InstanceData.Target); + + FHitResult OutHit; + + // run a number of vertically offset line traces to the target location + for (int32 i = 0; i < InstanceData.NumberOfVerticalLineOfSightChecks - 1; ++i) + { + // calculate the endpoint for the trace + const FVector End = CenterOfMass + FVector(0.0f, 0.0f, Extent.Z - ExtentZOffset * i); + + InstanceData.Character->GetWorld()->LineTraceSingleByChannel(OutHit, Start, End, ECC_Visibility, QueryParams); + + // is the trace unobstructed? + if (!OutHit.bBlockingHit) + { + // we only need one unobstructed trace, so terminate early + return InstanceData.bMustHaveLineOfSight; + } + } + + // no line of sight found + return !InstanceData.bMustHaveLineOfSight; +} + +#if WITH_EDITOR +FText FStateTreeLineOfSightToTargetCondition::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Has Line of Sight"); +} +#endif + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeFaceActorTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // set the AI Controller's focus + InstanceData.Controller->SetFocus(InstanceData.ActorToFaceTowards); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeFaceActorTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // clear the AI Controller's focus + InstanceData.Controller->ClearFocus(EAIFocusPriority::Gameplay); + } +} + +#if WITH_EDITOR +FText FStateTreeFaceActorTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Face Towards Actor"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeFaceLocationTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // set the AI Controller's focus + InstanceData.Controller->SetFocalPoint(InstanceData.FaceLocation); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeFaceLocationTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // clear the AI Controller's focus + InstanceData.Controller->ClearFocus(EAIFocusPriority::Gameplay); + } +} + +#if WITH_EDITOR +FText FStateTreeFaceLocationTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Face Towards Location"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeSetRandomFloatTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // calculate the output value + InstanceData.OutValue = FMath::RandRange(InstanceData.MinValue, InstanceData.MaxValue); + } + + return EStateTreeRunStatus::Running; +} + +#if WITH_EDITOR +FText FStateTreeSetRandomFloatTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Set Random Float"); +} +#endif // WITH_EDITOR + +//////////////////////////////////////////////////////////////////// + +EStateTreeRunStatus FStateTreeShootAtTargetTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // tell the character to shoot the target + InstanceData.Character->StartShooting(InstanceData.Target); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeShootAtTargetTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // tell the character to stop shooting + InstanceData.Character->StopShooting(); + } +} + +#if WITH_EDITOR +FText FStateTreeShootAtTargetTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Shoot at Target"); +} +#endif // WITH_EDITOR + +EStateTreeRunStatus FStateTreeSenseEnemiesTask::EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned from another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // bind the perception updated delegate on the controller + InstanceData.Controller->OnShooterPerceptionUpdated.BindLambda( + [WeakContext = Context.MakeWeakExecutionContext()](AActor* SensedActor, const FAIStimulus& Stimulus) + { + // get the instance data inside the lambda + const FStateTreeStrongExecutionContext StrongContext = WeakContext.MakeStrongExecutionContext(); + + if (FInstanceDataType* LambdaInstanceData = StrongContext.GetInstanceDataPtr()) + { + if (SensedActor->ActorHasTag(LambdaInstanceData->SenseTag)) + { + bool bDirectLOS = false; + + // calculate the direction of the stimulus + const FVector StimulusDir = (Stimulus.StimulusLocation - LambdaInstanceData->Character->GetActorLocation()).GetSafeNormal(); + + // infer the angle from the dot product between the character facing and the stimulus direction + const float DirDot = FVector::DotProduct(StimulusDir, LambdaInstanceData->Character->GetActorForwardVector()); + const float MaxDot = FMath::Cos(FMath::DegreesToRadians(LambdaInstanceData->DirectLineOfSightCone)); + + // is the direction within our perception cone? + if (DirDot >= MaxDot) + { + // run a line trace between the character and the sensed actor + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(LambdaInstanceData->Character); + QueryParams.AddIgnoredActor(SensedActor); + + FHitResult OutHit; + + // we have direct line of sight if this trace is unobstructed + bDirectLOS = !LambdaInstanceData->Character->GetWorld()->LineTraceSingleByChannel(OutHit, LambdaInstanceData->Character->GetActorLocation(), SensedActor->GetActorLocation(), ECC_Visibility, QueryParams); + + } + + // check if we have a direct line of sight to the stimulus + if (bDirectLOS) + { + // set the controller's target + LambdaInstanceData->Controller->SetCurrentTarget(SensedActor); + + // set the task output + LambdaInstanceData->TargetActor = SensedActor; + + // set the flags + LambdaInstanceData->bHasTarget = true; + LambdaInstanceData->bHasInvestigateLocation = false; + + // no direct line of sight to target + } else { + + // if we already have a target, ignore the partial sense and keep on them + if (!IsValid(LambdaInstanceData->TargetActor)) + { + // is this stimulus stronger than the last one we had? + if (Stimulus.Strength > LambdaInstanceData->LastStimulusStrength) + { + // update the stimulus strength + LambdaInstanceData->LastStimulusStrength = Stimulus.Strength; + + // set the investigate location + LambdaInstanceData->InvestigateLocation = Stimulus.StimulusLocation; + + // set the investigate flag + LambdaInstanceData->bHasInvestigateLocation = true; + } + } + } + } + } + } + ); + + // bind the perception forgotten delegate on the controller + InstanceData.Controller->OnShooterPerceptionForgotten.BindLambda( + [WeakContext = Context.MakeWeakExecutionContext()](AActor* SensedActor) + { + // get the instance data inside the lambda + FInstanceDataType* LambdaInstanceData = WeakContext.MakeStrongExecutionContext().GetInstanceDataPtr(); + + if (!LambdaInstanceData) + { + return; + } + + bool bForget = false; + + // are we forgetting the current target? + if (SensedActor == LambdaInstanceData->TargetActor) + { + bForget = true; + + } else { + + // are we forgetting about a partial sense? + if (!IsValid(LambdaInstanceData->TargetActor)) + { + bForget = true; + } + } + + if (bForget) + { + // clear the target + LambdaInstanceData->TargetActor = nullptr; + + // clear the flags + LambdaInstanceData->bHasInvestigateLocation = false; + LambdaInstanceData->bHasTarget = false; + + // reset the stimulus strength + LambdaInstanceData->LastStimulusStrength = 0.0f; + + // clear the target on the controller + LambdaInstanceData->Controller->ClearCurrentTarget(); + LambdaInstanceData->Controller->ClearFocus(EAIFocusPriority::Gameplay); + } + + } + ); + } + + return EStateTreeRunStatus::Running; +} + +void FStateTreeSenseEnemiesTask::ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const +{ + // have we transitioned to another state? + if (Transition.ChangeType == EStateTreeStateChangeType::Changed) + { + // get the instance data + FInstanceDataType& InstanceData = Context.GetInstanceData(*this); + + // unbind the perception delegates + InstanceData.Controller->OnShooterPerceptionUpdated.Unbind(); + InstanceData.Controller->OnShooterPerceptionForgotten.Unbind(); + } +} + +#if WITH_EDITOR +FText FStateTreeSenseEnemiesTask::GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting /*= EStateTreeNodeFormatting::Text*/) const +{ + return FText::FromString("Sense Enemies"); +} +#endif // WITH_EDITOR \ No newline at end of file diff --git a/Source/first/Variant_Shooter/AI/ShooterStateTreeUtility.h b/Source/first/Variant_Shooter/AI/ShooterStateTreeUtility.h new file mode 100644 index 0000000..a9e24c8 --- /dev/null +++ b/Source/first/Variant_Shooter/AI/ShooterStateTreeUtility.h @@ -0,0 +1,309 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "StateTreeTaskBase.h" +#include "StateTreeConditionBase.h" + +#include "ShooterStateTreeUtility.generated.h" + +class AShooterNPC; +class AAIController; +class AShooterAIController; + +/** + * Instance data struct for the FStateTreeLineOfSightToTargetCondition condition + */ +USTRUCT() +struct FStateTreeLineOfSightToTargetConditionInstanceData +{ + GENERATED_BODY() + + /** Targeting character */ + UPROPERTY(EditAnywhere, Category = "Context") + AShooterNPC* Character; + + /** Target to check line of sight for */ + UPROPERTY(EditAnywhere, Category = "Condition") + AActor* Target; + + /** Max allowed line of sight cone angle, in degrees */ + UPROPERTY(EditAnywhere, Category = "Condition") + float LineOfSightConeAngle = 35.0f; + + /** Number of vertical line of sight checks to run to try and get around low obstacles */ + UPROPERTY(EditAnywhere, Category = "Condition") + int32 NumberOfVerticalLineOfSightChecks = 5; + + /** If true, the condition passes if the character has line of sight */ + UPROPERTY(EditAnywhere, Category = "Condition") + bool bMustHaveLineOfSight = true; +}; +STATETREE_POD_INSTANCEDATA(FStateTreeLineOfSightToTargetConditionInstanceData); + +/** + * StateTree condition to check if the character is grounded + */ +USTRUCT(DisplayName = "Has Line of Sight to Target", Category="Shooter") +struct FStateTreeLineOfSightToTargetCondition : public FStateTreeConditionCommonBase +{ + GENERATED_BODY() + + /** Set the instance data type */ + using FInstanceDataType = FStateTreeLineOfSightToTargetConditionInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Default constructor */ + FStateTreeLineOfSightToTargetCondition() = default; + + /** Tests the StateTree condition */ + virtual bool TestCondition(FStateTreeExecutionContext& Context) const override; + +#if WITH_EDITOR + /** Provides the description string */ + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif + +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Face Towards Actor StateTree task + */ +USTRUCT() +struct FStateTreeFaceActorInstanceData +{ + GENERATED_BODY() + + /** AI Controller that will determine the focused actor */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Controller; + + /** Actor that will be faced towards */ + UPROPERTY(EditAnywhere, Category = Input) + TObjectPtr ActorToFaceTowards; +}; + +/** + * StateTree task to face an AI-Controlled Pawn towards an Actor + */ +USTRUCT(meta=(DisplayName="Face Towards Actor", Category="Shooter")) +struct FStateTreeFaceActorTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeFaceActorInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Face Towards Location StateTree task + */ +USTRUCT() +struct FStateTreeFaceLocationInstanceData +{ + GENERATED_BODY() + + /** AI Controller that will determine the focused location */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Controller; + + /** Location that will be faced towards */ + UPROPERTY(EditAnywhere, Category = Parameter) + FVector FaceLocation = FVector::ZeroVector; +}; + +/** + * StateTree task to face an AI-Controlled Pawn towards a world location + */ +USTRUCT(meta=(DisplayName="Face Towards Location", Category="Shooter")) +struct FStateTreeFaceLocationTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeFaceLocationInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Set Random Float StateTree task + */ +USTRUCT() +struct FStateTreeSetRandomFloatData +{ + GENERATED_BODY() + + /** Minimum random value */ + UPROPERTY(EditAnywhere, Category = Parameter) + float MinValue = 0.0f; + + /** Maximum random value */ + UPROPERTY(EditAnywhere, Category = Parameter) + float MaxValue = 0.0f; + + /** Output calculated value */ + UPROPERTY(EditAnywhere, Category = Output) + float OutValue = 0.0f; +}; + +/** + * StateTree task to calculate a random float value within the specified range + */ +USTRUCT(meta=(DisplayName="Set Random Float", Category="Shooter")) +struct FStateTreeSetRandomFloatTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeSetRandomFloatData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Shoot At Target StateTree task + */ +USTRUCT() +struct FStateTreeShootAtTargetInstanceData +{ + GENERATED_BODY() + + /** NPC that will do the shooting */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Character; + + /** Target to shoot at */ + UPROPERTY(EditAnywhere, Category = Input) + TObjectPtr Target; +}; + +/** + * StateTree task to have an NPC shoot at an actor + */ +USTRUCT(meta=(DisplayName="Shoot at Target", Category="Shooter")) +struct FStateTreeShootAtTargetTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeShootAtTargetInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// + +/** + * Instance data struct for the Sense Enemies StateTree task + */ +USTRUCT() +struct FStateTreeSenseEnemiesInstanceData +{ + GENERATED_BODY() + + /** Sensing AI Controller */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Controller; + + /** Sensing NPC */ + UPROPERTY(EditAnywhere, Category = Context) + TObjectPtr Character; + + /** Sensed actor to target */ + UPROPERTY(EditAnywhere, Category = Output) + TObjectPtr TargetActor; + + /** Sensed location to investigate */ + UPROPERTY(EditAnywhere, Category = Output) + FVector InvestigateLocation = FVector::ZeroVector; + + /** True if a target was successfully sensed */ + UPROPERTY(EditAnywhere, Category = Output) + bool bHasTarget = false; + + /** True if an investigate location was successfully sensed */ + UPROPERTY(EditAnywhere, Category = Output) + bool bHasInvestigateLocation = false; + + /** Tag required on sensed actors */ + UPROPERTY(EditAnywhere, Category = Parameter) + FName SenseTag = FName("Player"); + + /** Line of sight cone half angle to consider a full sense */ + UPROPERTY(EditAnywhere, Category = Parameter) + float DirectLineOfSightCone = 85.0f; + + /** Strength of the last processed stimulus */ + UPROPERTY(EditAnywhere) + float LastStimulusStrength = 0.0f; +}; + +/** + * StateTree task to have an NPC process AI Perceptions and sense nearby enemies + */ +USTRUCT(meta=(DisplayName="Sense Enemies", Category="Shooter")) +struct FStateTreeSenseEnemiesTask : public FStateTreeTaskCommonBase +{ + GENERATED_BODY() + + /* Ensure we're using the correct instance data struct */ + using FInstanceDataType = FStateTreeSenseEnemiesInstanceData; + virtual const UStruct* GetInstanceDataType() const override { return FInstanceDataType::StaticStruct(); } + + /** Runs when the owning state is entered */ + virtual EStateTreeRunStatus EnterState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + + /** Runs when the owning state is ended */ + virtual void ExitState(FStateTreeExecutionContext& Context, const FStateTreeTransitionResult& Transition) const override; + +#if WITH_EDITOR + virtual FText GetDescription(const FGuid& ID, FStateTreeDataView InstanceDataView, const IStateTreeBindingLookup& BindingLookup, EStateTreeNodeFormatting Formatting = EStateTreeNodeFormatting::Text) const override; +#endif // WITH_EDITOR +}; + +//////////////////////////////////////////////////////////////////// \ No newline at end of file diff --git a/Source/first/Variant_Shooter/ShooterCharacter.cpp b/Source/first/Variant_Shooter/ShooterCharacter.cpp new file mode 100644 index 0000000..2b522c9 --- /dev/null +++ b/Source/first/Variant_Shooter/ShooterCharacter.cpp @@ -0,0 +1,283 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterCharacter.h" +#include "ShooterWeapon.h" +#include "EnhancedInputComponent.h" +#include "Components/InputComponent.h" +#include "Components/PawnNoiseEmitterComponent.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "Components/SkeletalMeshComponent.h" +#include "Engine/World.h" +#include "Camera/CameraComponent.h" +#include "TimerManager.h" +#include "ShooterGameMode.h" + +AShooterCharacter::AShooterCharacter() +{ + // create the noise emitter component + PawnNoiseEmitter = CreateDefaultSubobject(TEXT("Pawn Noise Emitter")); + + // configure movement + GetCharacterMovement()->RotationRate = FRotator(0.0f, 600.0f, 0.0f); +} + +void AShooterCharacter::BeginPlay() +{ + Super::BeginPlay(); + + // reset HP to max + CurrentHP = MaxHP; + + // update the HUD + OnDamaged.Broadcast(1.0f); +} + +void AShooterCharacter::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the respawn timer + GetWorld()->GetTimerManager().ClearTimer(RespawnTimer); +} + +void AShooterCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + // base class handles move, aim and jump inputs + Super::SetupPlayerInputComponent(PlayerInputComponent); + + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + // Firing + EnhancedInputComponent->BindAction(FireAction, ETriggerEvent::Started, this, &AShooterCharacter::DoStartFiring); + EnhancedInputComponent->BindAction(FireAction, ETriggerEvent::Completed, this, &AShooterCharacter::DoStopFiring); + + // Switch weapon + EnhancedInputComponent->BindAction(SwitchWeaponAction, ETriggerEvent::Triggered, this, &AShooterCharacter::DoSwitchWeapon); + } + +} + +float AShooterCharacter::TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) +{ + // ignore if already dead + if (CurrentHP <= 0.0f) + { + return 0.0f; + } + + // Reduce HP + CurrentHP -= Damage; + + // Have we depleted HP? + if (CurrentHP <= 0.0f) + { + Die(); + } + + // update the HUD + OnDamaged.Broadcast(FMath::Max(0.0f, CurrentHP / MaxHP)); + + return Damage; +} + +void AShooterCharacter::DoStartFiring() +{ + // fire the current weapon + if (CurrentWeapon) + { + CurrentWeapon->StartFiring(); + } +} + +void AShooterCharacter::DoStopFiring() +{ + // stop firing the current weapon + if (CurrentWeapon) + { + CurrentWeapon->StopFiring(); + } +} + +void AShooterCharacter::DoSwitchWeapon() +{ + // ensure we have at least two weapons two switch between + if (OwnedWeapons.Num() > 1) + { + // deactivate the old weapon + CurrentWeapon->DeactivateWeapon(); + + // find the index of the current weapon in the owned list + int32 WeaponIndex = OwnedWeapons.Find(CurrentWeapon); + + // is this the last weapon? + if (WeaponIndex == OwnedWeapons.Num() - 1) + { + // loop back to the beginning of the array + WeaponIndex = 0; + } + else { + // select the next weapon index + ++WeaponIndex; + } + + // set the new weapon as current + CurrentWeapon = OwnedWeapons[WeaponIndex]; + + // activate the new weapon + CurrentWeapon->ActivateWeapon(); + } +} + +void AShooterCharacter::AttachWeaponMeshes(AShooterWeapon* Weapon) +{ + const FAttachmentTransformRules AttachmentRule(EAttachmentRule::SnapToTarget, false); + + // attach the weapon actor + Weapon->AttachToActor(this, AttachmentRule); + + // attach the weapon meshes + Weapon->GetFirstPersonMesh()->AttachToComponent(GetFirstPersonMesh(), AttachmentRule, FirstPersonWeaponSocket); + Weapon->GetThirdPersonMesh()->AttachToComponent(GetMesh(), AttachmentRule, FirstPersonWeaponSocket); + +} + +void AShooterCharacter::PlayFiringMontage(UAnimMontage* Montage) +{ + +} + +void AShooterCharacter::AddWeaponRecoil(float Recoil) +{ + // apply the recoil as pitch input + AddControllerPitchInput(Recoil); +} + +void AShooterCharacter::UpdateWeaponHUD(int32 CurrentAmmo, int32 MagazineSize) +{ + OnBulletCountUpdated.Broadcast(MagazineSize, CurrentAmmo); +} + +FVector AShooterCharacter::GetWeaponTargetLocation() +{ + // trace ahead from the camera viewpoint + FHitResult OutHit; + + const FVector Start = GetFirstPersonCameraComponent()->GetComponentLocation(); + const FVector End = Start + (GetFirstPersonCameraComponent()->GetForwardVector() * MaxAimDistance); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + + GetWorld()->LineTraceSingleByChannel(OutHit, Start, End, ECC_Visibility, QueryParams); + + // return either the impact point or the trace end + return OutHit.bBlockingHit ? OutHit.ImpactPoint : OutHit.TraceEnd; +} + +void AShooterCharacter::AddWeaponClass(const TSubclassOf& WeaponClass) +{ + // do we already own this weapon? + AShooterWeapon* OwnedWeapon = FindWeaponOfType(WeaponClass); + + if (!OwnedWeapon) + { + // spawn the new weapon + FActorSpawnParameters SpawnParams; + SpawnParams.Owner = this; + SpawnParams.Instigator = this; + SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + SpawnParams.TransformScaleMethod = ESpawnActorScaleMethod::MultiplyWithRoot; + + AShooterWeapon* AddedWeapon = GetWorld()->SpawnActor(WeaponClass, GetActorTransform(), SpawnParams); + + if (AddedWeapon) + { + // add the weapon to the owned list + OwnedWeapons.Add(AddedWeapon); + + // if we have an existing weapon, deactivate it + if (CurrentWeapon) + { + CurrentWeapon->DeactivateWeapon(); + } + + // switch to the new weapon + CurrentWeapon = AddedWeapon; + CurrentWeapon->ActivateWeapon(); + } + } +} + +void AShooterCharacter::OnWeaponActivated(AShooterWeapon* Weapon) +{ + // update the bullet counter + OnBulletCountUpdated.Broadcast(Weapon->GetMagazineSize(), Weapon->GetBulletCount()); + + // set the character mesh AnimInstances + GetFirstPersonMesh()->SetAnimInstanceClass(Weapon->GetFirstPersonAnimInstanceClass()); + GetMesh()->SetAnimInstanceClass(Weapon->GetThirdPersonAnimInstanceClass()); +} + +void AShooterCharacter::OnWeaponDeactivated(AShooterWeapon* Weapon) +{ + // unused +} + +void AShooterCharacter::OnSemiWeaponRefire() +{ + // unused +} + +AShooterWeapon* AShooterCharacter::FindWeaponOfType(TSubclassOf WeaponClass) const +{ + // check each owned weapon + for (AShooterWeapon* Weapon : OwnedWeapons) + { + if (Weapon->IsA(WeaponClass)) + { + return Weapon; + } + } + + // weapon not found + return nullptr; + +} + +void AShooterCharacter::Die() +{ + // deactivate the weapon + if (IsValid(CurrentWeapon)) + { + CurrentWeapon->DeactivateWeapon(); + } + + // increment the team score + if (AShooterGameMode* GM = Cast(GetWorld()->GetAuthGameMode())) + { + GM->IncrementTeamScore(TeamByte); + } + + // stop character movement + GetCharacterMovement()->StopMovementImmediately(); + + // disable controls + DisableInput(nullptr); + + // reset the bullet counter UI + OnBulletCountUpdated.Broadcast(0, 0); + + // call the BP handler + BP_OnDeath(); + + // schedule character respawn + GetWorld()->GetTimerManager().SetTimer(RespawnTimer, this, &AShooterCharacter::OnRespawn, RespawnTime, false); +} + +void AShooterCharacter::OnRespawn() +{ + // destroy the character to force the PC to respawn + Destroy(); +} diff --git a/Source/first/Variant_Shooter/ShooterCharacter.h b/Source/first/Variant_Shooter/ShooterCharacter.h new file mode 100644 index 0000000..84350d8 --- /dev/null +++ b/Source/first/Variant_Shooter/ShooterCharacter.h @@ -0,0 +1,166 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "firstCharacter.h" +#include "ShooterWeaponHolder.h" +#include "ShooterCharacter.generated.h" + +class AShooterWeapon; +class UInputAction; +class UInputComponent; +class UPawnNoiseEmitterComponent; + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_TwoParams(FBulletCountUpdatedDelegate, int32, MagazineSize, int32, Bullets); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FDamagedDelegate, float, LifePercent); + +/** + * A player controllable first person shooter character + * Manages a weapon inventory through the IShooterWeaponHolder interface + * Manages health and death + */ +UCLASS(abstract) +class FIRST_API AShooterCharacter : public AfirstCharacter, public IShooterWeaponHolder +{ + GENERATED_BODY() + + /** AI Noise emitter component */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UPawnNoiseEmitterComponent* PawnNoiseEmitter; + +protected: + + /** Fire weapon input action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* FireAction; + + /** Switch weapon input action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* SwitchWeaponAction; + + /** Name of the first person mesh weapon socket */ + UPROPERTY(EditAnywhere, Category ="Weapons") + FName FirstPersonWeaponSocket = FName("HandGrip_R"); + + /** Name of the third person mesh weapon socket */ + UPROPERTY(EditAnywhere, Category ="Weapons") + FName ThirdPersonWeaponSocket = FName("HandGrip_R"); + + /** Max distance to use for aim traces */ + UPROPERTY(EditAnywhere, Category ="Aim", meta = (ClampMin = 0, ClampMax = 100000, Units = "cm")) + float MaxAimDistance = 10000.0f; + + /** Max HP this character can have */ + UPROPERTY(EditAnywhere, Category="Health") + float MaxHP = 500.0f; + + /** Current HP remaining to this character */ + float CurrentHP = 0.0f; + + /** Team ID for this character*/ + UPROPERTY(EditAnywhere, Category="Team") + uint8 TeamByte = 0; + + /** List of weapons picked up by the character */ + TArray OwnedWeapons; + + /** Weapon currently equipped and ready to shoot with */ + TObjectPtr CurrentWeapon; + + UPROPERTY(EditAnywhere, Category ="Destruction", meta = (ClampMin = 0, ClampMax = 10, Units = "s")) + float RespawnTime = 5.0f; + + FTimerHandle RespawnTimer; + +public: + + /** Bullet count updated delegate */ + FBulletCountUpdatedDelegate OnBulletCountUpdated; + + /** Damaged delegate */ + FDamagedDelegate OnDamaged; + +public: + + /** Constructor */ + AShooterCharacter(); + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Gameplay cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + + /** Set up input action bindings */ + virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override; + +public: + + /** Handle incoming damage */ + virtual float TakeDamage(float Damage, struct FDamageEvent const& DamageEvent, AController* EventInstigator, AActor* DamageCauser) override; + +public: + + /** Handles start firing input */ + UFUNCTION(BlueprintCallable, Category="Input") + void DoStartFiring(); + + /** Handles stop firing input */ + UFUNCTION(BlueprintCallable, Category="Input") + void DoStopFiring(); + + /** Handles switch weapon input */ + UFUNCTION(BlueprintCallable, Category="Input") + void DoSwitchWeapon(); + +public: + + //~Begin IShooterWeaponHolder interface + + /** Attaches a weapon's meshes to the owner */ + virtual void AttachWeaponMeshes(AShooterWeapon* Weapon) override; + + /** Plays the firing montage for the weapon */ + virtual void PlayFiringMontage(UAnimMontage* Montage) override; + + /** Applies weapon recoil to the owner */ + virtual void AddWeaponRecoil(float Recoil) override; + + /** Updates the weapon's HUD with the current ammo count */ + virtual void UpdateWeaponHUD(int32 CurrentAmmo, int32 MagazineSize) override; + + /** Calculates and returns the aim location for the weapon */ + virtual FVector GetWeaponTargetLocation() override; + + /** Gives a weapon of this class to the owner */ + virtual void AddWeaponClass(const TSubclassOf& WeaponClass) override; + + /** Activates the passed weapon */ + virtual void OnWeaponActivated(AShooterWeapon* Weapon) override; + + /** Deactivates the passed weapon */ + virtual void OnWeaponDeactivated(AShooterWeapon* Weapon) override; + + /** Notifies the owner that the weapon cooldown has expired and it's ready to shoot again */ + virtual void OnSemiWeaponRefire() override; + + //~End IShooterWeaponHolder interface + +protected: + + /** Returns true if the character already owns a weapon of the given class */ + AShooterWeapon* FindWeaponOfType(TSubclassOf WeaponClass) const; + + /** Called when this character's HP is depleted */ + void Die(); + + /** Called to allow Blueprint code to react to this character's death */ + UFUNCTION(BlueprintImplementableEvent, Category="Shooter", meta = (DisplayName = "On Death")) + void BP_OnDeath(); + + /** Called from the respawn timer to destroy this character and force the PC to respawn */ + void OnRespawn(); +}; diff --git a/Source/first/Variant_Shooter/ShooterGameMode.cpp b/Source/first/Variant_Shooter/ShooterGameMode.cpp new file mode 100644 index 0000000..2a56327 --- /dev/null +++ b/Source/first/Variant_Shooter/ShooterGameMode.cpp @@ -0,0 +1,33 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Shooter/ShooterGameMode.h" +#include "ShooterUI.h" +#include "Kismet/GameplayStatics.h" +#include "Engine/World.h" + +void AShooterGameMode::BeginPlay() +{ + Super::BeginPlay(); + + // create the UI + ShooterUI = CreateWidget(UGameplayStatics::GetPlayerController(GetWorld(), 0), ShooterUIClass); + ShooterUI->AddToViewport(0); +} + +void AShooterGameMode::IncrementTeamScore(uint8 TeamByte) +{ + // retrieve the team score if any + int32 Score = 0; + if (int32* FoundScore = TeamScores.Find(TeamByte)) + { + Score = *FoundScore; + } + + // increment the score for the given team + ++Score; + TeamScores.Add(TeamByte, Score); + + // update the UI + ShooterUI->BP_UpdateScore(TeamByte, Score); +} diff --git a/Source/first/Variant_Shooter/ShooterGameMode.h b/Source/first/Variant_Shooter/ShooterGameMode.h new file mode 100644 index 0000000..d0a5325 --- /dev/null +++ b/Source/first/Variant_Shooter/ShooterGameMode.h @@ -0,0 +1,42 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "ShooterGameMode.generated.h" + +class UShooterUI; + +/** + * Simple GameMode for a first person shooter game + * Manages game UI + * Keeps track of team scores + */ +UCLASS(abstract) +class FIRST_API AShooterGameMode : public AGameModeBase +{ + GENERATED_BODY() + +protected: + + /** Type of UI widget to spawn */ + UPROPERTY(EditAnywhere, Category="Shooter") + TSubclassOf ShooterUIClass; + + /** Pointer to the UI widget */ + TObjectPtr ShooterUI; + + /** Map of scores by team ID */ + TMap TeamScores; + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + +public: + + /** Increases the score for the given team */ + void IncrementTeamScore(uint8 TeamByte); +}; diff --git a/Source/first/Variant_Shooter/ShooterPlayerController.cpp b/Source/first/Variant_Shooter/ShooterPlayerController.cpp new file mode 100644 index 0000000..fe05d90 --- /dev/null +++ b/Source/first/Variant_Shooter/ShooterPlayerController.cpp @@ -0,0 +1,142 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "Variant_Shooter/ShooterPlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "Engine/LocalPlayer.h" +#include "InputMappingContext.h" +#include "Kismet/GameplayStatics.h" +#include "GameFramework/PlayerStart.h" +#include "ShooterCharacter.h" +#include "ShooterBulletCounterUI.h" +#include "first.h" +#include "Widgets/Input/SVirtualJoystick.h" + +void AShooterPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + // only spawn touch controls on local player controllers + if (IsLocalPlayerController()) + { + if (SVirtualJoystick::ShouldDisplayTouchInterface()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(Logfirst, Error, TEXT("Could not spawn mobile controls widget.")); + + } + } + + // create the bullet counter widget and add it to the screen + BulletCounterUI = CreateWidget(this, BulletCounterUIClass); + + if (BulletCounterUI) + { + BulletCounterUI->AddToPlayerScreen(0); + + } else { + + UE_LOG(Logfirst, Error, TEXT("Could not spawn bullet counter widget.")); + + } + + } +} + +void AShooterPlayerController::SetupInputComponent() +{ + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // add the input mapping contexts + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!SVirtualJoystick::ShouldDisplayTouchInterface()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } +} + +void AShooterPlayerController::OnPossess(APawn* InPawn) +{ + Super::OnPossess(InPawn); + + // subscribe to the pawn's OnDestroyed delegate + InPawn->OnDestroyed.AddDynamic(this, &AShooterPlayerController::OnPawnDestroyed); + + // is this a shooter character? + if (AShooterCharacter* ShooterCharacter = Cast(InPawn)) + { + // add the player tag + ShooterCharacter->Tags.Add(PlayerPawnTag); + + // subscribe to the pawn's delegates + ShooterCharacter->OnBulletCountUpdated.AddDynamic(this, &AShooterPlayerController::OnBulletCountUpdated); + ShooterCharacter->OnDamaged.AddDynamic(this, &AShooterPlayerController::OnPawnDamaged); + + // force update the life bar + ShooterCharacter->OnDamaged.Broadcast(1.0f); + } +} + +void AShooterPlayerController::OnPawnDestroyed(AActor* DestroyedActor) +{ + // reset the bullet counter HUD + BulletCounterUI->BP_UpdateBulletCounter(0, 0); + + // find the player start + TArray ActorList; + UGameplayStatics::GetAllActorsOfClass(GetWorld(), APlayerStart::StaticClass(), ActorList); + + if (ActorList.Num() > 0) + { + // select a random player start + AActor* RandomPlayerStart = ActorList[FMath::RandRange(0, ActorList.Num() - 1)]; + + // spawn a character at the player start + const FTransform SpawnTransform = RandomPlayerStart->GetActorTransform(); + + if (AShooterCharacter* RespawnedCharacter = GetWorld()->SpawnActor(CharacterClass, SpawnTransform)) + { + // possess the character + Possess(RespawnedCharacter); + } + } +} + +void AShooterPlayerController::OnBulletCountUpdated(int32 MagazineSize, int32 Bullets) +{ + // update the UI + if (BulletCounterUI) + { + BulletCounterUI->BP_UpdateBulletCounter(MagazineSize, Bullets); + } +} + +void AShooterPlayerController::OnPawnDamaged(float LifePercent) +{ + if (IsValid(BulletCounterUI)) + { + BulletCounterUI->BP_Damaged(LifePercent); + } +} diff --git a/Source/first/Variant_Shooter/ShooterPlayerController.h b/Source/first/Variant_Shooter/ShooterPlayerController.h new file mode 100644 index 0000000..4e0568b --- /dev/null +++ b/Source/first/Variant_Shooter/ShooterPlayerController.h @@ -0,0 +1,77 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "ShooterPlayerController.generated.h" + +class UInputMappingContext; +class AShooterCharacter; +class UShooterBulletCounterUI; + +/** + * Simple PlayerController for a first person shooter game + * Manages input mappings + * Respawns the player pawn when it's destroyed + */ +UCLASS(abstract) +class FIRST_API AShooterPlayerController : public APlayerController +{ + GENERATED_BODY() + +protected: + + /** Input mapping contexts for this player */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + TObjectPtr MobileControlsWidget; + + /** Character class to respawn when the possessed pawn is destroyed */ + UPROPERTY(EditAnywhere, Category="Shooter|Respawn") + TSubclassOf CharacterClass; + + /** Type of bullet counter UI widget to spawn */ + UPROPERTY(EditAnywhere, Category="Shooter|UI") + TSubclassOf BulletCounterUIClass; + + /** Tag to grant the possessed pawn to flag it as the player */ + UPROPERTY(EditAnywhere, Category="Shooter|Player") + FName PlayerPawnTag = FName("Player"); + + /** Pointer to the bullet counter UI widget */ + TObjectPtr BulletCounterUI; + +protected: + + /** Gameplay Initialization */ + virtual void BeginPlay() override; + + /** Initialize input bindings */ + virtual void SetupInputComponent() override; + + /** Pawn initialization */ + virtual void OnPossess(APawn* InPawn) override; + + /** Called if the possessed pawn is destroyed */ + UFUNCTION() + void OnPawnDestroyed(AActor* DestroyedActor); + + /** Called when the bullet count on the possessed pawn is updated */ + UFUNCTION() + void OnBulletCountUpdated(int32 MagazineSize, int32 Bullets); + + /** Called when the possessed pawn is damaged */ + UFUNCTION() + void OnPawnDamaged(float LifePercent); +}; diff --git a/Source/first/Variant_Shooter/UI/ShooterBulletCounterUI.cpp b/Source/first/Variant_Shooter/UI/ShooterBulletCounterUI.cpp new file mode 100644 index 0000000..c6ccd39 --- /dev/null +++ b/Source/first/Variant_Shooter/UI/ShooterBulletCounterUI.cpp @@ -0,0 +1,5 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterBulletCounterUI.h" + diff --git a/Source/first/Variant_Shooter/UI/ShooterBulletCounterUI.h b/Source/first/Variant_Shooter/UI/ShooterBulletCounterUI.h new file mode 100644 index 0000000..e57058d --- /dev/null +++ b/Source/first/Variant_Shooter/UI/ShooterBulletCounterUI.h @@ -0,0 +1,26 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "ShooterBulletCounterUI.generated.h" + +/** + * Simple bullet counter UI widget for a first person shooter game + */ +UCLASS(abstract) +class FIRST_API UShooterBulletCounterUI : public UUserWidget +{ + GENERATED_BODY() + +public: + + /** Allows Blueprint to update sub-widgets with the new bullet count */ + UFUNCTION(BlueprintImplementableEvent, Category="Shooter", meta=(DisplayName = "UpdateBulletCounter")) + void BP_UpdateBulletCounter(int32 MagazineSize, int32 BulletCount); + + /** Allows Blueprint to update sub-widgets with the new life total and play a damage effect on the HUD */ + UFUNCTION(BlueprintImplementableEvent, Category="Shooter", meta=(DisplayName = "Damaged")) + void BP_Damaged(float LifePercent); +}; diff --git a/Source/first/Variant_Shooter/UI/ShooterUI.cpp b/Source/first/Variant_Shooter/UI/ShooterUI.cpp new file mode 100644 index 0000000..c656497 --- /dev/null +++ b/Source/first/Variant_Shooter/UI/ShooterUI.cpp @@ -0,0 +1,5 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterUI.h" + diff --git a/Source/first/Variant_Shooter/UI/ShooterUI.h b/Source/first/Variant_Shooter/UI/ShooterUI.h new file mode 100644 index 0000000..fc46c7e --- /dev/null +++ b/Source/first/Variant_Shooter/UI/ShooterUI.h @@ -0,0 +1,22 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Blueprint/UserWidget.h" +#include "ShooterUI.generated.h" + +/** + * Simple scoreboard UI for a first person shooter game + */ +UCLASS(abstract) +class FIRST_API UShooterUI : public UUserWidget +{ + GENERATED_BODY() + +public: + + /** Allows Blueprint to update score sub-widgets */ + UFUNCTION(BlueprintImplementableEvent, Category="Shooter", meta = (DisplayName = "Update Score")) + void BP_UpdateScore(uint8 TeamByte, int32 Score); +}; diff --git a/Source/first/Variant_Shooter/Weapons/ShooterPickup.cpp b/Source/first/Variant_Shooter/Weapons/ShooterPickup.cpp new file mode 100644 index 0000000..e0205d3 --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterPickup.cpp @@ -0,0 +1,108 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterPickup.h" +#include "Components/SceneComponent.h" +#include "Components/SphereComponent.h" +#include "Components/StaticMeshComponent.h" +#include "ShooterWeaponHolder.h" +#include "ShooterWeapon.h" +#include "Engine/World.h" +#include "TimerManager.h" + +AShooterPickup::AShooterPickup() +{ + PrimaryActorTick.bCanEverTick = true; + + // create the root + RootComponent = CreateDefaultSubobject(TEXT("Root")); + + // create the collision sphere + SphereCollision = CreateDefaultSubobject(TEXT("Sphere Collision")); + SphereCollision->SetupAttachment(RootComponent); + + SphereCollision->SetRelativeLocation(FVector(0.0f, 0.0f, 84.0f)); + SphereCollision->SetCollisionEnabled(ECollisionEnabled::QueryOnly); + SphereCollision->SetCollisionObjectType(ECC_WorldStatic); + SphereCollision->SetCollisionResponseToAllChannels(ECR_Ignore); + SphereCollision->SetCollisionResponseToChannel(ECC_Pawn, ECR_Overlap); + SphereCollision->bFillCollisionUnderneathForNavmesh = true; + + // subscribe to the collision overlap on the sphere + SphereCollision->OnComponentBeginOverlap.AddDynamic(this, &AShooterPickup::OnOverlap); + + // create the mesh + Mesh = CreateDefaultSubobject(TEXT("Mesh")); + Mesh->SetupAttachment(SphereCollision); + + Mesh->SetCollisionProfileName(FName("NoCollision")); +} + +void AShooterPickup::OnConstruction(const FTransform& Transform) +{ + Super::OnConstruction(Transform); + + if (FWeaponTableRow* WeaponData = WeaponType.GetRow(FString())) + { + // set the mesh + Mesh->SetStaticMesh(WeaponData->StaticMesh.LoadSynchronous()); + } +} + +void AShooterPickup::BeginPlay() +{ + Super::BeginPlay(); + + if (FWeaponTableRow* WeaponData = WeaponType.GetRow(FString())) + { + // copy the weapon class + WeaponClass = WeaponData->WeaponToSpawn; + } +} + +void AShooterPickup::EndPlay(const EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the respawn timer + GetWorld()->GetTimerManager().ClearTimer(RespawnTimer); +} + +void AShooterPickup::OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult) +{ + // have we collided against a weapon holder? + if (IShooterWeaponHolder* WeaponHolder = Cast(OtherActor)) + { + WeaponHolder->AddWeaponClass(WeaponClass); + + // hide this mesh + SetActorHiddenInGame(true); + + // disable collision + SetActorEnableCollision(false); + + // disable ticking + SetActorTickEnabled(false); + + // schedule the respawn + GetWorld()->GetTimerManager().SetTimer(RespawnTimer, this, &AShooterPickup::RespawnPickup, RespawnTime, false); + } +} + +void AShooterPickup::RespawnPickup() +{ + // unhide this pickup + SetActorHiddenInGame(false); + + // call the BP handler + BP_OnRespawn(); +} + +void AShooterPickup::FinishRespawn() +{ + // enable collision + SetActorEnableCollision(true); + + // enable tick + SetActorTickEnabled(true); +} diff --git a/Source/first/Variant_Shooter/Weapons/ShooterPickup.h b/Source/first/Variant_Shooter/Weapons/ShooterPickup.h new file mode 100644 index 0000000..89a2c69 --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterPickup.h @@ -0,0 +1,96 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "Engine/DataTable.h" +#include "Engine/StaticMesh.h" +#include "ShooterPickup.generated.h" + +class USphereComponent; +class UPrimitiveComponent; +class AShooterWeapon; + +/** + * Holds information about a type of weapon pickup + */ +USTRUCT(BlueprintType) +struct FWeaponTableRow : public FTableRowBase +{ + GENERATED_BODY() + + /** Mesh to display on the pickup */ + UPROPERTY(EditAnywhere) + TSoftObjectPtr StaticMesh; + + /** Weapon class to grant on pickup */ + UPROPERTY(EditAnywhere) + TSubclassOf WeaponToSpawn; +}; + +/** + * Simple shooter game weapon pickup + */ +UCLASS(abstract) +class FIRST_API AShooterPickup : public AActor +{ + GENERATED_BODY() + + /** Collision sphere */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USphereComponent* SphereCollision; + + /** Weapon pickup mesh. Its mesh asset is set from the weapon data table */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UStaticMeshComponent* Mesh; + +protected: + + /** Data on the type of picked weapon and visuals of this pickup */ + UPROPERTY(EditAnywhere, Category="Pickup") + FDataTableRowHandle WeaponType; + + /** Type to weapon to grant on pickup. Set from the weapon data table. */ + TSubclassOf WeaponClass; + + /** Time to wait before respawning this pickup */ + UPROPERTY(EditAnywhere, Category="Pickup", meta = (ClampMin = 0, ClampMax = 120, Units = "s")) + float RespawnTime = 4.0f; + + /** Timer to respawn the pickup */ + FTimerHandle RespawnTimer; + +public: + + /** Constructor */ + AShooterPickup(); + +protected: + + /** Native construction script */ + virtual void OnConstruction(const FTransform& Transform) override; + + /** Gameplay Initialization*/ + virtual void BeginPlay() override; + + /** Gameplay cleanup */ + virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; + + /** Handles collision overlap */ + UFUNCTION() + virtual void OnOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult); + +protected: + + /** Called when it's time to respawn this pickup */ + void RespawnPickup(); + + /** Passes control to Blueprint to animate the pickup respawn. Should end by calling FinishRespawn */ + UFUNCTION(BlueprintImplementableEvent, Category="Pickup", meta = (DisplayName = "OnRespawn")) + void BP_OnRespawn(); + + /** Enables this pickup after respawning */ + UFUNCTION(BlueprintCallable, Category="Pickup") + void FinishRespawn(); +}; diff --git a/Source/first/Variant_Shooter/Weapons/ShooterProjectile.cpp b/Source/first/Variant_Shooter/Weapons/ShooterProjectile.cpp new file mode 100644 index 0000000..cd075c0 --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterProjectile.cpp @@ -0,0 +1,167 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterProjectile.h" +#include "Components/SphereComponent.h" +#include "GameFramework/ProjectileMovementComponent.h" +#include "GameFramework/Character.h" +#include "Kismet/GameplayStatics.h" +#include "GameFramework/DamageType.h" +#include "GameFramework/Pawn.h" +#include "GameFramework/Controller.h" +#include "Engine/OverlapResult.h" +#include "Engine/World.h" +#include "TimerManager.h" + +AShooterProjectile::AShooterProjectile() +{ + PrimaryActorTick.bCanEverTick = true; + + // create the collision component and assign it as the root + RootComponent = CollisionComponent = CreateDefaultSubobject(TEXT("Collision Component")); + + CollisionComponent->SetSphereRadius(16.0f); + CollisionComponent->SetCollisionEnabled(ECollisionEnabled::QueryAndPhysics); + CollisionComponent->SetCollisionResponseToAllChannels(ECR_Block); + CollisionComponent->CanCharacterStepUpOn = ECanBeCharacterBase::ECB_No; + + // create the projectile movement component. No need to attach it because it's not a Scene Component + ProjectileMovement = CreateDefaultSubobject(TEXT("Projectile Movement")); + + ProjectileMovement->InitialSpeed = 3000.0f; + ProjectileMovement->MaxSpeed = 3000.0f; + ProjectileMovement->bShouldBounce = true; + + // set the default damage type + HitDamageType = UDamageType::StaticClass(); +} + +void AShooterProjectile::BeginPlay() +{ + Super::BeginPlay(); + + // ignore the pawn that shot this projectile + CollisionComponent->IgnoreActorWhenMoving(GetInstigator(), true); +} + +void AShooterProjectile::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the destruction timer + GetWorld()->GetTimerManager().ClearTimer(DestructionTimer); +} + +void AShooterProjectile::NotifyHit(class UPrimitiveComponent* MyComp, AActor* Other, class UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) +{ + // ignore if we've already hit something else + if (bHit) + { + return; + } + + bHit = true; + + // disable collision on the projectile + CollisionComponent->SetCollisionEnabled(ECollisionEnabled::NoCollision); + + // make AI perception noise + MakeNoise(NoiseLoudness, GetInstigator(), GetActorLocation(), NoiseRange, NoiseTag); + + if (bExplodeOnHit) + { + + // apply explosion damage centered on the projectile + ExplosionCheck(GetActorLocation()); + + } else { + + // single hit projectile. Process the collided actor + ProcessHit(Other, OtherComp, Hit.ImpactPoint, -Hit.ImpactNormal); + + } + + // pass control to BP for any extra effects + BP_OnProjectileHit(Hit); + + // check if we should schedule deferred destruction of the projectile + if (DeferredDestructionTime > 0.0f) + { + GetWorld()->GetTimerManager().SetTimer(DestructionTimer, this, &AShooterProjectile::OnDeferredDestruction, DeferredDestructionTime, false); + + } else { + + // destroy the projectile right away + Destroy(); + } +} + +void AShooterProjectile::ExplosionCheck(const FVector& ExplosionCenter) +{ + // do a sphere overlap check look for nearby actors to damage + TArray Overlaps; + + FCollisionShape OverlapShape; + OverlapShape.SetSphere(ExplosionRadius); + + FCollisionObjectQueryParams ObjectParams; + ObjectParams.AddObjectTypesToQuery(ECC_Pawn); + ObjectParams.AddObjectTypesToQuery(ECC_WorldDynamic); + ObjectParams.AddObjectTypesToQuery(ECC_PhysicsBody); + + FCollisionQueryParams QueryParams; + QueryParams.AddIgnoredActor(this); + if (!bDamageOwner) + { + QueryParams.AddIgnoredActor(GetInstigator()); + } + + GetWorld()->OverlapMultiByObjectType(Overlaps, ExplosionCenter, FQuat::Identity, ObjectParams, OverlapShape, QueryParams); + + TArray DamagedActors; + + // process the overlap results + for (const FOverlapResult& CurrentOverlap : Overlaps) + { + // overlaps may return the same actor multiple times per each component overlapped + // ensure we only damage each actor once by adding it to a damaged list + if (DamagedActors.Find(CurrentOverlap.GetActor()) == INDEX_NONE) + { + DamagedActors.Add(CurrentOverlap.GetActor()); + + // apply physics force away from the explosion + const FVector& ExplosionDir = CurrentOverlap.GetActor()->GetActorLocation() - GetActorLocation(); + + // push and/or damage the overlapped actor + ProcessHit(CurrentOverlap.GetActor(), CurrentOverlap.GetComponent(), GetActorLocation(), ExplosionDir.GetSafeNormal()); + } + + } +} + +void AShooterProjectile::ProcessHit(AActor* HitActor, UPrimitiveComponent* HitComp, const FVector& HitLocation, const FVector& HitDirection) +{ + // have we hit a character? + if (ACharacter* HitCharacter = Cast(HitActor)) + { + // ignore the owner of this projectile + if (HitCharacter != GetOwner() || bDamageOwner) + { + // apply damage to the character + UGameplayStatics::ApplyDamage(HitCharacter, HitDamage, GetInstigator()->GetController(), this, HitDamageType); + } + } + + // have we hit a physics object? + if (HitComp->IsSimulatingPhysics()) + { + // give some physics impulse to the object + HitComp->AddImpulseAtLocation(HitDirection * PhysicsForce, HitLocation); + } +} + +void AShooterProjectile::OnDeferredDestruction() +{ + // destroy this actor + Destroy(); +} diff --git a/Source/first/Variant_Shooter/Weapons/ShooterProjectile.h b/Source/first/Variant_Shooter/Weapons/ShooterProjectile.h new file mode 100644 index 0000000..d299b4f --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterProjectile.h @@ -0,0 +1,109 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "ShooterProjectile.generated.h" + +class USphereComponent; +class UProjectileMovementComponent; +class ACharacter; +class UPrimitiveComponent; + +/** + * Simple projectile class for a first person shooter game + */ +UCLASS(abstract) +class FIRST_API AShooterProjectile : public AActor +{ + GENERATED_BODY() + + /** Provides collision detection for the projectile */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USphereComponent* CollisionComponent; + + /** Handles movement for the projectile */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UProjectileMovementComponent* ProjectileMovement; + +protected: + + /** Loudness of the AI perception noise done by this projectile on hit */ + UPROPERTY(EditAnywhere, Category="Projectile|Noise", meta = (ClampMin = 0, ClampMax = 100)) + float NoiseLoudness = 3.0f; + + /** Range of the AI perception noise done by this projectile on hit */ + UPROPERTY(EditAnywhere, Category="Projectile|Noise", meta = (ClampMin = 0, ClampMax = 100000, Units = "cm")) + float NoiseRange = 3000.0f; + + /** Tag of the AI perception noise done by this projectile on hit */ + UPROPERTY(EditAnywhere, Category="Noise") + FName NoiseTag = FName("Projectile"); + + /** Physics force to apply on hit */ + UPROPERTY(EditAnywhere, Category="Projectile|Hit", meta = (ClampMin = 0, ClampMax = 50000)) + float PhysicsForce = 100.0f; + + /** Damage to apply on hit */ + UPROPERTY(EditAnywhere, Category="Projectile|Hit", meta = (ClampMin = 0, ClampMax = 100)) + float HitDamage = 25.0f; + + /** Type of damage to apply. Can be used to represent specific types of damage such as fire, explosion, etc. */ + UPROPERTY(EditAnywhere, Category="Projectile|Hit") + TSubclassOf HitDamageType; + + /** If true, the projectile can damage the character that shot it */ + UPROPERTY(EditAnywhere, Category="Projectile|Hit") + bool bDamageOwner = false; + + /** If true, the projectile will explode and apply radial damage to all actors in range */ + UPROPERTY(EditAnywhere, Category="Projectile|Explosion") + bool bExplodeOnHit = false; + + /** Max distance for actors to be affected by explosion damage */ + UPROPERTY(EditAnywhere, Category="Projectile|Explosion", meta = (ClampMin = 0, ClampMax = 5000, Units = "cm")) + float ExplosionRadius = 500.0f; + + /** If true, this projectile has already hit another surface */ + bool bHit = false; + + /** How long to wait after a hit before destroying this projectile */ + UPROPERTY(EditAnywhere, Category="Projectile|Destruction", meta = (ClampMin = 0, ClampMax = 10, Units = "s")) + float DeferredDestructionTime = 5.0f; + + /** Timer to handle deferred destruction of this projectile */ + FTimerHandle DestructionTimer; + +public: + + /** Constructor */ + AShooterProjectile(); + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Gameplay cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + + /** Handles collision */ + virtual void NotifyHit(class UPrimitiveComponent* MyComp, AActor* Other, UPrimitiveComponent* OtherComp, bool bSelfMoved, FVector HitLocation, FVector HitNormal, FVector NormalImpulse, const FHitResult& Hit) override; + +protected: + + /** Looks up actors within the explosion radius and damages them */ + void ExplosionCheck(const FVector& ExplosionCenter); + + /** Processes a projectile hit for the given actor */ + void ProcessHit(AActor* HitActor, UPrimitiveComponent* HitComp, const FVector& HitLocation, const FVector& HitDirection); + + /** Passes control to Blueprint to implement any effects on hit. */ + UFUNCTION(BlueprintImplementableEvent, Category="Projectile", meta = (DisplayName = "On Projectile Hit")) + void BP_OnProjectileHit(const FHitResult& Hit); + + /** Called from the destruction timer to destroy this projectile */ + void OnDeferredDestruction(); + +}; diff --git a/Source/first/Variant_Shooter/Weapons/ShooterWeapon.cpp b/Source/first/Variant_Shooter/Weapons/ShooterWeapon.cpp new file mode 100644 index 0000000..d53d0b4 --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterWeapon.cpp @@ -0,0 +1,218 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterWeapon.h" +#include "Kismet/KismetMathLibrary.h" +#include "Engine/World.h" +#include "ShooterProjectile.h" +#include "ShooterWeaponHolder.h" +#include "Components/SceneComponent.h" +#include "TimerManager.h" +#include "Animation/AnimInstance.h" +#include "Components/SkeletalMeshComponent.h" +#include "GameFramework/Pawn.h" + +AShooterWeapon::AShooterWeapon() +{ + PrimaryActorTick.bCanEverTick = true; + + // create the root + RootComponent = CreateDefaultSubobject(TEXT("Root")); + + // create the first person mesh + FirstPersonMesh = CreateDefaultSubobject(TEXT("First Person Mesh")); + FirstPersonMesh->SetupAttachment(RootComponent); + + FirstPersonMesh->SetCollisionProfileName(FName("NoCollision")); + FirstPersonMesh->SetFirstPersonPrimitiveType(EFirstPersonPrimitiveType::FirstPerson); + FirstPersonMesh->bOnlyOwnerSee = true; + + // create the third person mesh + ThirdPersonMesh = CreateDefaultSubobject(TEXT("Third Person Mesh")); + ThirdPersonMesh->SetupAttachment(RootComponent); + + ThirdPersonMesh->SetCollisionProfileName(FName("NoCollision")); + ThirdPersonMesh->SetFirstPersonPrimitiveType(EFirstPersonPrimitiveType::WorldSpaceRepresentation); + ThirdPersonMesh->bOwnerNoSee = true; +} + +void AShooterWeapon::BeginPlay() +{ + Super::BeginPlay(); + + // subscribe to the owner's destroyed delegate + GetOwner()->OnDestroyed.AddDynamic(this, &AShooterWeapon::OnOwnerDestroyed); + + // cast the weapon owner + WeaponOwner = Cast(GetOwner()); + PawnOwner = Cast(GetOwner()); + + // fill the first ammo clip + CurrentBullets = MagazineSize; + + // attach the meshes to the owner + WeaponOwner->AttachWeaponMeshes(this); +} + +void AShooterWeapon::EndPlay(EEndPlayReason::Type EndPlayReason) +{ + Super::EndPlay(EndPlayReason); + + // clear the refire timer + GetWorld()->GetTimerManager().ClearTimer(RefireTimer); +} + +void AShooterWeapon::OnOwnerDestroyed(AActor* DestroyedActor) +{ + // ensure this weapon is destroyed when the owner is destroyed + Destroy(); +} + +void AShooterWeapon::ActivateWeapon() +{ + // unhide this weapon + SetActorHiddenInGame(false); + + // notify the owner + WeaponOwner->OnWeaponActivated(this); +} + +void AShooterWeapon::DeactivateWeapon() +{ + // ensure we're no longer firing this weapon while deactivated + StopFiring(); + + // hide the weapon + SetActorHiddenInGame(true); + + // notify the owner + WeaponOwner->OnWeaponDeactivated(this); +} + +void AShooterWeapon::StartFiring() +{ + // raise the firing flag + bIsFiring = true; + + // check how much time has passed since we last shot + // this may be under the refire rate if the weapon shoots slow enough and the player is spamming the trigger + const float TimeSinceLastShot = GetWorld()->GetTimeSeconds() - TimeOfLastShot; + + if (TimeSinceLastShot > RefireRate) + { + // fire the weapon right away + Fire(); + + } else { + + // if we're full auto, schedule the next shot + if (bFullAuto) + { + GetWorld()->GetTimerManager().SetTimer(RefireTimer, this, &AShooterWeapon::Fire, TimeSinceLastShot, false); + } + + } +} + +void AShooterWeapon::StopFiring() +{ + // lower the firing flag + bIsFiring = false; + + // clear the refire timer + GetWorld()->GetTimerManager().ClearTimer(RefireTimer); +} + +void AShooterWeapon::Fire() +{ + // ensure the player still wants to fire. They may have let go of the trigger + if (!bIsFiring) + { + return; + } + + // fire a projectile at the target + FireProjectile(WeaponOwner->GetWeaponTargetLocation()); + + // update the time of our last shot + TimeOfLastShot = GetWorld()->GetTimeSeconds(); + + // make noise so the AI perception system can hear us + MakeNoise(ShotLoudness, PawnOwner, PawnOwner->GetActorLocation(), ShotNoiseRange, ShotNoiseTag); + + // are we full auto? + if (bFullAuto) + { + // schedule the next shot + GetWorld()->GetTimerManager().SetTimer(RefireTimer, this, &AShooterWeapon::Fire, RefireRate, false); + } else { + + // for semi-auto weapons, schedule the cooldown notification + GetWorld()->GetTimerManager().SetTimer(RefireTimer, this, &AShooterWeapon::FireCooldownExpired, RefireRate, false); + + } +} + +void AShooterWeapon::FireCooldownExpired() +{ + // notify the owner + WeaponOwner->OnSemiWeaponRefire(); +} + +void AShooterWeapon::FireProjectile(const FVector& TargetLocation) +{ + // get the projectile transform + FTransform ProjectileTransform = CalculateProjectileSpawnTransform(TargetLocation); + + // spawn the projectile + FActorSpawnParameters SpawnParams; + SpawnParams.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AlwaysSpawn; + SpawnParams.TransformScaleMethod = ESpawnActorScaleMethod::OverrideRootScale; + SpawnParams.Owner = GetOwner(); + SpawnParams.Instigator = PawnOwner; + + AShooterProjectile* Projectile = GetWorld()->SpawnActor(ProjectileClass, ProjectileTransform, SpawnParams); + + // play the firing montage + WeaponOwner->PlayFiringMontage(FiringMontage); + + // add recoil + WeaponOwner->AddWeaponRecoil(FiringRecoil); + + // consume bullets + --CurrentBullets; + + // if the clip is depleted, reload it + if (CurrentBullets <= 0) + { + CurrentBullets = MagazineSize; + } + + // update the weapon HUD + WeaponOwner->UpdateWeaponHUD(CurrentBullets, MagazineSize); +} + +FTransform AShooterWeapon::CalculateProjectileSpawnTransform(const FVector& TargetLocation) const +{ + // find the muzzle location + const FVector MuzzleLoc = FirstPersonMesh->GetSocketLocation(MuzzleSocketName); + + // calculate the spawn location ahead of the muzzle + const FVector SpawnLoc = MuzzleLoc + ((TargetLocation - MuzzleLoc).GetSafeNormal() * MuzzleOffset); + + // find the aim rotation vector while applying some variance to the target + const FRotator AimRot = UKismetMathLibrary::FindLookAtRotation(SpawnLoc, TargetLocation + (UKismetMathLibrary::RandomUnitVector() * AimVariance)); + + // return the built transform + return FTransform(AimRot, SpawnLoc, FVector::OneVector); +} + +const TSubclassOf& AShooterWeapon::GetFirstPersonAnimInstanceClass() const +{ + return FirstPersonAnimInstanceClass; +} + +const TSubclassOf& AShooterWeapon::GetThirdPersonAnimInstanceClass() const +{ + return ThirdPersonAnimInstanceClass; +} diff --git a/Source/first/Variant_Shooter/Weapons/ShooterWeapon.h b/Source/first/Variant_Shooter/Weapons/ShooterWeapon.h new file mode 100644 index 0000000..e839fb4 --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterWeapon.h @@ -0,0 +1,180 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Actor.h" +#include "ShooterWeaponHolder.h" +#include "Animation/AnimInstance.h" +#include "ShooterWeapon.generated.h" + +class IShooterWeaponHolder; +class AShooterProjectile; +class USkeletalMeshComponent; +class UAnimMontage; +class UAnimInstance; + +/** + * Base class for a simple first person shooter weapon + * Provides both first person and third person perspective meshes + * Handles ammo and firing logic + * Interacts with the weapon owner through the ShooterWeaponHolder interface + */ +UCLASS(abstract) +class FIRST_API AShooterWeapon : public AActor +{ + GENERATED_BODY() + + /** First person perspective mesh */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USkeletalMeshComponent* FirstPersonMesh; + + /** Third person perspective mesh */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USkeletalMeshComponent* ThirdPersonMesh; + +protected: + + /** Cast pointer to the weapon owner */ + IShooterWeaponHolder* WeaponOwner; + + /** Type of projectiles this weapon will shoot */ + UPROPERTY(EditAnywhere, Category="Ammo") + TSubclassOf ProjectileClass; + + /** Number of bullets in a magazine */ + UPROPERTY(EditAnywhere, Category="Ammo", meta = (ClampMin = 0, ClampMax = 100)) + int32 MagazineSize = 10; + + /** Number of bullets in the current magazine */ + int32 CurrentBullets = 0; + + /** Animation montage to play when firing this weapon */ + UPROPERTY(EditAnywhere, Category="Animation") + UAnimMontage* FiringMontage; + + /** AnimInstance class to set for the first person character mesh when this weapon is active */ + UPROPERTY(EditAnywhere, Category="Animation") + TSubclassOf FirstPersonAnimInstanceClass; + + /** AnimInstance class to set for the third person character mesh when this weapon is active */ + UPROPERTY(EditAnywhere, Category="Animation") + TSubclassOf ThirdPersonAnimInstanceClass; + + /** Cone half-angle for variance while aiming */ + UPROPERTY(EditAnywhere, Category="Aim", meta = (ClampMin = 0, ClampMax = 90, Units = "Degrees")) + float AimVariance = 0.0f; + + /** Amount of firing recoil to apply to the owner */ + UPROPERTY(EditAnywhere, Category="Aim", meta = (ClampMin = 0, ClampMax = 100)) + float FiringRecoil = 0.0f; + + /** Name of the first person muzzle socket where projectiles will spawn */ + UPROPERTY(EditAnywhere, Category="Aim") + FName MuzzleSocketName; + + /** Distance ahead of the muzzle that bullets will spawn at */ + UPROPERTY(EditAnywhere, Category="Aim", meta = (ClampMin = 0, ClampMax = 1000, Units = "cm")) + float MuzzleOffset = 10.0f; + + /** If true, this weapon will automatically fire at the refire rate */ + UPROPERTY(EditAnywhere, Category="Refire") + bool bFullAuto = false; + + /** Time between shots for this weapon. Affects both full auto and semi auto modes */ + UPROPERTY(EditAnywhere, Category="Refire", meta = (ClampMin = 0, ClampMax = 5, Units = "s")) + float RefireRate = 0.5f; + + /** Game time of last shot fired, used to enforce refire rate on semi auto */ + float TimeOfLastShot = 0.0f; + + /** If true, the weapon is currently firing */ + bool bIsFiring = false; + + /** Timer to handle full auto refiring */ + FTimerHandle RefireTimer; + + /** Cast pawn pointer to the owner for AI perception system interactions */ + TObjectPtr PawnOwner; + + /** Loudness of the shot for AI perception system interactions */ + UPROPERTY(EditAnywhere, Category="Perception", meta = (ClampMin = 0, ClampMax = 100)) + float ShotLoudness = 1.0f; + + /** Max range of shot AI perception noise */ + UPROPERTY(EditAnywhere, Category="Perception", meta = (ClampMin = 0, ClampMax = 100000, Units = "cm")) + float ShotNoiseRange = 3000.0f; + + /** Tag to apply to noise generated by shooting this weapon */ + UPROPERTY(EditAnywhere, Category="Perception") + FName ShotNoiseTag = FName("Shot"); + +public: + + /** Constructor */ + AShooterWeapon(); + +protected: + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Gameplay Cleanup */ + virtual void EndPlay(EEndPlayReason::Type EndPlayReason) override; + +protected: + + /** Called when the weapon's owner is destroyed */ + UFUNCTION() + void OnOwnerDestroyed(AActor* DestroyedActor); + +public: + + /** Activates this weapon and gets it ready to fire */ + void ActivateWeapon(); + + /** Deactivates this weapon */ + void DeactivateWeapon(); + + /** Start firing this weapon */ + void StartFiring(); + + /** Stop firing this weapon */ + void StopFiring(); + +protected: + + /** Fire the weapon */ + virtual void Fire(); + + /** Called when the refire rate time has passed while shooting semi auto weapons */ + void FireCooldownExpired(); + + /** Fire a projectile towards the target location */ + virtual void FireProjectile(const FVector& TargetLocation); + + /** Calculates the spawn transform for projectiles shot by this weapon */ + FTransform CalculateProjectileSpawnTransform(const FVector& TargetLocation) const; + +public: + + /** Returns the first person mesh */ + UFUNCTION(BlueprintPure, Category="Weapon") + USkeletalMeshComponent* GetFirstPersonMesh() const { return FirstPersonMesh; }; + + /** Returns the third person mesh */ + UFUNCTION(BlueprintPure, Category="Weapon") + USkeletalMeshComponent* GetThirdPersonMesh() const { return ThirdPersonMesh; }; + + /** Returns the first person anim instance class */ + const TSubclassOf& GetFirstPersonAnimInstanceClass() const; + + /** Returns the third person anim instance class */ + const TSubclassOf& GetThirdPersonAnimInstanceClass() const; + + /** Returns the magazine size */ + int32 GetMagazineSize() const { return MagazineSize; }; + + /** Returns the current bullet count */ + int32 GetBulletCount() const { return CurrentBullets; } +}; diff --git a/Source/first/Variant_Shooter/Weapons/ShooterWeaponHolder.cpp b/Source/first/Variant_Shooter/Weapons/ShooterWeaponHolder.cpp new file mode 100644 index 0000000..5b4675e --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterWeaponHolder.cpp @@ -0,0 +1,6 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "ShooterWeaponHolder.h" + +// Add default functionality here for any IShooterWeaponHolder functions that are not pure virtual. diff --git a/Source/first/Variant_Shooter/Weapons/ShooterWeaponHolder.h b/Source/first/Variant_Shooter/Weapons/ShooterWeaponHolder.h new file mode 100644 index 0000000..2949c74 --- /dev/null +++ b/Source/first/Variant_Shooter/Weapons/ShooterWeaponHolder.h @@ -0,0 +1,55 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "UObject/Interface.h" +#include "ShooterWeaponHolder.generated.h" + +class AShooterWeapon; +class UAnimMontage; + + +// This class does not need to be modified. +UINTERFACE(MinimalAPI) +class UShooterWeaponHolder : public UInterface +{ + GENERATED_BODY() +}; + +/** + * Common interface for Shooter Game weapon holder classes + */ +class FIRST_API IShooterWeaponHolder +{ + GENERATED_BODY() + +public: + + /** Attaches a weapon's meshes to the owner */ + virtual void AttachWeaponMeshes(AShooterWeapon* Weapon) = 0; + + /** Plays the firing montage for the weapon */ + virtual void PlayFiringMontage(UAnimMontage* Montage) = 0; + + /** Applies weapon recoil to the owner */ + virtual void AddWeaponRecoil(float Recoil) = 0; + + /** Updates the weapon's HUD with the current ammo count */ + virtual void UpdateWeaponHUD(int32 CurrentAmmo, int32 MagazineSize) = 0; + + /** Calculates and returns the aim location for the weapon */ + virtual FVector GetWeaponTargetLocation() = 0; + + /** Gives a weapon of this class to the owner */ + virtual void AddWeaponClass(const TSubclassOf& WeaponClass) = 0; + + /** Activates the passed weapon */ + virtual void OnWeaponActivated(AShooterWeapon* Weapon) = 0; + + /** Deactivates the passed weapon */ + virtual void OnWeaponDeactivated(AShooterWeapon* Weapon) = 0; + + /** Notifies the owner that the weapon cooldown has expired and it's ready to shoot again */ + virtual void OnSemiWeaponRefire() = 0; +}; diff --git a/Source/first/first.Build.cs b/Source/first/first.Build.cs new file mode 100644 index 0000000..5aec8c0 --- /dev/null +++ b/Source/first/first.Build.cs @@ -0,0 +1,44 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; + +public class first : ModuleRules +{ + public first(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicDependencyModuleNames.AddRange(new string[] { + "Core", + "CoreUObject", + "Engine", + "InputCore", + "EnhancedInput", + "AIModule", + "StateTreeModule", + "GameplayStateTreeModule", + "UMG", + "Slate" + }); + + PrivateDependencyModuleNames.AddRange(new string[] { }); + + PublicIncludePaths.AddRange(new string[] { + "first", + "first/Variant_Horror", + "first/Variant_Horror/UI", + "first/Variant_Shooter", + "first/Variant_Shooter/AI", + "first/Variant_Shooter/UI", + "first/Variant_Shooter/Weapons" + }); + + // Uncomment if you are using Slate UI + // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" }); + + // Uncomment if you are using online features + // PrivateDependencyModuleNames.Add("OnlineSubsystem"); + + // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true + } +} diff --git a/Source/first/first.cpp b/Source/first/first.cpp new file mode 100644 index 0000000..64f2daf --- /dev/null +++ b/Source/first/first.cpp @@ -0,0 +1,8 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "first.h" +#include "Modules/ModuleManager.h" + +IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, first, "first" ); + +DEFINE_LOG_CATEGORY(Logfirst) \ No newline at end of file diff --git a/Source/first/first.h b/Source/first/first.h new file mode 100644 index 0000000..f6fab88 --- /dev/null +++ b/Source/first/first.h @@ -0,0 +1,8 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" + +/** Main log category used across the project */ +DECLARE_LOG_CATEGORY_EXTERN(Logfirst, Log, All); \ No newline at end of file diff --git a/Source/first/firstCameraManager.cpp b/Source/first/firstCameraManager.cpp new file mode 100644 index 0000000..35053be --- /dev/null +++ b/Source/first/firstCameraManager.cpp @@ -0,0 +1,11 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "firstCameraManager.h" + +AfirstCameraManager::AfirstCameraManager() +{ + // set the min/max pitch + ViewPitchMin = -70.0f; + ViewPitchMax = 80.0f; +} diff --git a/Source/first/firstCameraManager.h b/Source/first/firstCameraManager.h new file mode 100644 index 0000000..73ed0db --- /dev/null +++ b/Source/first/firstCameraManager.h @@ -0,0 +1,22 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Camera/PlayerCameraManager.h" +#include "firstCameraManager.generated.h" + +/** + * Basic First Person camera manager. + * Limits min/max look pitch. + */ +UCLASS() +class AfirstCameraManager : public APlayerCameraManager +{ + GENERATED_BODY() + +public: + + /** Constructor */ + AfirstCameraManager(); +}; diff --git a/Source/first/firstCharacter.cpp b/Source/first/firstCharacter.cpp new file mode 100644 index 0000000..b09a084 --- /dev/null +++ b/Source/first/firstCharacter.cpp @@ -0,0 +1,120 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "firstCharacter.h" +#include "Animation/AnimInstance.h" +#include "Camera/CameraComponent.h" +#include "Components/CapsuleComponent.h" +#include "Components/SkeletalMeshComponent.h" +#include "EnhancedInputComponent.h" +#include "InputActionValue.h" +#include "GameFramework/CharacterMovementComponent.h" +#include "first.h" + +AfirstCharacter::AfirstCharacter() +{ + // Set size for collision capsule + GetCapsuleComponent()->InitCapsuleSize(55.f, 96.0f); + + // Create the first person mesh that will be viewed only by this character's owner + FirstPersonMesh = CreateDefaultSubobject(TEXT("First Person Mesh")); + + FirstPersonMesh->SetupAttachment(GetMesh()); + FirstPersonMesh->SetOnlyOwnerSee(true); + FirstPersonMesh->FirstPersonPrimitiveType = EFirstPersonPrimitiveType::FirstPerson; + FirstPersonMesh->SetCollisionProfileName(FName("NoCollision")); + + // Create the Camera Component + FirstPersonCameraComponent = CreateDefaultSubobject(TEXT("First Person Camera")); + FirstPersonCameraComponent->SetupAttachment(FirstPersonMesh, FName("head")); + FirstPersonCameraComponent->SetRelativeLocationAndRotation(FVector(-2.8f, 5.89f, 0.0f), FRotator(0.0f, 90.0f, -90.0f)); + FirstPersonCameraComponent->bUsePawnControlRotation = true; + FirstPersonCameraComponent->bEnableFirstPersonFieldOfView = true; + FirstPersonCameraComponent->bEnableFirstPersonScale = true; + FirstPersonCameraComponent->FirstPersonFieldOfView = 70.0f; + FirstPersonCameraComponent->FirstPersonScale = 0.6f; + + // configure the character comps + GetMesh()->SetOwnerNoSee(true); + GetMesh()->FirstPersonPrimitiveType = EFirstPersonPrimitiveType::WorldSpaceRepresentation; + + GetCapsuleComponent()->SetCapsuleSize(34.0f, 96.0f); + + // Configure character movement + GetCharacterMovement()->BrakingDecelerationFalling = 1500.0f; + GetCharacterMovement()->AirControl = 0.5f; +} + +void AfirstCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) +{ + // Set up action bindings + if (UEnhancedInputComponent* EnhancedInputComponent = Cast(PlayerInputComponent)) + { + // Jumping + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Started, this, &AfirstCharacter::DoJumpStart); + EnhancedInputComponent->BindAction(JumpAction, ETriggerEvent::Completed, this, &AfirstCharacter::DoJumpEnd); + + // Moving + EnhancedInputComponent->BindAction(MoveAction, ETriggerEvent::Triggered, this, &AfirstCharacter::MoveInput); + + // Looking/Aiming + EnhancedInputComponent->BindAction(LookAction, ETriggerEvent::Triggered, this, &AfirstCharacter::LookInput); + EnhancedInputComponent->BindAction(MouseLookAction, ETriggerEvent::Triggered, this, &AfirstCharacter::LookInput); + } + else + { + UE_LOG(Logfirst, Error, TEXT("'%s' Failed to find an Enhanced Input Component! This template is built to use the Enhanced Input system. If you intend to use the legacy system, then you will need to update this C++ file."), *GetNameSafe(this)); + } +} + + +void AfirstCharacter::MoveInput(const FInputActionValue& Value) +{ + // get the Vector2D move axis + FVector2D MovementVector = Value.Get(); + + // pass the axis values to the move input + DoMove(MovementVector.X, MovementVector.Y); + +} + +void AfirstCharacter::LookInput(const FInputActionValue& Value) +{ + // get the Vector2D look axis + FVector2D LookAxisVector = Value.Get(); + + // pass the axis values to the aim input + DoAim(LookAxisVector.X, LookAxisVector.Y); + +} + +void AfirstCharacter::DoAim(float Yaw, float Pitch) +{ + if (GetController()) + { + // pass the rotation inputs + AddControllerYawInput(Yaw); + AddControllerPitchInput(Pitch); + } +} + +void AfirstCharacter::DoMove(float Right, float Forward) +{ + if (GetController()) + { + // pass the move inputs + AddMovementInput(GetActorRightVector(), Right); + AddMovementInput(GetActorForwardVector(), Forward); + } +} + +void AfirstCharacter::DoJumpStart() +{ + // pass Jump to the character + Jump(); +} + +void AfirstCharacter::DoJumpEnd() +{ + // pass StopJumping to the character + StopJumping(); +} diff --git a/Source/first/firstCharacter.h b/Source/first/firstCharacter.h new file mode 100644 index 0000000..d86614d --- /dev/null +++ b/Source/first/firstCharacter.h @@ -0,0 +1,94 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/Character.h" +#include "Logging/LogMacros.h" +#include "firstCharacter.generated.h" + +class UInputComponent; +class USkeletalMeshComponent; +class UCameraComponent; +class UInputAction; +struct FInputActionValue; + +DECLARE_LOG_CATEGORY_EXTERN(LogTemplateCharacter, Log, All); + +/** + * A basic first person character + */ +UCLASS(abstract) +class AfirstCharacter : public ACharacter +{ + GENERATED_BODY() + + /** Pawn mesh: first person view (arms; seen only by self) */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + USkeletalMeshComponent* FirstPersonMesh; + + /** First person camera */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Components", meta = (AllowPrivateAccess = "true")) + UCameraComponent* FirstPersonCameraComponent; + +protected: + + /** Jump Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* JumpAction; + + /** Move Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + UInputAction* MoveAction; + + /** Look Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + class UInputAction* LookAction; + + /** Mouse Look Input Action */ + UPROPERTY(EditAnywhere, Category ="Input") + class UInputAction* MouseLookAction; + +public: + AfirstCharacter(); + +protected: + + /** Called from Input Actions for movement input */ + void MoveInput(const FInputActionValue& Value); + + /** Called from Input Actions for looking input */ + void LookInput(const FInputActionValue& Value); + + /** Handles aim inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoAim(float Yaw, float Pitch); + + /** Handles move inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoMove(float Right, float Forward); + + /** Handles jump start inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpStart(); + + /** Handles jump end inputs from either controls or UI interfaces */ + UFUNCTION(BlueprintCallable, Category="Input") + virtual void DoJumpEnd(); + +protected: + + /** Set up input action bindings */ + virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override; + + +public: + + /** Returns the first person mesh **/ + USkeletalMeshComponent* GetFirstPersonMesh() const { return FirstPersonMesh; } + + /** Returns first person camera component **/ + UCameraComponent* GetFirstPersonCameraComponent() const { return FirstPersonCameraComponent; } + +}; + diff --git a/Source/first/firstGameMode.cpp b/Source/first/firstGameMode.cpp new file mode 100644 index 0000000..003fde0 --- /dev/null +++ b/Source/first/firstGameMode.cpp @@ -0,0 +1,8 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "firstGameMode.h" + +AfirstGameMode::AfirstGameMode() +{ + // stub +} diff --git a/Source/first/firstGameMode.h b/Source/first/firstGameMode.h new file mode 100644 index 0000000..9cca8a9 --- /dev/null +++ b/Source/first/firstGameMode.h @@ -0,0 +1,22 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/GameModeBase.h" +#include "firstGameMode.generated.h" + +/** + * Simple GameMode for a first person game + */ +UCLASS(abstract) +class AfirstGameMode : public AGameModeBase +{ + GENERATED_BODY() + +public: + AfirstGameMode(); +}; + + + diff --git a/Source/first/firstPlayerController.cpp b/Source/first/firstPlayerController.cpp new file mode 100644 index 0000000..47457e2 --- /dev/null +++ b/Source/first/firstPlayerController.cpp @@ -0,0 +1,70 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + + +#include "firstPlayerController.h" +#include "EnhancedInputSubsystems.h" +#include "Engine/LocalPlayer.h" +#include "InputMappingContext.h" +#include "firstCameraManager.h" +#include "Blueprint/UserWidget.h" +#include "first.h" +#include "Widgets/Input/SVirtualJoystick.h" + +AfirstPlayerController::AfirstPlayerController() +{ + // set the player camera manager class + PlayerCameraManagerClass = AfirstCameraManager::StaticClass(); +} + +void AfirstPlayerController::BeginPlay() +{ + Super::BeginPlay(); + + + // only spawn touch controls on local player controllers + if (SVirtualJoystick::ShouldDisplayTouchInterface() && IsLocalPlayerController()) + { + // spawn the mobile controls widget + MobileControlsWidget = CreateWidget(this, MobileControlsWidgetClass); + + if (MobileControlsWidget) + { + // add the controls to the player screen + MobileControlsWidget->AddToPlayerScreen(0); + + } else { + + UE_LOG(Logfirst, Error, TEXT("Could not spawn mobile controls widget.")); + + } + + } +} + +void AfirstPlayerController::SetupInputComponent() +{ + Super::SetupInputComponent(); + + // only add IMCs for local player controllers + if (IsLocalPlayerController()) + { + // Add Input Mapping Context + if (UEnhancedInputLocalPlayerSubsystem* Subsystem = ULocalPlayer::GetSubsystem(GetLocalPlayer())) + { + for (UInputMappingContext* CurrentContext : DefaultMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + + // only add these IMCs if we're not using mobile touch input + if (!SVirtualJoystick::ShouldDisplayTouchInterface()) + { + for (UInputMappingContext* CurrentContext : MobileExcludedMappingContexts) + { + Subsystem->AddMappingContext(CurrentContext, 0); + } + } + } + } + +} diff --git a/Source/first/firstPlayerController.h b/Source/first/firstPlayerController.h new file mode 100644 index 0000000..a45a4f8 --- /dev/null +++ b/Source/first/firstPlayerController.h @@ -0,0 +1,50 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "GameFramework/PlayerController.h" +#include "firstPlayerController.generated.h" + +class UInputMappingContext; +class UUserWidget; + +/** + * Simple first person Player Controller + * Manages the input mapping context. + * Overrides the Player Camera Manager class. + */ +UCLASS(abstract) +class FIRST_API AfirstPlayerController : public APlayerController +{ + GENERATED_BODY() + +public: + + /** Constructor */ + AfirstPlayerController(); + +protected: + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray DefaultMappingContexts; + + /** Input Mapping Contexts */ + UPROPERTY(EditAnywhere, Category="Input|Input Mappings") + TArray MobileExcludedMappingContexts; + + /** Mobile controls widget to spawn */ + UPROPERTY(EditAnywhere, Category="Input|Touch Controls") + TSubclassOf MobileControlsWidgetClass; + + /** Pointer to the mobile controls widget */ + TObjectPtr MobileControlsWidget; + + /** Gameplay initialization */ + virtual void BeginPlay() override; + + /** Input mapping context setup */ + virtual void SetupInputComponent() override; + +}; diff --git a/Source/firstEditor.Target.cs b/Source/firstEditor.Target.cs new file mode 100644 index 0000000..91f4072 --- /dev/null +++ b/Source/firstEditor.Target.cs @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; +using System.Collections.Generic; + +public class firstEditorTarget : TargetRules +{ + public firstEditorTarget(TargetInfo Target) : base(Target) + { + Type = TargetType.Editor; + DefaultBuildSettings = BuildSettingsVersion.V5; + IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_6; + ExtraModuleNames.Add("first"); + } +} diff --git a/first.uproject b/first.uproject new file mode 100644 index 0000000..c86b7df --- /dev/null +++ b/first.uproject @@ -0,0 +1,40 @@ +{ + "FileVersion": 3, + "EngineAssociation": "5.6", + "Category": "", + "Description": "", + "Modules": [ + { + "Name": "first", + "Type": "Runtime", + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine", + "AIModule", + "UMG" + ] + } + ], + "Plugins": [ + { + "Name": "ModelingToolsEditorMode", + "Enabled": true, + "TargetAllowList": [ + "Editor" + ] + }, + { + "Name": "StateTree", + "Enabled": true + }, + { + "Name": "GameplayStateTree", + "Enabled": true + }, + { + "Name": "Diversion", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/7c8abd783acd4d66a5290a12a5d67523" + } + ] +} \ No newline at end of file