diff --git a/Config/DefaultEditor.ini b/Config/DefaultEditor.ini index 79b70b5..416fe97 100644 --- a/Config/DefaultEditor.ini +++ b/Config/DefaultEditor.ini @@ -7,3 +7,9 @@ bReplaceBlueprintWithClass= true bDontLoadBlueprintOutsideEditor= true bBlueprintIsNotBlueprintType= true +[/Script/AdvancedPreviewScene.SharedProfiles] ++Profiles=(ProfileName="Epic Headquarters",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,bShowGrid=False,EnvironmentColor=(R=0.200000,G=0.200000,B=0.200000,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",EnvironmentFloorMeshPath="/Engine/EditorMeshes/AssetViewer/Floor_Mesh.Floor_Mesh",EnvironmentFloorRotation=(Pitch=0.000000,Yaw=0.000000,Roll=0.000000),EnvironmentFloorScale=(X=4.000000,Y=4.000000,Z=1.000000),EnvironmentFloorMaterialPath="/Engine/EngineMaterials/M_Grid.M_Grid",bPostProcessingEnabled=True,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_TonemappingMethod=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_MegaLightsFrontLayerTranslucency=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomGaussianIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionIntensity=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_VignetteType=False,bOverride_VignetteCenter=False,bOverride_VignetteColor=False,bOverride_VignetteSize=False,bOverride_VignetteSoftness=False,bOverride_VignetteTexture=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainScale=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldEnabled=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenAmbientOcclusionIntensity=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,TonemappingMethod=Filmic,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomGaussianIntensity=1.000000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionIntensity=1.000000,BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenAmbientOcclusionIntensity=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,MegaLightsFrontLayerTranslucency=False,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,VignetteType=CosineFourthLaw,VignetteCenter=(X=0.500000,Y=0.500000),VignetteColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),VignetteSize=(X=1.000000,Y=1.000000),VignetteSoftness=5.000000,VignetteTexture=None,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainScale=(X=1.000000,Y=1.000000),FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldEnabled=True,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=True,bShowMeshEdges=False) ++Profiles=(ProfileName="Grey Wireframe",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=1.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=1.000000,bRotateLightingRig=False,bShowEnvironment=False,bShowFloor=False,bShowGrid=False,EnvironmentColor=(R=0.039216,G=0.039216,B=0.039216,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/EpicQuadPanorama_CC+EV1.EpicQuadPanorama_CC+EV1",EnvironmentFloorMeshPath="/Engine/EditorMeshes/AssetViewer/Floor_Mesh.Floor_Mesh",EnvironmentFloorRotation=(Pitch=0.000000,Yaw=0.000000,Roll=0.000000),EnvironmentFloorScale=(X=4.000000,Y=4.000000,Z=1.000000),EnvironmentFloorMaterialPath="/Engine/EngineMaterials/M_Grid.M_Grid",bPostProcessingEnabled=False,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_TonemappingMethod=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_MegaLightsFrontLayerTranslucency=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomGaussianIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionIntensity=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_VignetteType=False,bOverride_VignetteCenter=False,bOverride_VignetteColor=False,bOverride_VignetteSize=False,bOverride_VignetteSoftness=False,bOverride_VignetteTexture=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainScale=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldEnabled=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenAmbientOcclusionIntensity=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,TonemappingMethod=Filmic,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomGaussianIntensity=1.000000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionIntensity=1.000000,BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenAmbientOcclusionIntensity=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,MegaLightsFrontLayerTranslucency=False,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,VignetteType=CosineFourthLaw,VignetteCenter=(X=0.500000,Y=0.500000),VignetteColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),VignetteSize=(X=1.000000,Y=1.000000),VignetteSoftness=5.000000,VignetteTexture=None,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainScale=(X=1.000000,Y=1.000000),FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldEnabled=True,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=False,bShowMeshEdges=True) ++Profiles=(ProfileName="Grey Ambient",bSharedProfile=True,bIsEngineDefaultProfile=True,bUseSkyLighting=True,DirectionalLightIntensity=4.000000,DirectionalLightColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SkyLightIntensity=2.000000,bRotateLightingRig=False,bShowEnvironment=True,bShowFloor=True,bShowGrid=False,EnvironmentColor=(R=0.200000,G=0.200000,B=0.200000,A=1.000000),EnvironmentIntensity=1.000000,EnvironmentCubeMapPath="/Engine/EditorMaterials/AssetViewer/T_GreyAmbient",EnvironmentFloorMeshPath="/Engine/EditorMeshes/AssetViewer/Floor_Mesh.Floor_Mesh",EnvironmentFloorRotation=(Pitch=0.000000,Yaw=0.000000,Roll=0.000000),EnvironmentFloorScale=(X=4.000000,Y=4.000000,Z=1.000000),EnvironmentFloorMaterialPath="/Engine/EngineMaterials/M_Grid.M_Grid",bPostProcessingEnabled=False,PostProcessingSettings=(bOverride_TemperatureType=False,bOverride_WhiteTemp=False,bOverride_WhiteTint=False,bOverride_ColorSaturation=False,bOverride_ColorContrast=False,bOverride_ColorGamma=False,bOverride_ColorGain=False,bOverride_ColorOffset=False,bOverride_ColorSaturationShadows=False,bOverride_ColorContrastShadows=False,bOverride_ColorGammaShadows=False,bOverride_ColorGainShadows=False,bOverride_ColorOffsetShadows=False,bOverride_ColorSaturationMidtones=False,bOverride_ColorContrastMidtones=False,bOverride_ColorGammaMidtones=False,bOverride_ColorGainMidtones=False,bOverride_ColorOffsetMidtones=False,bOverride_ColorSaturationHighlights=False,bOverride_ColorContrastHighlights=False,bOverride_ColorGammaHighlights=False,bOverride_ColorGainHighlights=False,bOverride_ColorOffsetHighlights=False,bOverride_ColorCorrectionShadowsMax=False,bOverride_ColorCorrectionHighlightsMin=False,bOverride_ColorCorrectionHighlightsMax=False,bOverride_BlueCorrection=False,bOverride_ExpandGamut=False,bOverride_ToneCurveAmount=False,bOverride_TonemappingMethod=False,bOverride_FilmSlope=False,bOverride_FilmToe=False,bOverride_FilmShoulder=False,bOverride_FilmBlackClip=False,bOverride_FilmWhiteClip=False,bOverride_SceneColorTint=False,bOverride_SceneFringeIntensity=False,bOverride_ChromaticAberrationStartOffset=False,bOverride_bMegaLights=False,bOverride_MegaLightsFrontLayerTranslucency=False,bOverride_AmbientCubemapTint=False,bOverride_AmbientCubemapIntensity=False,bOverride_BloomMethod=False,bOverride_BloomIntensity=False,bOverride_BloomGaussianIntensity=False,bOverride_BloomThreshold=False,bOverride_Bloom1Tint=False,bOverride_Bloom1Size=False,bOverride_Bloom2Size=False,bOverride_Bloom2Tint=False,bOverride_Bloom3Tint=False,bOverride_Bloom3Size=False,bOverride_Bloom4Tint=False,bOverride_Bloom4Size=False,bOverride_Bloom5Tint=False,bOverride_Bloom5Size=False,bOverride_Bloom6Tint=False,bOverride_Bloom6Size=False,bOverride_BloomSizeScale=False,bOverride_BloomConvolutionIntensity=False,bOverride_BloomConvolutionTexture=False,bOverride_BloomConvolutionScatterDispersion=False,bOverride_BloomConvolutionSize=False,bOverride_BloomConvolutionCenterUV=False,bOverride_BloomConvolutionPreFilterMin=False,bOverride_BloomConvolutionPreFilterMax=False,bOverride_BloomConvolutionPreFilterMult=False,bOverride_BloomConvolutionBufferScale=False,bOverride_BloomDirtMaskIntensity=False,bOverride_BloomDirtMaskTint=False,bOverride_BloomDirtMask=False,bOverride_CameraShutterSpeed=False,bOverride_CameraISO=False,bOverride_AutoExposureMethod=False,bOverride_AutoExposureLowPercent=False,bOverride_AutoExposureHighPercent=False,bOverride_AutoExposureMinBrightness=True,bOverride_AutoExposureMaxBrightness=True,bOverride_AutoExposureSpeedUp=False,bOverride_AutoExposureSpeedDown=False,bOverride_AutoExposureBias=False,bOverride_AutoExposureBiasCurve=False,bOverride_AutoExposureMeterMask=False,bOverride_AutoExposureApplyPhysicalCameraExposure=False,bOverride_HistogramLogMin=False,bOverride_HistogramLogMax=False,bOverride_LocalExposureMethod=False,bOverride_LocalExposureHighlightContrastScale=False,bOverride_LocalExposureShadowContrastScale=False,bOverride_LocalExposureHighlightContrastCurve=False,bOverride_LocalExposureShadowContrastCurve=False,bOverride_LocalExposureHighlightThreshold=False,bOverride_LocalExposureShadowThreshold=False,bOverride_LocalExposureDetailStrength=False,bOverride_LocalExposureBlurredLuminanceBlend=False,bOverride_LocalExposureBlurredLuminanceKernelSizePercent=False,bOverride_LocalExposureHighlightThresholdStrength=False,bOverride_LocalExposureShadowThresholdStrength=False,bOverride_LocalExposureMiddleGreyBias=False,bOverride_LensFlareIntensity=False,bOverride_LensFlareTint=False,bOverride_LensFlareTints=False,bOverride_LensFlareBokehSize=False,bOverride_LensFlareBokehShape=False,bOverride_LensFlareThreshold=False,bOverride_VignetteIntensity=False,bOverride_VignetteType=False,bOverride_VignetteCenter=False,bOverride_VignetteColor=False,bOverride_VignetteSize=False,bOverride_VignetteSoftness=False,bOverride_VignetteTexture=False,bOverride_Sharpen=False,bOverride_FilmGrainIntensity=False,bOverride_FilmGrainIntensityShadows=False,bOverride_FilmGrainIntensityMidtones=False,bOverride_FilmGrainIntensityHighlights=False,bOverride_FilmGrainShadowsMax=False,bOverride_FilmGrainHighlightsMin=False,bOverride_FilmGrainHighlightsMax=False,bOverride_FilmGrainScale=False,bOverride_FilmGrainTexture=False,bOverride_AmbientOcclusionIntensity=False,bOverride_AmbientOcclusionStaticFraction=False,bOverride_AmbientOcclusionRadius=False,bOverride_AmbientOcclusionFadeDistance=False,bOverride_AmbientOcclusionFadeRadius=False,bOverride_AmbientOcclusionRadiusInWS=False,bOverride_AmbientOcclusionPower=False,bOverride_AmbientOcclusionBias=False,bOverride_AmbientOcclusionQuality=False,bOverride_AmbientOcclusionMipBlend=False,bOverride_AmbientOcclusionMipScale=False,bOverride_AmbientOcclusionMipThreshold=False,bOverride_AmbientOcclusionTemporalBlendWeight=False,bOverride_RayTracingAO=False,bOverride_RayTracingAOSamplesPerPixel=False,bOverride_RayTracingAOIntensity=False,bOverride_RayTracingAORadius=False,bOverride_IndirectLightingColor=False,bOverride_IndirectLightingIntensity=False,bOverride_ColorGradingIntensity=False,bOverride_ColorGradingLUT=False,bOverride_DepthOfFieldEnabled=False,bOverride_DepthOfFieldFocalDistance=False,bOverride_DepthOfFieldFstop=False,bOverride_DepthOfFieldMinFstop=False,bOverride_DepthOfFieldBladeCount=False,bOverride_DepthOfFieldSensorWidth=False,bOverride_DepthOfFieldSqueezeFactor=False,bOverride_DepthOfFieldDepthBlurRadius=False,bOverride_DepthOfFieldUseHairDepth=False,bOverride_DepthOfFieldPetzvalBokeh=False,bOverride_DepthOfFieldPetzvalBokehFalloff=False,bOverride_DepthOfFieldPetzvalExclusionBoxExtents=False,bOverride_DepthOfFieldPetzvalExclusionBoxRadius=False,bOverride_DepthOfFieldAspectRatioScalar=False,bOverride_DepthOfFieldMatteBoxFlags=False,bOverride_DepthOfFieldBarrelRadius=False,bOverride_DepthOfFieldBarrelLength=False,bOverride_DepthOfFieldDepthBlurAmount=False,bOverride_DepthOfFieldFocalRegion=False,bOverride_DepthOfFieldNearTransitionRegion=False,bOverride_DepthOfFieldFarTransitionRegion=False,bOverride_DepthOfFieldScale=False,bOverride_DepthOfFieldNearBlurSize=False,bOverride_DepthOfFieldFarBlurSize=False,bOverride_MobileHQGaussian=False,bOverride_DepthOfFieldOcclusion=False,bOverride_DepthOfFieldSkyFocusDistance=False,bOverride_DepthOfFieldVignetteSize=False,bOverride_MotionBlurAmount=False,bOverride_MotionBlurMax=False,bOverride_MotionBlurTargetFPS=False,bOverride_MotionBlurPerObjectSize=False,bOverride_ReflectionMethod=False,bOverride_LumenReflectionQuality=False,bOverride_ScreenSpaceReflectionIntensity=False,bOverride_ScreenSpaceReflectionQuality=False,bOverride_ScreenSpaceReflectionMaxRoughness=False,bOverride_ScreenSpaceReflectionRoughnessScale=False,bOverride_UserFlags=False,bOverride_RayTracingReflectionsMaxRoughness=False,bOverride_RayTracingReflectionsMaxBounces=False,bOverride_RayTracingReflectionsSamplesPerPixel=False,bOverride_RayTracingReflectionsShadows=False,bOverride_RayTracingReflectionsTranslucency=False,bOverride_TranslucencyType=False,bOverride_RayTracingTranslucencyMaxRoughness=False,bOverride_RayTracingTranslucencyRefractionRays=False,bOverride_RayTracingTranslucencySamplesPerPixel=False,bOverride_RayTracingTranslucencyShadows=False,bOverride_RayTracingTranslucencyRefraction=False,bOverride_RayTracingTranslucencyMaxPrimaryHitEvents=False,bOverride_RayTracingTranslucencyMaxSecondaryHitEvents=False,bOverride_RayTracingTranslucencyUseRayTracedRefraction=False,bOverride_DynamicGlobalIlluminationMethod=False,bOverride_LumenSceneLightingQuality=False,bOverride_LumenSceneDetail=False,bOverride_LumenSceneViewDistance=False,bOverride_LumenSceneLightingUpdateSpeed=False,bOverride_LumenFinalGatherQuality=False,bOverride_LumenFinalGatherLightingUpdateSpeed=False,bOverride_LumenFinalGatherScreenTraces=False,bOverride_LumenMaxTraceDistance=False,bOverride_LumenDiffuseColorBoost=False,bOverride_LumenAmbientOcclusionIntensity=False,bOverride_LumenSkylightLeaking=False,bOverride_LumenSkylightLeakingTint=False,bOverride_LumenFullSkylightLeakingDistance=False,bOverride_LumenRayLightingMode=False,bOverride_LumenReflectionsScreenTraces=False,bOverride_LumenFrontLayerTranslucencyReflections=False,bOverride_LumenMaxRoughnessToTraceReflections=False,bOverride_LumenMaxReflectionBounces=False,bOverride_LumenMaxRefractionBounces=False,bOverride_LumenSurfaceCacheResolution=False,bOverride_RayTracingGI=False,bOverride_RayTracingGIMaxBounces=False,bOverride_RayTracingGISamplesPerPixel=False,bOverride_PathTracingMaxBounces=False,bOverride_PathTracingSamplesPerPixel=False,bOverride_PathTracingMaxPathIntensity=False,bOverride_PathTracingEnableEmissiveMaterials=False,bOverride_PathTracingEnableReferenceDOF=False,bOverride_PathTracingEnableReferenceAtmosphere=False,bOverride_PathTracingEnableDenoiser=False,bOverride_PathTracingIncludeEmissive=False,bOverride_PathTracingIncludeDiffuse=False,bOverride_PathTracingIncludeIndirectDiffuse=False,bOverride_PathTracingIncludeSpecular=False,bOverride_PathTracingIncludeIndirectSpecular=False,bOverride_PathTracingIncludeVolume=False,bOverride_PathTracingIncludeIndirectVolume=False,bMobileHQGaussian=False,BloomMethod=BM_SOG,AutoExposureMethod=AEM_Histogram,TemperatureType=TEMP_WhiteBalance,WhiteTemp=6500.000000,WhiteTint=0.000000,ColorSaturation=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrast=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGamma=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGain=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffset=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainShadows=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetShadows=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainMidtones=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetMidtones=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorSaturationHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorContrastHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGammaHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorGainHighlights=(X=1.000000,Y=1.000000,Z=1.000000,W=1.000000),ColorOffsetHighlights=(X=0.000000,Y=0.000000,Z=0.000000,W=0.000000),ColorCorrectionHighlightsMin=0.500000,ColorCorrectionHighlightsMax=1.000000,ColorCorrectionShadowsMax=0.090000,BlueCorrection=0.600000,ExpandGamut=1.000000,ToneCurveAmount=1.000000,TonemappingMethod=Filmic,FilmSlope=0.880000,FilmToe=0.550000,FilmShoulder=0.260000,FilmBlackClip=0.000000,FilmWhiteClip=0.040000,SceneColorTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),SceneFringeIntensity=0.000000,ChromaticAberrationStartOffset=0.000000,BloomIntensity=0.675000,BloomGaussianIntensity=1.000000,BloomThreshold=-1.000000,BloomSizeScale=4.000000,Bloom1Size=0.300000,Bloom2Size=1.000000,Bloom3Size=2.000000,Bloom4Size=10.000000,Bloom5Size=30.000000,Bloom6Size=64.000000,Bloom1Tint=(R=0.346500,G=0.346500,B=0.346500,A=1.000000),Bloom2Tint=(R=0.138000,G=0.138000,B=0.138000,A=1.000000),Bloom3Tint=(R=0.117600,G=0.117600,B=0.117600,A=1.000000),Bloom4Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom5Tint=(R=0.066000,G=0.066000,B=0.066000,A=1.000000),Bloom6Tint=(R=0.061000,G=0.061000,B=0.061000,A=1.000000),BloomConvolutionIntensity=1.000000,BloomConvolutionScatterDispersion=1.000000,BloomConvolutionSize=1.000000,BloomConvolutionTexture=None,BloomConvolutionCenterUV=(X=0.500000,Y=0.500000),BloomConvolutionPreFilterMin=7.000000,BloomConvolutionPreFilterMax=15000.000000,BloomConvolutionPreFilterMult=15.000000,BloomConvolutionBufferScale=0.133000,BloomDirtMask=None,BloomDirtMaskIntensity=0.000000,BloomDirtMaskTint=(R=0.500000,G=0.500000,B=0.500000,A=1.000000),DynamicGlobalIlluminationMethod=Lumen,IndirectLightingColor=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),IndirectLightingIntensity=1.000000,LumenRayLightingMode=Default,LumenSceneLightingQuality=1.000000,LumenSceneDetail=1.000000,LumenSceneViewDistance=20000.000000,LumenSceneLightingUpdateSpeed=1.000000,LumenFinalGatherQuality=1.000000,LumenFinalGatherLightingUpdateSpeed=1.000000,LumenFinalGatherScreenTraces=True,LumenMaxTraceDistance=20000.000000,LumenDiffuseColorBoost=1.000000,LumenAmbientOcclusionIntensity=1.000000,LumenSkylightLeaking=0.000000,LumenSkylightLeakingTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LumenFullSkylightLeakingDistance=1000.000000,LumenSurfaceCacheResolution=1.000000,ReflectionMethod=Lumen,LumenReflectionQuality=1.000000,LumenReflectionsScreenTraces=True,LumenFrontLayerTranslucencyReflections=False,LumenMaxRoughnessToTraceReflections=0.400000,LumenMaxReflectionBounces=1,LumenMaxRefractionBounces=0,ScreenSpaceReflectionIntensity=100.000000,ScreenSpaceReflectionQuality=50.000000,ScreenSpaceReflectionMaxRoughness=0.600000,bMegaLights=True,MegaLightsFrontLayerTranslucency=False,AmbientCubemapTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),AmbientCubemapIntensity=1.000000,AmbientCubemap=None,CameraShutterSpeed=60.000000,CameraISO=100.000000,DepthOfFieldFstop=4.000000,DepthOfFieldMinFstop=1.200000,DepthOfFieldBladeCount=5,AutoExposureBias=1.000000,AutoExposureBiasBackup=0.000000,bOverride_AutoExposureBiasBackup=False,AutoExposureApplyPhysicalCameraExposure=True,AutoExposureBiasCurve=None,AutoExposureMeterMask=None,AutoExposureLowPercent=10.000000,AutoExposureHighPercent=90.000000,AutoExposureMinBrightness=-1.000000,AutoExposureMaxBrightness=1.000000,AutoExposureSpeedUp=3.000000,AutoExposureSpeedDown=1.000000,HistogramLogMin=-10.000000,HistogramLogMax=20.000000,LocalExposureMethod=Bilateral,LocalExposureHighlightContrastScale=1.000000,LocalExposureShadowContrastScale=1.000000,LocalExposureHighlightContrastCurve=None,LocalExposureShadowContrastCurve=None,LocalExposureHighlightThreshold=0.000000,LocalExposureShadowThreshold=0.000000,LocalExposureDetailStrength=1.000000,LocalExposureBlurredLuminanceBlend=0.600000,LocalExposureBlurredLuminanceKernelSizePercent=50.000000,LocalExposureHighlightThresholdStrength=1.000000,LocalExposureShadowThresholdStrength=1.000000,LocalExposureMiddleGreyBias=0.000000,LensFlareIntensity=1.000000,LensFlareTint=(R=1.000000,G=1.000000,B=1.000000,A=1.000000),LensFlareBokehSize=3.000000,LensFlareThreshold=8.000000,LensFlareBokehShape=None,LensFlareTints[0]=(R=1.000000,G=0.800000,B=0.400000,A=0.600000),LensFlareTints[1]=(R=1.000000,G=1.000000,B=0.600000,A=0.530000),LensFlareTints[2]=(R=0.800000,G=0.800000,B=1.000000,A=0.460000),LensFlareTints[3]=(R=0.500000,G=1.000000,B=0.400000,A=0.390000),LensFlareTints[4]=(R=0.500000,G=0.800000,B=1.000000,A=0.310000),LensFlareTints[5]=(R=0.900000,G=1.000000,B=0.800000,A=0.270000),LensFlareTints[6]=(R=1.000000,G=0.800000,B=0.400000,A=0.220000),LensFlareTints[7]=(R=0.900000,G=0.700000,B=0.700000,A=0.150000),VignetteIntensity=0.400000,VignetteType=CosineFourthLaw,VignetteCenter=(X=0.500000,Y=0.500000),VignetteColor=(R=0.000000,G=0.000000,B=0.000000,A=1.000000),VignetteSize=(X=1.000000,Y=1.000000),VignetteSoftness=5.000000,VignetteTexture=None,Sharpen=0.000000,FilmGrainIntensity=0.000000,FilmGrainIntensityShadows=1.000000,FilmGrainIntensityMidtones=1.000000,FilmGrainIntensityHighlights=1.000000,FilmGrainShadowsMax=0.090000,FilmGrainHighlightsMin=0.500000,FilmGrainHighlightsMax=1.000000,FilmGrainScale=(X=1.000000,Y=1.000000),FilmGrainTexture=None,AmbientOcclusionIntensity=0.500000,AmbientOcclusionStaticFraction=1.000000,AmbientOcclusionRadius=200.000000,AmbientOcclusionRadiusInWS=False,AmbientOcclusionFadeDistance=8000.000000,AmbientOcclusionFadeRadius=5000.000000,AmbientOcclusionPower=2.000000,AmbientOcclusionBias=3.000000,AmbientOcclusionQuality=50.000000,AmbientOcclusionMipBlend=0.600000,AmbientOcclusionMipScale=1.700000,AmbientOcclusionMipThreshold=0.010000,AmbientOcclusionTemporalBlendWeight=0.100000,RayTracingAO=False,RayTracingAOSamplesPerPixel=1,RayTracingAOIntensity=1.000000,RayTracingAORadius=200.000000,ColorGradingIntensity=1.000000,ColorGradingLUT=None,DepthOfFieldEnabled=True,DepthOfFieldSensorWidth=24.576000,DepthOfFieldSqueezeFactor=1.000000,DepthOfFieldFocalDistance=0.000000,DepthOfFieldDepthBlurAmount=1.000000,DepthOfFieldDepthBlurRadius=0.000000,DepthOfFieldUseHairDepth=False,DepthOfFieldPetzvalBokeh=0.000000,DepthOfFieldPetzvalBokehFalloff=1.000000,DepthOfFieldPetzvalExclusionBoxExtents=(X=0.000000,Y=0.000000),DepthOfFieldPetzvalExclusionBoxRadius=0.000000,DepthOfFieldAspectRatioScalar=1.000000,DepthOfFieldBarrelRadius=5.000000,DepthOfFieldBarrelLength=0.000000,DepthOfFieldMatteBoxFlags[0]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[1]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldMatteBoxFlags[2]=(Pitch=0.000000,Roll=0.000000,Length=0.000000),DepthOfFieldFocalRegion=0.000000,DepthOfFieldNearTransitionRegion=300.000000,DepthOfFieldFarTransitionRegion=500.000000,DepthOfFieldScale=0.000000,DepthOfFieldNearBlurSize=15.000000,DepthOfFieldFarBlurSize=15.000000,DepthOfFieldOcclusion=0.400000,DepthOfFieldSkyFocusDistance=0.000000,DepthOfFieldVignetteSize=200.000000,MotionBlurAmount=0.500000,MotionBlurMax=5.000000,MotionBlurTargetFPS=30,MotionBlurPerObjectSize=0.000000,TranslucencyType=Raster,RayTracingTranslucencyMaxRoughness=0.600000,RayTracingTranslucencyRefractionRays=3,RayTracingTranslucencySamplesPerPixel=1,RayTracingTranslucencyMaxPrimaryHitEvents=4,RayTracingTranslucencyMaxSecondaryHitEvents=2,RayTracingTranslucencyShadows=Hard_shadows,RayTracingTranslucencyRefraction=True,RayTracingTranslucencyUseRayTracedRefraction=False,PathTracingMaxBounces=32,PathTracingSamplesPerPixel=2048,PathTracingMaxPathIntensity=24.000000,PathTracingEnableEmissiveMaterials=True,PathTracingEnableReferenceDOF=False,PathTracingEnableReferenceAtmosphere=False,PathTracingEnableDenoiser=True,PathTracingIncludeEmissive=True,PathTracingIncludeDiffuse=True,PathTracingIncludeIndirectDiffuse=True,PathTracingIncludeSpecular=True,PathTracingIncludeIndirectSpecular=True,PathTracingIncludeVolume=True,PathTracingIncludeIndirectVolume=True,UserFlags=0,WeightedBlendables=(Array=)),LightingRigRotation=0.000000,RotationSpeed=2.000000,DirectionalLightRotation=(Pitch=-40.000000,Yaw=-67.500000,Roll=0.000000),bEnableToneMapping=False,bShowMeshEdges=False) +Version=ApplyNewGridMaterial + diff --git a/Config/DefaultEngine.ini b/Config/DefaultEngine.ini index 870fdc0..254dd40 100644 --- a/Config/DefaultEngine.ini +++ b/Config/DefaultEngine.ini @@ -27,6 +27,7 @@ r.Substrate.ProjectGBufferFormat=0 r.DefaultFeature.LocalExposure.HighlightContrastScale=0.8 r.DefaultFeature.LocalExposure.ShadowContrastScale=0.8 +r.Lumen.HardwareRayTracing.LightingMode=0 [/Script/WindowsTargetPlatform.WindowsTargetSettings] DefaultGraphicsRHI=DefaultGraphicsRHI_DX12 diff --git a/Content/FireSystem/FX/NS_CampFire.uasset b/Content/FireSystem/FX/NS_CampFire.uasset new file mode 100644 index 0000000..d5a7bca Binary files /dev/null and b/Content/FireSystem/FX/NS_CampFire.uasset differ diff --git a/Content/FireSystem/FX/NS_SmokeBomb.uasset b/Content/FireSystem/FX/NS_SmokeBomb.uasset new file mode 100644 index 0000000..1a55d7e Binary files /dev/null and b/Content/FireSystem/FX/NS_SmokeBomb.uasset differ diff --git a/Content/FireSystem/FX/NewNiagaraSystem.uasset b/Content/FireSystem/FX/NewNiagaraSystem.uasset new file mode 100644 index 0000000..8cf3cfc Binary files /dev/null and b/Content/FireSystem/FX/NewNiagaraSystem.uasset differ diff --git a/Content/FireSystem/Flipbooks/Candle_Flame_6x6_6480.uasset b/Content/FireSystem/Flipbooks/Candle_Flame_6x6_6480.uasset new file mode 100644 index 0000000..77238ca Binary files /dev/null and b/Content/FireSystem/Flipbooks/Candle_Flame_6x6_6480.uasset differ diff --git a/Content/FireSystem/Flipbooks/Fire_6x6_3072.uasset b/Content/FireSystem/Flipbooks/Fire_6x6_3072.uasset new file mode 100644 index 0000000..0ae1984 Binary files /dev/null and b/Content/FireSystem/Flipbooks/Fire_6x6_3072.uasset differ diff --git a/Content/FireSystem/Flipbooks/Smoke_flipbook.uasset b/Content/FireSystem/Flipbooks/Smoke_flipbook.uasset new file mode 100644 index 0000000..31f41fe Binary files /dev/null and b/Content/FireSystem/Flipbooks/Smoke_flipbook.uasset differ diff --git a/Content/FireSystem/Flipbooks/flipbook.uasset b/Content/FireSystem/Flipbooks/flipbook.uasset new file mode 100644 index 0000000..a6e8731 Binary files /dev/null and b/Content/FireSystem/Flipbooks/flipbook.uasset differ diff --git a/Content/FireSystem/Materials/MI_Candle_Fire_Flipbook.uasset b/Content/FireSystem/Materials/MI_Candle_Fire_Flipbook.uasset new file mode 100644 index 0000000..9af9682 Binary files /dev/null and b/Content/FireSystem/Materials/MI_Candle_Fire_Flipbook.uasset differ diff --git a/Content/FireSystem/Materials/MI_Fire_Flipbook.uasset b/Content/FireSystem/Materials/MI_Fire_Flipbook.uasset new file mode 100644 index 0000000..77a8271 Binary files /dev/null and b/Content/FireSystem/Materials/MI_Fire_Flipbook.uasset differ diff --git a/Content/FireSystem/Materials/MI_Smoke.uasset b/Content/FireSystem/Materials/MI_Smoke.uasset new file mode 100644 index 0000000..7c1ca33 Binary files /dev/null and b/Content/FireSystem/Materials/MI_Smoke.uasset differ diff --git a/Content/FireSystem/Materials/MI_SmokeGranade.uasset b/Content/FireSystem/Materials/MI_SmokeGranade.uasset new file mode 100644 index 0000000..93e42df Binary files /dev/null and b/Content/FireSystem/Materials/MI_SmokeGranade.uasset differ diff --git a/Content/FireSystem/Materials/M_Candle_Fire_Flipbook.uasset b/Content/FireSystem/Materials/M_Candle_Fire_Flipbook.uasset new file mode 100644 index 0000000..8f6b652 Binary files /dev/null and b/Content/FireSystem/Materials/M_Candle_Fire_Flipbook.uasset differ diff --git a/Content/FireSystem/Materials/M_Fire_Flipbook.uasset b/Content/FireSystem/Materials/M_Fire_Flipbook.uasset new file mode 100644 index 0000000..02755de Binary files /dev/null and b/Content/FireSystem/Materials/M_Fire_Flipbook.uasset differ diff --git a/Content/FireSystem/Materials/M_Fire_Flipbook_Inst.uasset b/Content/FireSystem/Materials/M_Fire_Flipbook_Inst.uasset new file mode 100644 index 0000000..ce1c1c9 Binary files /dev/null and b/Content/FireSystem/Materials/M_Fire_Flipbook_Inst.uasset differ diff --git a/Content/FireSystem/Materials/M_HeatDistortion.uasset b/Content/FireSystem/Materials/M_HeatDistortion.uasset new file mode 100644 index 0000000..65bbf1c Binary files /dev/null and b/Content/FireSystem/Materials/M_HeatDistortion.uasset differ diff --git a/Content/FireSystem/Materials/M_Smoke.uasset b/Content/FireSystem/Materials/M_Smoke.uasset new file mode 100644 index 0000000..202c839 Binary files /dev/null and b/Content/FireSystem/Materials/M_Smoke.uasset differ diff --git a/Content/Sounds/Basic_Near.uasset b/Content/Sounds/Basic_Near.uasset new file mode 100644 index 0000000..afe170e Binary files /dev/null and b/Content/Sounds/Basic_Near.uasset differ diff --git a/Content/Sounds/dragon-studio-fire-crackling-sounds-427410.uasset b/Content/Sounds/dragon-studio-fire-crackling-sounds-427410.uasset new file mode 100644 index 0000000..685ddba Binary files /dev/null and b/Content/Sounds/dragon-studio-fire-crackling-sounds-427410.uasset differ diff --git a/Content/Sounds/dragon-studio-fire-crackling-sounds-427410_Cue.uasset b/Content/Sounds/dragon-studio-fire-crackling-sounds-427410_Cue.uasset new file mode 100644 index 0000000..1aad148 Binary files /dev/null and b/Content/Sounds/dragon-studio-fire-crackling-sounds-427410_Cue.uasset differ diff --git a/Content/Sounds/freesound_community-fire-loop-97268.uasset b/Content/Sounds/freesound_community-fire-loop-97268.uasset new file mode 100644 index 0000000..e54da5b Binary files /dev/null and b/Content/Sounds/freesound_community-fire-loop-97268.uasset differ diff --git a/Content/Sounds/freesound_community-fire-loop-97268_Cue.uasset b/Content/Sounds/freesound_community-fire-loop-97268_Cue.uasset new file mode 100644 index 0000000..6154706 Binary files /dev/null and b/Content/Sounds/freesound_community-fire-loop-97268_Cue.uasset differ diff --git a/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset b/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset index 3b0f648..590d9db 100644 Binary files a/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset and b/Content/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.uasset differ diff --git a/Content/UI/WBP_HealthBar.uasset b/Content/UI/WBP_HealthBar.uasset index c4dd259..edc9aec 100644 Binary files a/Content/UI/WBP_HealthBar.uasset and b/Content/UI/WBP_HealthBar.uasset differ diff --git a/Content/objects/BoulderA/BoulderA.uasset b/Content/objects/BoulderA/BoulderA.uasset new file mode 100644 index 0000000..dc8908f Binary files /dev/null and b/Content/objects/BoulderA/BoulderA.uasset differ diff --git a/Content/objects/BoulderA/BoulderA_BaseColor.uasset b/Content/objects/BoulderA/BoulderA_BaseColor.uasset new file mode 100644 index 0000000..6ee7679 Binary files /dev/null and b/Content/objects/BoulderA/BoulderA_BaseColor.uasset differ diff --git a/Content/objects/BoulderA/BoulderA_Material.uasset b/Content/objects/BoulderA/BoulderA_Material.uasset new file mode 100644 index 0000000..e822ae1 Binary files /dev/null and b/Content/objects/BoulderA/BoulderA_Material.uasset differ diff --git a/Content/objects/BoulderA/BoulderA_Normal.uasset b/Content/objects/BoulderA/BoulderA_Normal.uasset new file mode 100644 index 0000000..c17c21c Binary files /dev/null and b/Content/objects/BoulderA/BoulderA_Normal.uasset differ diff --git a/Content/objects/BoulderA/BoulderA_Roughness.uasset b/Content/objects/BoulderA/BoulderA_Roughness.uasset new file mode 100644 index 0000000..fb31e4e Binary files /dev/null and b/Content/objects/BoulderA/BoulderA_Roughness.uasset differ diff --git a/Content/objects/BoulderB/BoulderA_BaseColor.uasset b/Content/objects/BoulderB/BoulderA_BaseColor.uasset new file mode 100644 index 0000000..2c356b9 Binary files /dev/null and b/Content/objects/BoulderB/BoulderA_BaseColor.uasset differ diff --git a/Content/objects/BoulderB/BoulderA_Material_001.uasset b/Content/objects/BoulderB/BoulderA_Material_001.uasset new file mode 100644 index 0000000..8534c35 Binary files /dev/null and b/Content/objects/BoulderB/BoulderA_Material_001.uasset differ diff --git a/Content/objects/BoulderB/BoulderA_Normal.uasset b/Content/objects/BoulderB/BoulderA_Normal.uasset new file mode 100644 index 0000000..85d159b Binary files /dev/null and b/Content/objects/BoulderB/BoulderA_Normal.uasset differ diff --git a/Content/objects/BoulderB/BoulderA_Roughness.uasset b/Content/objects/BoulderB/BoulderA_Roughness.uasset new file mode 100644 index 0000000..0df6bc9 Binary files /dev/null and b/Content/objects/BoulderB/BoulderA_Roughness.uasset differ diff --git a/Content/objects/BoulderB/BoulderB.uasset b/Content/objects/BoulderB/BoulderB.uasset new file mode 100644 index 0000000..e883b89 Binary files /dev/null and b/Content/objects/BoulderB/BoulderB.uasset differ diff --git a/Content/objects/Coal/Charcoal4k_albedo.uasset b/Content/objects/Coal/Charcoal4k_albedo.uasset new file mode 100644 index 0000000..6590503 Binary files /dev/null and b/Content/objects/Coal/Charcoal4k_albedo.uasset differ diff --git a/Content/objects/Coal/Charcoal4k_emission.uasset b/Content/objects/Coal/Charcoal4k_emission.uasset new file mode 100644 index 0000000..1add161 Binary files /dev/null and b/Content/objects/Coal/Charcoal4k_emission.uasset differ diff --git a/Content/objects/Coal/Charcoal4k_height.uasset b/Content/objects/Coal/Charcoal4k_height.uasset new file mode 100644 index 0000000..36f68c9 Binary files /dev/null and b/Content/objects/Coal/Charcoal4k_height.uasset differ diff --git a/Content/objects/Coal/Charcoal4k_normal.uasset b/Content/objects/Coal/Charcoal4k_normal.uasset new file mode 100644 index 0000000..309122f Binary files /dev/null and b/Content/objects/Coal/Charcoal4k_normal.uasset differ diff --git a/Content/objects/Coal/Charcoal4k_orm.uasset b/Content/objects/Coal/Charcoal4k_orm.uasset new file mode 100644 index 0000000..caec6f5 Binary files /dev/null and b/Content/objects/Coal/Charcoal4k_orm.uasset differ diff --git a/Content/objects/Coal/M_Charcoal.uasset b/Content/objects/Coal/M_Charcoal.uasset new file mode 100644 index 0000000..681f198 Binary files /dev/null and b/Content/objects/Coal/M_Charcoal.uasset differ diff --git a/Content/objects/Coal/M_Charcoal_Inst.uasset b/Content/objects/Coal/M_Charcoal_Inst.uasset new file mode 100644 index 0000000..07469cc Binary files /dev/null and b/Content/objects/Coal/M_Charcoal_Inst.uasset differ diff --git a/Content/objects/Rock_LowPoly/Rock_BaseColor.uasset b/Content/objects/Rock_LowPoly/Rock_BaseColor.uasset new file mode 100644 index 0000000..ecc2ecc Binary files /dev/null and b/Content/objects/Rock_LowPoly/Rock_BaseColor.uasset differ diff --git a/Content/objects/Rock_LowPoly/Rock_LowPoly.uasset b/Content/objects/Rock_LowPoly/Rock_LowPoly.uasset new file mode 100644 index 0000000..b226a60 Binary files /dev/null and b/Content/objects/Rock_LowPoly/Rock_LowPoly.uasset differ diff --git a/Content/objects/Rock_LowPoly/Rock_LowPoly_Baked.uasset b/Content/objects/Rock_LowPoly/Rock_LowPoly_Baked.uasset new file mode 100644 index 0000000..4e261fc Binary files /dev/null and b/Content/objects/Rock_LowPoly/Rock_LowPoly_Baked.uasset differ diff --git a/Content/objects/Rock_LowPoly/Rock_Normal.uasset b/Content/objects/Rock_LowPoly/Rock_Normal.uasset new file mode 100644 index 0000000..aff0591 Binary files /dev/null and b/Content/objects/Rock_LowPoly/Rock_Normal.uasset differ diff --git a/Content/objects/Rock_LowPoly/Rock_Roughness.uasset b/Content/objects/Rock_LowPoly/Rock_Roughness.uasset new file mode 100644 index 0000000..3898655 Binary files /dev/null and b/Content/objects/Rock_LowPoly/Rock_Roughness.uasset differ diff --git a/KingshearthLegacy.uproject b/KingshearthLegacy.uproject index e45cb86..3419603 100644 --- a/KingshearthLegacy.uproject +++ b/KingshearthLegacy.uproject @@ -42,6 +42,10 @@ { "Name": "EditorToolset", "Enabled": true + }, + { + "Name": "GameplayAbilities", + "Enabled": true } ] } \ No newline at end of file diff --git a/Source/KingshearthLegacy/AttributeSets/HealthAttributeSet.cpp b/Source/KingshearthLegacy/AttributeSets/HealthAttributeSet.cpp new file mode 100644 index 0000000..6fe40c7 --- /dev/null +++ b/Source/KingshearthLegacy/AttributeSets/HealthAttributeSet.cpp @@ -0,0 +1,96 @@ +#include "HealthAttributeSet.h" +#include "GameplayEffectExtension.h" + +UHealthAttributeSet::UHealthAttributeSet() +{ + InitHealth(100.0f); + InitMaxHealth(100.0f); +} + +void UHealthAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) +{ + Super::PreAttributeChange(Attribute, NewValue); + + if (Attribute == GetHealthAttribute()) + { + NewValue = FMath::Clamp(NewValue, 0.0f, GetMaxHealth()); + } + else if (Attribute == GetMaxHealthAttribute()) + { + NewValue = FMath::Max(NewValue, 0.0f); + } +} + +void UHealthAttributeSet::PreAttributeBaseChange(const FGameplayAttribute& Attribute, float& NewValue) const +{ + Super::PreAttributeBaseChange(Attribute, NewValue); + + // Instant GameplayEffects (and any future ApplyModToAttribute caller) write BaseValue through this hook, + // not PreAttributeChange - without clamping here a large delta can push BaseValue out of range while + // PreAttributeChange still clamps the displayed CurrentValue, silently absorbing later deltas. See the + // matching comment on UStaminaAttributeSet::PreAttributeBaseChange for how this actually manifested. + if (Attribute == GetHealthAttribute()) + { + NewValue = FMath::Clamp(NewValue, 0.0f, GetMaxHealth()); + } + else if (Attribute == GetMaxHealthAttribute()) + { + NewValue = FMath::Max(NewValue, 0.0f); + } +} + +void UHealthAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) +{ + Super::PostGameplayEffectExecute(Data); + + // Only converts the Damage/Healing meta-attributes into a Health change - this hook fires for GE + // "executes" (Instant effects, periodic ticks) only. GE_HealthDebuff is Infinite and non-periodic, + // so applying/updating it does NOT fire this - see PostAttributeChange for the hook that does. + const FGameplayAttribute& ModifiedAttribute = Data.EvaluatedData.Attribute; + + if (ModifiedAttribute == GetDamageAttribute()) + { + const float DamageDone = GetDamage(); + SetDamage(0.0f); + SetHealth(GetHealth() - DamageDone); + } + else if (ModifiedAttribute == GetHealingAttribute()) + { + const float HealingDone = GetHealing(); + SetHealing(0.0f); + SetHealth(GetHealth() + HealingDone); + } +} + +void UHealthAttributeSet::PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) +{ + Super::PostAttributeChange(Attribute, OldValue, NewValue); + + // Fires for every CurrentValue change regardless of source (GE execute, or - critically - an Infinite + // GE like GE_HealthDebuff being applied/removed/re-evaluated, which never triggers PostGameplayEffectExecute). + if (Attribute == GetHealthAttribute()) + { + if (!FMath::IsNearlyEqual(OldValue, NewValue)) + { + OnHealthChanged.Broadcast(NewValue); + } + + if (OldValue > 0.0f && NewValue <= 0.0f) + { + OnDeath.Broadcast(); + } + } + else if (Attribute == GetMaxHealthAttribute()) + { + if (!FMath::IsNearlyEqual(OldValue, NewValue)) + { + ClampHealth(); + OnHealthDebuffChanged.Broadcast(GetHealthDebuff()); + } + } +} + +void UHealthAttributeSet::ClampHealth() +{ + SetHealth(FMath::Clamp(GetHealth(), 0.0f, GetMaxHealth())); +} diff --git a/Source/KingshearthLegacy/AttributeSets/HealthAttributeSet.h b/Source/KingshearthLegacy/AttributeSets/HealthAttributeSet.h new file mode 100644 index 0000000..aa77028 --- /dev/null +++ b/Source/KingshearthLegacy/AttributeSets/HealthAttributeSet.h @@ -0,0 +1,79 @@ +#pragma once + +#include "CoreMinimal.h" +#include "AttributeSet.h" +#include "AbilitySystemComponent.h" +#include "HealthAttributeSet.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChanged, float, NewHealth); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthDebuffChanged, float, NewHealthDebuff); +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnDeath); + +#define HEALTHATTRIBUTE_ACCESSORS(PropertyName) \ + GAMEPLAYATTRIBUTE_PROPERTY_GETTER(UHealthAttributeSet, PropertyName) \ + GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \ + GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \ + GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName) + +/** + * Health + MaxHealth, replacing UHealthComponent. HealthDebuff no longer exists as its own + * attribute - it's GE_HealthDebuff applying a Multiply modifier to MaxHealth, so the "locked" + * fraction is just (1 - MaxHealth.CurrentValue / MaxHealth.BaseValue). See GetHealthDebuff() + * on AKingshearthLegacyCharacter. + */ +UCLASS() +class KINGSHEARTHLEGACY_API UHealthAttributeSet : public UAttributeSet +{ + GENERATED_BODY() + +public: + UHealthAttributeSet(); + + UPROPERTY(BlueprintReadOnly, Category = "Health") + FGameplayAttributeData Health; + HEALTHATTRIBUTE_ACCESSORS(Health) + + /** Nominal cap: BaseValue is the undebuffed max, CurrentValue is what GE_HealthDebuff (and similar) leave after their modifiers. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Health") + FGameplayAttributeData MaxHealth; + HEALTHATTRIBUTE_ACCESSORS(MaxHealth) + + /** Unclamped meta attribute: incoming damage lands here via GE_HealthDamage; PostGameplayEffectExecute converts it into a Health decrease and resets it to 0. Never read directly. */ + UPROPERTY(BlueprintReadOnly, Category = "Health") + FGameplayAttributeData Damage; + HEALTHATTRIBUTE_ACCESSORS(Damage) + + /** Unclamped meta attribute: incoming healing lands here via GE_HealthHealing; PostGameplayEffectExecute converts it into a Health increase and resets it to 0. Never read directly. */ + UPROPERTY(BlueprintReadOnly, Category = "Health") + FGameplayAttributeData Healing; + HEALTHATTRIBUTE_ACCESSORS(Healing) + + /** Nominal cap, unaffected by debuffs. Feeds the health bar's total width. */ + float GetNominalMaxHealth() const { return MaxHealth.GetBaseValue(); } + + /** 0-1 fraction of GetNominalMaxHealth() currently locked/unusable (curses, status effects, ...). */ + float GetHealthDebuff() const + { + const float NominalMaxHealth = FMath::Max(GetNominalMaxHealth(), KINDA_SMALL_NUMBER); + return FMath::Clamp(1.0f - (GetMaxHealth() / NominalMaxHealth), 0.0f, 1.0f); + } + + UPROPERTY(BlueprintAssignable, Category = "Health") + FOnHealthChanged OnHealthChanged; + + UPROPERTY(BlueprintAssignable, Category = "Health") + FOnHealthDebuffChanged OnHealthDebuffChanged; + + UPROPERTY(BlueprintAssignable, Category = "Health") + FOnDeath OnDeath; + + virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override; + virtual void PreAttributeBaseChange(const FGameplayAttribute& Attribute, float& NewValue) const override; + virtual void PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data) override; + virtual void PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) override; + +private: + void ClampHealth(); +}; + +#undef HEALTHATTRIBUTE_ACCESSORS diff --git a/Source/KingshearthLegacy/AttributeSets/StaminaAttributeSet.cpp b/Source/KingshearthLegacy/AttributeSets/StaminaAttributeSet.cpp new file mode 100644 index 0000000..ae56792 --- /dev/null +++ b/Source/KingshearthLegacy/AttributeSets/StaminaAttributeSet.cpp @@ -0,0 +1,86 @@ +#include "StaminaAttributeSet.h" + +UStaminaAttributeSet::UStaminaAttributeSet() +{ + InitStamina(100.0f); + InitMaxStamina(100.0f); + InitFatigue(0.0f); +} + +void UStaminaAttributeSet::PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) +{ + Super::PreAttributeChange(Attribute, NewValue); + + if (Attribute == GetStaminaAttribute()) + { + NewValue = FMath::Clamp(NewValue, 0.0f, GetMaxStamina()); + } + else if (Attribute == GetMaxStaminaAttribute()) + { + NewValue = FMath::Max(NewValue, 0.0f); + } + else if (Attribute == GetFatigueAttribute()) + { + NewValue = FMath::Clamp(NewValue, 0.0f, 1.0f); + } +} + +void UStaminaAttributeSet::PreAttributeBaseChange(const FGameplayAttribute& Attribute, float& NewValue) const +{ + Super::PreAttributeBaseChange(Attribute, NewValue); + + // ApplyModToAttribute (SpendStamina/RestoreStamina/regen) writes BaseValue through this hook, not + // PreAttributeChange - without clamping here, a large delta (e.g. RestoreStamina's debug "fill to max") + // pushes BaseValue past MaxStamina. PreAttributeChange still clamps the displayed CurrentValue, but the + // bloated BaseValue then absorbs every subsequent spend/regen delta before CurrentValue moves again. + if (Attribute == GetStaminaAttribute()) + { + NewValue = FMath::Clamp(NewValue, 0.0f, GetMaxStamina()); + } + else if (Attribute == GetMaxStaminaAttribute()) + { + NewValue = FMath::Max(NewValue, 0.0f); + } + else if (Attribute == GetFatigueAttribute()) + { + NewValue = FMath::Clamp(NewValue, 0.0f, 1.0f); + } +} + +void UStaminaAttributeSet::PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) +{ + Super::PostAttributeChange(Attribute, OldValue, NewValue); + + if (Attribute == GetStaminaAttribute()) + { + if (!FMath::IsNearlyEqual(OldValue, NewValue)) + { + OnStaminaChanged.Broadcast(NewValue); + } + + if (OldValue > 0.0f && NewValue <= 0.0f) + { + OnExhausted.Broadcast(); + } + } + else if (Attribute == GetMaxStaminaAttribute()) + { + if (!FMath::IsNearlyEqual(OldValue, NewValue)) + { + // MaxStamina shrank/grew (typically GE_StaminaFatiguePenalty re-evaluating) - pull Stamina back in range. + ClampStamina(); + } + } + else if (Attribute == GetFatigueAttribute()) + { + if (!FMath::IsNearlyEqual(OldValue, NewValue)) + { + OnFatigueChanged.Broadcast(NewValue); + } + } +} + +void UStaminaAttributeSet::ClampStamina() +{ + SetStamina(FMath::Clamp(GetStamina(), 0.0f, GetMaxStamina())); +} diff --git a/Source/KingshearthLegacy/AttributeSets/StaminaAttributeSet.h b/Source/KingshearthLegacy/AttributeSets/StaminaAttributeSet.h new file mode 100644 index 0000000..cb88216 --- /dev/null +++ b/Source/KingshearthLegacy/AttributeSets/StaminaAttributeSet.h @@ -0,0 +1,74 @@ +#pragma once + +#include "CoreMinimal.h" +#include "AttributeSet.h" +#include "AbilitySystemComponent.h" +#include "StaminaAttributeSet.generated.h" + +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnStaminaChanged, float, NewStamina); +DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnFatigueChanged, float, NewFatigue); +DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnExhausted); + +#define STAMINAATTRIBUTE_ACCESSORS(PropertyName) \ + GAMEPLAYATTRIBUTE_PROPERTY_GETTER(UStaminaAttributeSet, PropertyName) \ + GAMEPLAYATTRIBUTE_VALUE_GETTER(PropertyName) \ + GAMEPLAYATTRIBUTE_VALUE_SETTER(PropertyName) \ + GAMEPLAYATTRIBUTE_VALUE_INITTER(PropertyName) + +/** + * Stamina + MaxStamina + Fatigue, replacing UStaminaComponent. Unlike Health, all three attributes + * are mutated directly (via AbilitySystemComponent::ApplyModToAttribute from the character's tick, + * see SpendStamina/TickStaminaRegen) rather than through discrete GameplayEffects - there's no + * damage-type/resistance concept for stamina spend to warrant Health's meta-attribute indirection. + * The one thing that IS a real GameplayEffect is GE_StaminaFatiguePenalty: an always-on Infinite + * effect (applied once in BeginPlay) that uses MMC_MaxStaminaFatiguePenalty to keep MaxStamina's + * CurrentValue equal to BaseValue * (1 - Fatigue), recalculated automatically by GAS's own + * aggregator whenever Fatigue changes, replacing the old hand-written GetEffectiveMaxStamina(). + * + * Broadcasts live in PostAttributeChange (fires for ANY mutation path, not just GameplayEffect + * execution) specifically so the Fatigue-driven MaxStamina recalculation broadcasts correctly too. + */ +UCLASS() +class KINGSHEARTHLEGACY_API UStaminaAttributeSet : public UAttributeSet +{ + GENERATED_BODY() + +public: + UStaminaAttributeSet(); + + UPROPERTY(BlueprintReadOnly, Category = "Stamina") + FGameplayAttributeData Stamina; + STAMINAATTRIBUTE_ACCESSORS(Stamina) + + /** Nominal cap: BaseValue is the undebuffed max, CurrentValue is what GE_StaminaFatiguePenalty leaves after Fatigue. */ + UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stamina") + FGameplayAttributeData MaxStamina; + STAMINAATTRIBUTE_ACCESSORS(MaxStamina) + + /** 0-1 fraction of MaxStamina currently locked away due to over-extension. */ + UPROPERTY(BlueprintReadOnly, Category = "Fatigue") + FGameplayAttributeData Fatigue; + STAMINAATTRIBUTE_ACCESSORS(Fatigue) + + /** Nominal cap, unaffected by Fatigue. Feeds the stamina bar's total width. */ + float GetNominalMaxStamina() const { return MaxStamina.GetBaseValue(); } + + UPROPERTY(BlueprintAssignable, Category = "Stamina") + FOnStaminaChanged OnStaminaChanged; + + UPROPERTY(BlueprintAssignable, Category = "Fatigue") + FOnFatigueChanged OnFatigueChanged; + + /** Broadcast when Stamina is driven from a positive value to empty. */ + UPROPERTY(BlueprintAssignable, Category = "Stamina") + FOnExhausted OnExhausted; + + virtual void PreAttributeChange(const FGameplayAttribute& Attribute, float& NewValue) override; + virtual void PreAttributeBaseChange(const FGameplayAttribute& Attribute, float& NewValue) const override; + virtual void PostAttributeChange(const FGameplayAttribute& Attribute, float OldValue, float NewValue) override; + +private: + void ClampStamina(); +}; + +#undef STAMINAATTRIBUTE_ACCESSORS diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_HealthDamage.cpp b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDamage.cpp new file mode 100644 index 0000000..c21596a --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDamage.cpp @@ -0,0 +1,18 @@ +#include "GE_HealthDamage.h" +#include "HealthAttributeSet.h" +#include "KingshearthLegacyGameplayTags.h" + +UGE_HealthDamage::UGE_HealthDamage() +{ + DurationPolicy = EGameplayEffectDurationType::Instant; + + FSetByCallerFloat SetByCaller; + SetByCaller.DataTag = TAG_Data_Health_Damage.GetTag(); + + FGameplayModifierInfo Modifier; + Modifier.Attribute = UHealthAttributeSet::GetDamageAttribute(); + Modifier.ModifierOp = EGameplayModOp::Additive; + Modifier.ModifierMagnitude = FGameplayEffectModifierMagnitude(SetByCaller); + + Modifiers.Add(Modifier); +} diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_HealthDamage.h b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDamage.h new file mode 100644 index 0000000..067d390 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDamage.h @@ -0,0 +1,15 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameplayEffect.h" +#include "GE_HealthDamage.generated.h" + +/** Instant effect: adds a caller-specified amount (SetByCaller TAG_Data_Health_Damage) to HealthAttributeSet::Damage. */ +UCLASS() +class KINGSHEARTHLEGACY_API UGE_HealthDamage : public UGameplayEffect +{ + GENERATED_BODY() + +public: + UGE_HealthDamage(); +}; diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_HealthDebuff.cpp b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDebuff.cpp new file mode 100644 index 0000000..1999717 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDebuff.cpp @@ -0,0 +1,18 @@ +#include "GE_HealthDebuff.h" +#include "HealthAttributeSet.h" +#include "KingshearthLegacyGameplayTags.h" + +UGE_HealthDebuff::UGE_HealthDebuff() +{ + DurationPolicy = EGameplayEffectDurationType::Infinite; + + FSetByCallerFloat SetByCaller; + SetByCaller.DataTag = TAG_Data_HealthDebuff_Multiplier.GetTag(); + + FGameplayModifierInfo Modifier; + Modifier.Attribute = UHealthAttributeSet::GetMaxHealthAttribute(); + Modifier.ModifierOp = EGameplayModOp::MultiplyAdditive; + Modifier.ModifierMagnitude = FGameplayEffectModifierMagnitude(SetByCaller); + + Modifiers.Add(Modifier); +} diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_HealthDebuff.h b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDebuff.h new file mode 100644 index 0000000..a2dfbf9 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_HealthDebuff.h @@ -0,0 +1,20 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameplayEffect.h" +#include "GE_HealthDebuff.generated.h" + +/** + * Infinite effect: multiplies MaxHealth's CurrentValue by a caller-specified fraction + * (SetByCaller TAG_Data_HealthDebuff_Multiplier, e.g. 0.7 to lock away 30%). Stands in for + * a future curse/status-effect system - AKingshearthLegacyCharacter::SetHealthDebuff applies/ + * removes one instance of this, tracked by its FActiveGameplayEffectHandle. + */ +UCLASS() +class KINGSHEARTHLEGACY_API UGE_HealthDebuff : public UGameplayEffect +{ + GENERATED_BODY() + +public: + UGE_HealthDebuff(); +}; diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_HealthHealing.cpp b/Source/KingshearthLegacy/GameplayEffects/GE_HealthHealing.cpp new file mode 100644 index 0000000..71de3df --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_HealthHealing.cpp @@ -0,0 +1,18 @@ +#include "GE_HealthHealing.h" +#include "HealthAttributeSet.h" +#include "KingshearthLegacyGameplayTags.h" + +UGE_HealthHealing::UGE_HealthHealing() +{ + DurationPolicy = EGameplayEffectDurationType::Instant; + + FSetByCallerFloat SetByCaller; + SetByCaller.DataTag = TAG_Data_Health_Healing.GetTag(); + + FGameplayModifierInfo Modifier; + Modifier.Attribute = UHealthAttributeSet::GetHealingAttribute(); + Modifier.ModifierOp = EGameplayModOp::Additive; + Modifier.ModifierMagnitude = FGameplayEffectModifierMagnitude(SetByCaller); + + Modifiers.Add(Modifier); +} diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_HealthHealing.h b/Source/KingshearthLegacy/GameplayEffects/GE_HealthHealing.h new file mode 100644 index 0000000..719f888 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_HealthHealing.h @@ -0,0 +1,15 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameplayEffect.h" +#include "GE_HealthHealing.generated.h" + +/** Instant effect: adds a caller-specified amount (SetByCaller TAG_Data_Health_Healing) to HealthAttributeSet::Healing. */ +UCLASS() +class KINGSHEARTHLEGACY_API UGE_HealthHealing : public UGameplayEffect +{ + GENERATED_BODY() + +public: + UGE_HealthHealing(); +}; diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_StaminaFatiguePenalty.cpp b/Source/KingshearthLegacy/GameplayEffects/GE_StaminaFatiguePenalty.cpp new file mode 100644 index 0000000..ef46ad5 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_StaminaFatiguePenalty.cpp @@ -0,0 +1,18 @@ +#include "GE_StaminaFatiguePenalty.h" +#include "StaminaAttributeSet.h" +#include "MMC_MaxStaminaFatiguePenalty.h" + +UGE_StaminaFatiguePenalty::UGE_StaminaFatiguePenalty() +{ + DurationPolicy = EGameplayEffectDurationType::Infinite; + + FCustomCalculationBasedFloat CustomCalculation; + CustomCalculation.CalculationClassMagnitude = UMMC_MaxStaminaFatiguePenalty::StaticClass(); + + FGameplayModifierInfo Modifier; + Modifier.Attribute = UStaminaAttributeSet::GetMaxStaminaAttribute(); + Modifier.ModifierOp = EGameplayModOp::MultiplyAdditive; + Modifier.ModifierMagnitude = FGameplayEffectModifierMagnitude(CustomCalculation); + + Modifiers.Add(Modifier); +} diff --git a/Source/KingshearthLegacy/GameplayEffects/GE_StaminaFatiguePenalty.h b/Source/KingshearthLegacy/GameplayEffects/GE_StaminaFatiguePenalty.h new file mode 100644 index 0000000..01cb1b9 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/GE_StaminaFatiguePenalty.h @@ -0,0 +1,19 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameplayEffect.h" +#include "GE_StaminaFatiguePenalty.generated.h" + +/** + * Always-on Infinite effect applied once in AKingshearthLegacyCharacter::BeginPlay: multiplies + * MaxStamina's CurrentValue by MMC_MaxStaminaFatiguePenalty's (1 - Fatigue), so MaxStamina tracks + * Fatigue automatically via GAS's aggregator - replaces the old hand-written GetEffectiveMaxStamina(). + */ +UCLASS() +class KINGSHEARTHLEGACY_API UGE_StaminaFatiguePenalty : public UGameplayEffect +{ + GENERATED_BODY() + +public: + UGE_StaminaFatiguePenalty(); +}; diff --git a/Source/KingshearthLegacy/GameplayEffects/MMC_MaxStaminaFatiguePenalty.cpp b/Source/KingshearthLegacy/GameplayEffects/MMC_MaxStaminaFatiguePenalty.cpp new file mode 100644 index 0000000..e33edaa --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/MMC_MaxStaminaFatiguePenalty.cpp @@ -0,0 +1,20 @@ +#include "MMC_MaxStaminaFatiguePenalty.h" +#include "StaminaAttributeSet.h" + +UMMC_MaxStaminaFatiguePenalty::UMMC_MaxStaminaFatiguePenalty() +{ + FatigueCaptureDef = FGameplayEffectAttributeCaptureDefinition( + UStaminaAttributeSet::GetFatigueAttribute(), + EGameplayEffectAttributeCaptureSource::Target, + false); + + RelevantAttributesToCapture.Add(FatigueCaptureDef); +} + +float UMMC_MaxStaminaFatiguePenalty::CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const +{ + float Fatigue = 0.0f; + GetCapturedAttributeMagnitude(FatigueCaptureDef, Spec, FAggregatorEvaluateParameters(), Fatigue); + + return 1.0f - FMath::Clamp(Fatigue, 0.0f, 1.0f); +} diff --git a/Source/KingshearthLegacy/GameplayEffects/MMC_MaxStaminaFatiguePenalty.h b/Source/KingshearthLegacy/GameplayEffects/MMC_MaxStaminaFatiguePenalty.h new file mode 100644 index 0000000..6c9ac51 --- /dev/null +++ b/Source/KingshearthLegacy/GameplayEffects/MMC_MaxStaminaFatiguePenalty.h @@ -0,0 +1,20 @@ +#pragma once + +#include "CoreMinimal.h" +#include "GameplayModMagnitudeCalculation.h" +#include "MMC_MaxStaminaFatiguePenalty.generated.h" + +/** Captures Fatigue (live, non-snapshot) and returns (1 - Fatigue) as the Multiply(Additive) magnitude for GE_StaminaFatiguePenalty's MaxStamina modifier. */ +UCLASS() +class KINGSHEARTHLEGACY_API UMMC_MaxStaminaFatiguePenalty : public UGameplayModMagnitudeCalculation +{ + GENERATED_BODY() + +public: + UMMC_MaxStaminaFatiguePenalty(); + + virtual float CalculateBaseMagnitude_Implementation(const FGameplayEffectSpec& Spec) const override; + +private: + FGameplayEffectAttributeCaptureDefinition FatigueCaptureDef; +}; diff --git a/Source/KingshearthLegacy/HealthComponent.cpp b/Source/KingshearthLegacy/HealthComponent.cpp deleted file mode 100644 index 3081ceb..0000000 --- a/Source/KingshearthLegacy/HealthComponent.cpp +++ /dev/null @@ -1,89 +0,0 @@ -#include "HealthComponent.h" - -UHealthComponent::UHealthComponent() -{ - PrimaryComponentTick.bCanEverTick = false; -} - -void UHealthComponent::BeginPlay() -{ - Super::BeginPlay(); - - CurrentHealth = GetEffectiveMaxHealth(); -} - -float UHealthComponent::GetHealth() const -{ - return CurrentHealth; -} - -float UHealthComponent::GetMaxHealth() const -{ - return MaxHealth; -} - -float UHealthComponent::GetHealthDebuff() const -{ - return HealthDebuff; -} - -float UHealthComponent::GetEffectiveMaxHealth() const -{ - return MaxHealth * (1.0f - HealthDebuff); -} - -void UHealthComponent::SetMaxHealth(float NewMaxHealth) -{ - MaxHealth = FMath::Max(NewMaxHealth, 0.0f); - - CurrentHealth = FMath::Clamp(CurrentHealth, 0.0f, GetEffectiveMaxHealth()); -} - -void UHealthComponent::SetHealth(float NewHealth) -{ - const float PreviousHealth = CurrentHealth; - - CurrentHealth = FMath::Clamp(NewHealth, 0.0f, GetEffectiveMaxHealth()); - - OnHealthChanged.Broadcast(CurrentHealth); - - // Only trigger death when crossing from alive to dead. - if (PreviousHealth > 0.0f && CurrentHealth <= 0.0f) - { - OnDeath.Broadcast(); - } -} - -void UHealthComponent::AddHealth(float Amount) -{ - if (Amount <= 0.0f) - { - return; - } - - SetHealth(CurrentHealth + Amount); -} - -void UHealthComponent::RemoveHealth(float Amount) -{ - if (Amount <= 0.0f) - { - return; - } - - SetHealth(CurrentHealth - Amount); -} - -void UHealthComponent::SetHealthDebuff(float NewHealthDebuff) -{ - HealthDebuff = FMath::Clamp(NewHealthDebuff, 0.0f, 1.0f); - - const float ClampedHealth = FMath::Clamp(CurrentHealth, 0.0f, GetEffectiveMaxHealth()); - if (!FMath::IsNearlyEqual(ClampedHealth, CurrentHealth)) - { - CurrentHealth = ClampedHealth; - OnHealthChanged.Broadcast(CurrentHealth); - } - - OnHealthDebuffChanged.Broadcast(HealthDebuff); -} diff --git a/Source/KingshearthLegacy/HealthComponent.h b/Source/KingshearthLegacy/HealthComponent.h deleted file mode 100644 index f69b6df..0000000 --- a/Source/KingshearthLegacy/HealthComponent.h +++ /dev/null @@ -1,73 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "Components/ActorComponent.h" -#include "HealthComponent.generated.h" - -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthChanged, float, NewHealth); -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnHealthDebuffChanged, float, NewHealthDebuff); -DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnDeath); - -UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent)) -class KINGSHEARTHLEGACY_API UHealthComponent : public UActorComponent -{ - GENERATED_BODY() - -public: - UHealthComponent(); - -protected: - virtual void BeginPlay() override; - -public: - // Health - UFUNCTION(BlueprintPure, Category = "Health") - float GetHealth() const; - - /** Nominal cap, unaffected by HealthDebuff. Feeds the health bar's total width. */ - UFUNCTION(BlueprintPure, Category = "Health") - float GetMaxHealth() const; - - /** 0-1 fraction of MaxHealth currently locked/unusable (curses, status effects, ...). */ - UFUNCTION(BlueprintPure, Category = "Health") - float GetHealthDebuff() const; - - UFUNCTION(BlueprintCallable, Category = "Health") - void SetMaxHealth(float NewMaxHealth); - - UFUNCTION(BlueprintCallable, Category = "Health") - void SetHealth(float NewHealth); - - UFUNCTION(BlueprintCallable, Category = "Health") - void AddHealth(float Amount); - - UFUNCTION(BlueprintCallable, Category = "Health") - void RemoveHealth(float Amount); - - /** Sets how much of MaxHealth is currently locked away (0-1). Not driven by anything yet - a future debuff/curse/status-effect system calls this. */ - UFUNCTION(BlueprintCallable, Category = "Health") - void SetHealthDebuff(float NewHealthDebuff); - -protected: - /** MaxHealth minus whatever HealthDebuff currently locks away - what Health is actually clamped against. */ - float GetEffectiveMaxHealth() const; - - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Health") - float MaxHealth = 100.0f; - - UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Health") - float CurrentHealth = 100.0f; - - UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Health") - float HealthDebuff = 0.0f; - -public: - UPROPERTY(BlueprintAssignable, Category = "Health") - FOnHealthChanged OnHealthChanged; - - UPROPERTY(BlueprintAssignable, Category = "Health") - FOnHealthDebuffChanged OnHealthDebuffChanged; - - UPROPERTY(BlueprintAssignable, Category = "Health") - FOnDeath OnDeath; -}; \ No newline at end of file diff --git a/Source/KingshearthLegacy/KingshearthLegacy.Build.cs b/Source/KingshearthLegacy/KingshearthLegacy.Build.cs index cb0abdb..c82cf22 100644 --- a/Source/KingshearthLegacy/KingshearthLegacy.Build.cs +++ b/Source/KingshearthLegacy/KingshearthLegacy.Build.cs @@ -18,13 +18,18 @@ public class KingshearthLegacy : ModuleRules "StateTreeModule", "GameplayStateTreeModule", "UMG", - "Slate" + "Slate", + "GameplayAbilities", + "GameplayTags", + "GameplayTasks" }); PrivateDependencyModuleNames.AddRange(new string[] { }); PublicIncludePaths.AddRange(new string[] { "KingshearthLegacy", + "KingshearthLegacy/AttributeSets", + "KingshearthLegacy/GameplayEffects", "KingshearthLegacy/Variant_Platforming", "KingshearthLegacy/Variant_Platforming/Animation", "KingshearthLegacy/Variant_Combat", diff --git a/Source/KingshearthLegacy/KingshearthLegacyCharacter.cpp b/Source/KingshearthLegacy/KingshearthLegacyCharacter.cpp index 06d412e..87a2777 100644 --- a/Source/KingshearthLegacy/KingshearthLegacyCharacter.cpp +++ b/Source/KingshearthLegacy/KingshearthLegacyCharacter.cpp @@ -11,7 +11,14 @@ #include "EnhancedInputSubsystems.h" #include "InputActionValue.h" #include "KingshearthLegacy.h" -#include "StaminaComponent.h" +#include "AbilitySystemComponent.h" +#include "HealthAttributeSet.h" +#include "StaminaAttributeSet.h" +#include "GE_HealthDamage.h" +#include "GE_HealthHealing.h" +#include "GE_HealthDebuff.h" +#include "GE_StaminaFatiguePenalty.h" +#include "KingshearthLegacyGameplayTags.h" AKingshearthLegacyCharacter::AKingshearthLegacyCharacter() { @@ -47,8 +54,16 @@ AKingshearthLegacyCharacter::AKingshearthLegacyCharacter() FollowCamera->SetupAttachment(CameraBoom, USpringArmComponent::SocketName); FollowCamera->bUsePawnControlRotation = false; - // Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) + // Note: The skeletal mesh and anim blueprint references on the Mesh component (inherited from Character) // are set in the derived blueprint asset named ThirdPersonCharacter (to avoid direct content references in C++) + + AbilitySystemComponent = CreateDefaultSubobject(TEXT("AbilitySystemComponent")); + + HealthAttributeSet = CreateDefaultSubobject(TEXT("HealthAttributeSet")); + AbilitySystemComponent->AddAttributeSetSubobject(HealthAttributeSet.Get()); + + StaminaAttributeSet = CreateDefaultSubobject(TEXT("StaminaAttributeSet")); + AbilitySystemComponent->AddAttributeSetSubobject(StaminaAttributeSet.Get()); } void AKingshearthLegacyCharacter::BeginPlay() @@ -56,14 +71,172 @@ void AKingshearthLegacyCharacter::BeginPlay() Super::BeginPlay(); BaseWalkSpeed = GetCharacterMovement()->MaxWalkSpeed; - StaminaComponent = FindComponentByClass(); + + if (AbilitySystemComponent) + { + AbilitySystemComponent->InitAbilityActorInfo(this, this); + + // Always-on: keeps MaxStamina tracking Fatigue via MMC_MaxStaminaFatiguePenalty for the character's lifetime. + const FGameplayEffectSpecHandle FatiguePenaltySpec = AbilitySystemComponent->MakeOutgoingSpec(UGE_StaminaFatiguePenalty::StaticClass(), 1.0f, AbilitySystemComponent->MakeEffectContext()); + if (FatiguePenaltySpec.IsValid()) + { + AbilitySystemComponent->ApplyGameplayEffectSpecToSelf(*FatiguePenaltySpec.Data.Get()); + } + } +} + +UAbilitySystemComponent* AKingshearthLegacyCharacter::GetAbilitySystemComponent() const +{ + return AbilitySystemComponent; +} + +float AKingshearthLegacyCharacter::GetHealth() const +{ + return HealthAttributeSet ? HealthAttributeSet->GetHealth() : 0.0f; +} + +float AKingshearthLegacyCharacter::GetMaxHealth() const +{ + return HealthAttributeSet ? HealthAttributeSet->GetNominalMaxHealth() : 0.0f; +} + +float AKingshearthLegacyCharacter::GetHealthDebuff() const +{ + return HealthAttributeSet ? HealthAttributeSet->GetHealthDebuff() : 0.0f; +} + +void AKingshearthLegacyCharacter::ApplyDamage(float Amount) +{ + if (Amount <= 0.0f || !AbilitySystemComponent) + { + return; + } + + const FGameplayEffectSpecHandle SpecHandle = AbilitySystemComponent->MakeOutgoingSpec(UGE_HealthDamage::StaticClass(), 1.0f, AbilitySystemComponent->MakeEffectContext()); + if (SpecHandle.IsValid()) + { + SpecHandle.Data->SetSetByCallerMagnitude(TAG_Data_Health_Damage.GetTag(), Amount); + AbilitySystemComponent->ApplyGameplayEffectSpecToSelf(*SpecHandle.Data.Get()); + } +} + +void AKingshearthLegacyCharacter::ApplyHealing(float Amount) +{ + if (Amount <= 0.0f || !AbilitySystemComponent) + { + return; + } + + const FGameplayEffectSpecHandle SpecHandle = AbilitySystemComponent->MakeOutgoingSpec(UGE_HealthHealing::StaticClass(), 1.0f, AbilitySystemComponent->MakeEffectContext()); + if (SpecHandle.IsValid()) + { + SpecHandle.Data->SetSetByCallerMagnitude(TAG_Data_Health_Healing.GetTag(), Amount); + AbilitySystemComponent->ApplyGameplayEffectSpecToSelf(*SpecHandle.Data.Get()); + } +} + +void AKingshearthLegacyCharacter::SetHealthDebuff(float NewHealthDebuff) +{ + if (!AbilitySystemComponent) + { + return; + } + + if (HealthDebuffEffectHandle.IsValid()) + { + AbilitySystemComponent->RemoveActiveGameplayEffect(HealthDebuffEffectHandle); + HealthDebuffEffectHandle.Invalidate(); + } + + const float ClampedDebuff = FMath::Clamp(NewHealthDebuff, 0.0f, 1.0f); + if (ClampedDebuff <= 0.0f) + { + return; + } + + const FGameplayEffectSpecHandle SpecHandle = AbilitySystemComponent->MakeOutgoingSpec(UGE_HealthDebuff::StaticClass(), 1.0f, AbilitySystemComponent->MakeEffectContext()); + if (SpecHandle.IsValid()) + { + SpecHandle.Data->SetSetByCallerMagnitude(TAG_Data_HealthDebuff_Multiplier.GetTag(), 1.0f - ClampedDebuff); + HealthDebuffEffectHandle = AbilitySystemComponent->ApplyGameplayEffectSpecToSelf(*SpecHandle.Data.Get()); + } +} + +float AKingshearthLegacyCharacter::GetStamina() const +{ + return StaminaAttributeSet ? StaminaAttributeSet->GetStamina() : 0.0f; +} + +float AKingshearthLegacyCharacter::GetMaxStamina() const +{ + return StaminaAttributeSet ? StaminaAttributeSet->GetNominalMaxStamina() : 0.0f; +} + +float AKingshearthLegacyCharacter::GetFatigue() const +{ + return StaminaAttributeSet ? StaminaAttributeSet->GetFatigue() : 0.0f; +} + +void AKingshearthLegacyCharacter::SpendStamina(float Amount) +{ + if (Amount <= 0.0f || !AbilitySystemComponent || !StaminaAttributeSet) + { + return; + } + + AbilitySystemComponent->ApplyModToAttribute(UStaminaAttributeSet::GetStaminaAttribute(), EGameplayModOp::AddBase, -Amount); + TimeSinceLastStaminaSpend = 0.0f; +} + +void AKingshearthLegacyCharacter::RestoreStamina(float Amount) +{ + if (Amount <= 0.0f || !AbilitySystemComponent || !StaminaAttributeSet) + { + return; + } + + AbilitySystemComponent->ApplyModToAttribute(UStaminaAttributeSet::GetStaminaAttribute(), EGameplayModOp::AddBase, Amount); +} + +void AKingshearthLegacyCharacter::TickStaminaRegen(float DeltaSeconds) +{ + if (!AbilitySystemComponent || !StaminaAttributeSet) + { + return; + } + + TimeSinceLastStaminaSpend += DeltaSeconds; + + const float TimeSinceRegenStarted = TimeSinceLastStaminaSpend - StaminaRegenDelay; + if (TimeSinceRegenStarted > 0.0f && StaminaAttributeSet->GetStamina() < StaminaAttributeSet->GetMaxStamina()) + { + const float RampedRegenRate = StaminaRegenRampTime > 0.0f + ? FMath::Min(TimeSinceRegenStarted / StaminaRegenRampTime, 1.0f) * StaminaRegenRate + : StaminaRegenRate; + + AbilitySystemComponent->ApplyModToAttribute(UStaminaAttributeSet::GetStaminaAttribute(), EGameplayModOp::AddBase, RampedRegenRate * DeltaSeconds); + + // Fatigue only builds while Stamina is actively regaining - never while draining, never while idle. + // It never recovers on its own; only an explicit SetFatigue call (e.g. a debug key or a future rest mechanic) reduces it. + AbilitySystemComponent->ApplyModToAttribute(UStaminaAttributeSet::GetFatigueAttribute(), EGameplayModOp::AddBase, FatigueGainRateWhileRegaining * DeltaSeconds); + } +} + +void AKingshearthLegacyCharacter::SetFatigue(float NewFatigue) +{ + if (!AbilitySystemComponent || !StaminaAttributeSet) + { + return; + } + + AbilitySystemComponent->ApplyModToAttribute(UStaminaAttributeSet::GetFatigueAttribute(), EGameplayModOp::Override, FMath::Clamp(NewFatigue, 0.0f, 1.0f)); } void AKingshearthLegacyCharacter::Tick(float DeltaSeconds) { Super::Tick(DeltaSeconds); - if (!StaminaComponent) + if (!StaminaAttributeSet) { return; } @@ -71,15 +244,17 @@ void AKingshearthLegacyCharacter::Tick(float DeltaSeconds) const bool bIsMoving = GetVelocity().SizeSquared() > FMath::Square(SprintMovementThreshold); const bool bIsGrounded = GetCharacterMovement()->IsMovingOnGround(); - if (bWantsToSprint && bIsMoving && bIsGrounded && StaminaComponent->GetStamina() > 0.0f) + if (bWantsToSprint && bIsMoving && bIsGrounded && StaminaAttributeSet->GetStamina() > 0.0f) { GetCharacterMovement()->MaxWalkSpeed = BaseWalkSpeed * SprintSpeedMultiplier; - StaminaComponent->RemoveStamina(SprintStaminaDrainRate * DeltaSeconds); + SpendStamina(SprintStaminaDrainRate * DeltaSeconds); } else { GetCharacterMovement()->MaxWalkSpeed = BaseWalkSpeed; } + + TickStaminaRegen(DeltaSeconds); } void AKingshearthLegacyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) @@ -174,9 +349,9 @@ void AKingshearthLegacyCharacter::Jump() Super::Jump(); - if (bCouldJump && StaminaComponent) + if (bCouldJump) { - StaminaComponent->RemoveStamina(JumpStaminaCost); + SpendStamina(JumpStaminaCost); } } diff --git a/Source/KingshearthLegacy/KingshearthLegacyCharacter.h b/Source/KingshearthLegacy/KingshearthLegacyCharacter.h index 20cf8e6..085953c 100644 --- a/Source/KingshearthLegacy/KingshearthLegacyCharacter.h +++ b/Source/KingshearthLegacy/KingshearthLegacyCharacter.h @@ -5,12 +5,16 @@ #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "Logging/LogMacros.h" +#include "AbilitySystemInterface.h" +#include "ActiveGameplayEffectHandle.h" #include "KingshearthLegacyCharacter.generated.h" class USpringArmComponent; class UCameraComponent; class UInputAction; -class UStaminaComponent; +class UAbilitySystemComponent; +class UHealthAttributeSet; +class UStaminaAttributeSet; struct FInputActionValue; DECLARE_LOG_CATEGORY_EXTERN(LogTemplateCharacter, Log, All); @@ -20,7 +24,7 @@ DECLARE_LOG_CATEGORY_EXTERN(LogTemplateCharacter, Log, All); * Implements a controllable orbiting camera */ UCLASS(abstract) -class AKingshearthLegacyCharacter : public ACharacter +class AKingshearthLegacyCharacter : public ACharacter, public IAbilitySystemInterface { GENERATED_BODY() @@ -70,6 +74,22 @@ protected: UPROPERTY(EditAnywhere, Category="Stamina") float JumpStaminaCost = 15.0f; + /** Regen rate once fully ramped up, in stamina/sec. */ + UPROPERTY(EditAnywhere, Category="Stamina") + float StaminaRegenRate = 20.0f; + + /** Seconds after the last stamina spend before regen starts at all. */ + UPROPERTY(EditAnywhere, Category="Stamina") + float StaminaRegenDelay = 1.0f; + + /** Seconds for the regen rate to ramp from 0 up to StaminaRegenRate once regen starts, instead of kicking in at full speed immediately. */ + UPROPERTY(EditAnywhere, Category="Stamina") + float StaminaRegenRampTime = 1.5f; + + /** Fatigue gained per second while Stamina is actively regaining (ramping back up). Never recovers on its own otherwise - only an explicit debug/design call reduces it. */ + UPROPERTY(EditAnywhere, Category="Fatigue") + float FatigueGainRateWhileRegaining = 0.1f; + public: /** Constructor */ @@ -100,16 +120,89 @@ protected: /** Called when the sprint input is released */ void StopSprint(); + /** Advances the regen delay/ramp curve and applies Stamina/Fatigue regen for this frame. */ + void TickStaminaRegen(float DeltaSeconds); + /** Cached from the CharacterMovementComponent's MaxWalkSpeed in BeginPlay, restored whenever not sprinting. */ float BaseWalkSpeed = 0.0f; bool bWantsToSprint = false; - UPROPERTY() - TObjectPtr StaminaComponent; + /** Seconds since Stamina was last reduced by a spend. Resets the regen delay/ramp whenever SpendStamina runs. */ + float TimeSinceLastStaminaSpend = 0.0f; + + /** Drives all attribute sets (Health, Stamina, and future Nutrition/Blood). Self-owned: this character is both owner and avatar. */ + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Abilities", meta = (AllowPrivateAccess = "true")) + TObjectPtr AbilitySystemComponent; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Abilities", meta = (AllowPrivateAccess = "true")) + TObjectPtr HealthAttributeSet; + + UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Abilities", meta = (AllowPrivateAccess = "true")) + TObjectPtr StaminaAttributeSet; + + /** Currently-applied GE_HealthDebuff instance, if any - reapplied/removed wholesale by SetHealthDebuff so it behaves like the old "set to X" API instead of stacking. */ + FActiveGameplayEffectHandle HealthDebuffEffectHandle; public: + //~ Begin IAbilitySystemInterface + virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override; + //~ End IAbilitySystemInterface + + /** Exposed for Blueprint to bind OnHealthChanged/OnHealthDebuffChanged/OnDeath - there's no "component bound event" for a plain UObject subobject, so bind via this getter's return pin instead (drag off it, search "Bind Event to..."). */ + UFUNCTION(BlueprintPure, Category = "Health") + FORCEINLINE UHealthAttributeSet* GetHealthAttributeSet() const { return HealthAttributeSet; } + + /** Exposed for Blueprint to bind OnStaminaChanged/OnFatigueChanged/OnExhausted - see GetHealthAttributeSet(). */ + UFUNCTION(BlueprintPure, Category = "Stamina") + FORCEINLINE UStaminaAttributeSet* GetStaminaAttributeSet() const { return StaminaAttributeSet; } + + // Health + UFUNCTION(BlueprintPure, Category = "Health") + float GetHealth() const; + + /** Nominal cap, unaffected by HealthDebuff. Feeds the health bar's total width. */ + UFUNCTION(BlueprintPure, Category = "Health") + float GetMaxHealth() const; + + /** 0-1 fraction of MaxHealth currently locked/unusable (curses, status effects, ...). */ + UFUNCTION(BlueprintPure, Category = "Health") + float GetHealthDebuff() const; + + UFUNCTION(BlueprintCallable, Category = "Health") + void ApplyDamage(float Amount); + + UFUNCTION(BlueprintCallable, Category = "Health") + void ApplyHealing(float Amount); + + /** Sets how much of MaxHealth is currently locked away (0-1) by applying/refreshing/removing a single GE_HealthDebuff instance. */ + UFUNCTION(BlueprintCallable, Category = "Health") + void SetHealthDebuff(float NewHealthDebuff); + + // Stamina + UFUNCTION(BlueprintPure, Category = "Stamina") + float GetStamina() const; + + /** Nominal cap, unaffected by Fatigue. Feeds the stamina bar's total width. */ + UFUNCTION(BlueprintPure, Category = "Stamina") + float GetMaxStamina() const; + + UFUNCTION(BlueprintPure, Category = "Fatigue") + float GetFatigue() const; + + /** Deducts Amount from Stamina and resets the regen delay/ramp. No-op for Amount <= 0. */ + UFUNCTION(BlueprintCallable, Category = "Stamina") + void SpendStamina(float Amount); + + /** Adds Amount to Stamina without affecting the regen delay/ramp (e.g. a stamina potion). No-op for Amount <= 0. */ + UFUNCTION(BlueprintCallable, Category = "Stamina") + void RestoreStamina(float Amount); + + /** Sets Fatigue directly (0-1). Fatigue only ever builds on its own; this is the only way to reduce it (e.g. a debug key or a future rest mechanic). */ + UFUNCTION(BlueprintCallable, Category = "Fatigue") + void SetFatigue(float NewFatigue); + /** Handles move inputs from either controls or UI interfaces */ UFUNCTION(BlueprintCallable, Category="Input") virtual void DoMove(float Right, float Forward); diff --git a/Source/KingshearthLegacy/KingshearthLegacyGameplayTags.cpp b/Source/KingshearthLegacy/KingshearthLegacyGameplayTags.cpp new file mode 100644 index 0000000..277fdf1 --- /dev/null +++ b/Source/KingshearthLegacy/KingshearthLegacyGameplayTags.cpp @@ -0,0 +1,5 @@ +#include "KingshearthLegacyGameplayTags.h" + +UE_DEFINE_GAMEPLAY_TAG(TAG_Data_Health_Damage, "Data.Health.Damage"); +UE_DEFINE_GAMEPLAY_TAG(TAG_Data_Health_Healing, "Data.Health.Healing"); +UE_DEFINE_GAMEPLAY_TAG(TAG_Data_HealthDebuff_Multiplier, "Data.HealthDebuff.Multiplier"); diff --git a/Source/KingshearthLegacy/KingshearthLegacyGameplayTags.h b/Source/KingshearthLegacy/KingshearthLegacyGameplayTags.h new file mode 100644 index 0000000..9f20609 --- /dev/null +++ b/Source/KingshearthLegacy/KingshearthLegacyGameplayTags.h @@ -0,0 +1,8 @@ +#pragma once + +#include "NativeGameplayTags.h" + +// SetByCaller data tags - the Name a GameplayEffect spec's magnitude is set against at runtime. +KINGSHEARTHLEGACY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Data_Health_Damage) +KINGSHEARTHLEGACY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Data_Health_Healing) +KINGSHEARTHLEGACY_API UE_DECLARE_GAMEPLAY_TAG_EXTERN(TAG_Data_HealthDebuff_Multiplier) diff --git a/Source/KingshearthLegacy/KingshearthLegacyPlayerController.cpp b/Source/KingshearthLegacy/KingshearthLegacyPlayerController.cpp index 0d87dbd..7ff2101 100644 --- a/Source/KingshearthLegacy/KingshearthLegacyPlayerController.cpp +++ b/Source/KingshearthLegacy/KingshearthLegacyPlayerController.cpp @@ -9,8 +9,7 @@ #include "KingshearthLegacy.h" #include "Widgets/Input/SVirtualJoystick.h" #include "UI/PlayerHUDWidget.h" -#include "HealthComponent.h" -#include "StaminaComponent.h" +#include "KingshearthLegacyCharacter.h" void AKingshearthLegacyPlayerController::BeginPlay() { @@ -88,7 +87,11 @@ void AKingshearthLegacyPlayerController::OnPossess(APawn* InPawn) if (PlayerHUD) { - PlayerHUD->InitializeHUD(InPawn->FindComponentByClass(), InPawn->FindComponentByClass()); + const AKingshearthLegacyCharacter* PossessedCharacter = Cast(InPawn); + UHealthAttributeSet* PossessedHealthAttributeSet = PossessedCharacter ? PossessedCharacter->GetHealthAttributeSet() : nullptr; + UStaminaAttributeSet* PossessedStaminaAttributeSet = PossessedCharacter ? PossessedCharacter->GetStaminaAttributeSet() : nullptr; + + PlayerHUD->InitializeHUD(PossessedHealthAttributeSet, PossessedStaminaAttributeSet); } } diff --git a/Source/KingshearthLegacy/KingshearthLegacyPlayerController.h b/Source/KingshearthLegacy/KingshearthLegacyPlayerController.h index 66311b5..cedc5b6 100644 --- a/Source/KingshearthLegacy/KingshearthLegacyPlayerController.h +++ b/Source/KingshearthLegacy/KingshearthLegacyPlayerController.h @@ -55,7 +55,7 @@ protected: /** Input mapping context setup */ virtual void SetupInputComponent() override; - /** Spawns/initializes the player HUD once a pawn (and its HealthComponent) is available */ + /** Spawns/initializes the player HUD once a pawn (and its HealthAttributeSet) is available */ virtual void OnPossess(APawn* InPawn) override; /** Returns true if the player should use UMG touch controls */ diff --git a/Source/KingshearthLegacy/StaminaComponent.cpp b/Source/KingshearthLegacy/StaminaComponent.cpp deleted file mode 100644 index b3aaca4..0000000 --- a/Source/KingshearthLegacy/StaminaComponent.cpp +++ /dev/null @@ -1,115 +0,0 @@ -#include "StaminaComponent.h" - -UStaminaComponent::UStaminaComponent() -{ - PrimaryComponentTick.bCanEverTick = true; -} - -void UStaminaComponent::BeginPlay() -{ - Super::BeginPlay(); - - CurrentStamina = MaxStamina; -} - -void UStaminaComponent::TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) -{ - Super::TickComponent(DeltaTime, TickType, ThisTickFunction); - - TimeSinceLastStaminaSpend += DeltaTime; - - const float TimeSinceRegenStarted = TimeSinceLastStaminaSpend - StaminaRegenDelay; - if (TimeSinceRegenStarted > 0.0f && CurrentStamina < GetEffectiveMaxStamina()) - { - const float RampedRegenRate = StaminaRegenRampTime > 0.0f - ? FMath::Min(TimeSinceRegenStarted / StaminaRegenRampTime, 1.0f) * StaminaRegenRate - : StaminaRegenRate; - - SetStamina(CurrentStamina + RampedRegenRate * DeltaTime); - - // Fatigue only builds while Stamina is actively regaining - never while draining, never - // while idle. It never recovers on its own; only an explicit SetFatigue call does. - SetFatigue(Fatigue + FatigueGainRateWhileRegaining * DeltaTime); - } -} - -float UStaminaComponent::GetStamina() const -{ - return CurrentStamina; -} - -float UStaminaComponent::GetMaxStamina() const -{ - return MaxStamina; -} - -float UStaminaComponent::GetFatigue() const -{ - return Fatigue; -} - -float UStaminaComponent::GetEffectiveMaxStamina() const -{ - return MaxStamina * (1.0f - Fatigue); -} - -void UStaminaComponent::SetMaxStamina(float NewMaxStamina) -{ - MaxStamina = FMath::Max(NewMaxStamina, 0.0f); - - CurrentStamina = FMath::Clamp(CurrentStamina, 0.0f, GetEffectiveMaxStamina()); -} - -void UStaminaComponent::SetStamina(float NewStamina) -{ - const float PreviousStamina = CurrentStamina; - - CurrentStamina = FMath::Clamp(NewStamina, 0.0f, GetEffectiveMaxStamina()); - - if (CurrentStamina < PreviousStamina) - { - TimeSinceLastStaminaSpend = 0.0f; - } - - OnStaminaChanged.Broadcast(CurrentStamina); - - // Only trigger the exhaustion signal when crossing from not-empty to empty. - if (PreviousStamina > 0.0f && CurrentStamina <= 0.0f) - { - OnExhausted.Broadcast(); - } -} - -void UStaminaComponent::AddStamina(float Amount) -{ - if (Amount <= 0.0f) - { - return; - } - - SetStamina(CurrentStamina + Amount); -} - -void UStaminaComponent::RemoveStamina(float Amount) -{ - if (Amount <= 0.0f) - { - return; - } - - SetStamina(CurrentStamina - Amount); -} - -void UStaminaComponent::SetFatigue(float NewFatigue) -{ - Fatigue = FMath::Clamp(NewFatigue, 0.0f, 1.0f); - - const float ClampedStamina = FMath::Clamp(CurrentStamina, 0.0f, GetEffectiveMaxStamina()); - if (!FMath::IsNearlyEqual(ClampedStamina, CurrentStamina)) - { - CurrentStamina = ClampedStamina; - OnStaminaChanged.Broadcast(CurrentStamina); - } - - OnFatigueChanged.Broadcast(Fatigue); -} diff --git a/Source/KingshearthLegacy/StaminaComponent.h b/Source/KingshearthLegacy/StaminaComponent.h deleted file mode 100644 index 9ad6d34..0000000 --- a/Source/KingshearthLegacy/StaminaComponent.h +++ /dev/null @@ -1,93 +0,0 @@ -#pragma once - -#include "CoreMinimal.h" -#include "Components/ActorComponent.h" -#include "StaminaComponent.generated.h" - -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnStaminaChanged, float, NewStamina); -DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnFatigueChanged, float, NewFatigue); -DECLARE_DYNAMIC_MULTICAST_DELEGATE(FOnExhausted); - -UCLASS(ClassGroup = (Custom), meta = (BlueprintSpawnableComponent)) -class KINGSHEARTHLEGACY_API UStaminaComponent : public UActorComponent -{ - GENERATED_BODY() - -public: - UStaminaComponent(); - -protected: - virtual void BeginPlay() override; - virtual void TickComponent(float DeltaTime, ELevelTick TickType, FActorComponentTickFunction* ThisTickFunction) override; - -public: - // Stamina - UFUNCTION(BlueprintPure, Category = "Stamina") - float GetStamina() const; - - /** Nominal cap, unaffected by Fatigue. Feeds the stamina bar's total width. */ - UFUNCTION(BlueprintPure, Category = "Stamina") - float GetMaxStamina() const; - - /** 0-1 fraction of MaxStamina currently locked/unusable due to over-extension. */ - UFUNCTION(BlueprintPure, Category = "Stamina") - float GetFatigue() const; - - UFUNCTION(BlueprintCallable, Category = "Stamina") - void SetMaxStamina(float NewMaxStamina); - - UFUNCTION(BlueprintCallable, Category = "Stamina") - void SetStamina(float NewStamina); - - UFUNCTION(BlueprintCallable, Category = "Stamina") - void AddStamina(float Amount); - - UFUNCTION(BlueprintCallable, Category = "Stamina") - void RemoveStamina(float Amount); - - UFUNCTION(BlueprintCallable, Category = "Fatigue") - void SetFatigue(float NewFatigue); - -protected: - /** MaxStamina minus whatever Fatigue currently locks away - what Stamina is actually clamped against. */ - float GetEffectiveMaxStamina() const; - - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stamina") - float MaxStamina = 100.0f; - - UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Stamina") - float CurrentStamina = 100.0f; - - UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Fatigue") - float Fatigue = 0.0f; - - /** Regen rate once fully ramped up, in stamina/sec. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stamina") - float StaminaRegenRate = 20.0f; - - /** Seconds after the last stamina spend before regen starts at all. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stamina") - float StaminaRegenDelay = 1.0f; - - /** Seconds for the regen rate to ramp from 0 up to StaminaRegenRate once regen starts, instead of kicking in at full speed immediately. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Stamina") - float StaminaRegenRampTime = 1.5f; - - /** Seconds since Stamina was last reduced by a spend (RemoveStamina/SetStamina decrease). Resets the regen delay/ramp whenever stamina is spent. */ - float TimeSinceLastStaminaSpend = 0.0f; - - /** Fatigue gained per second while Stamina is actively regaining (ramping back up). Never recovers on its own otherwise - only an explicit SetFatigue call (e.g. a debug key) reduces it. */ - UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Fatigue") - float FatigueGainRateWhileRegaining = 0.1f; - -public: - UPROPERTY(BlueprintAssignable, Category = "Stamina") - FOnStaminaChanged OnStaminaChanged; - - UPROPERTY(BlueprintAssignable, Category = "Fatigue") - FOnFatigueChanged OnFatigueChanged; - - /** Broadcast when Stamina is driven from a positive value to empty. */ - UPROPERTY(BlueprintAssignable, Category = "Stamina") - FOnExhausted OnExhausted; -}; diff --git a/Source/KingshearthLegacy/UI/HealthBarWidget.cpp b/Source/KingshearthLegacy/UI/HealthBarWidget.cpp index 57340c7..48683f3 100644 --- a/Source/KingshearthLegacy/UI/HealthBarWidget.cpp +++ b/Source/KingshearthLegacy/UI/HealthBarWidget.cpp @@ -1,28 +1,28 @@ #include "HealthBarWidget.h" -#include "HealthComponent.h" +#include "HealthAttributeSet.h" -void UHealthBarWidget::InitializeHealthBar(UHealthComponent* InHealthComponent) +void UHealthBarWidget::InitializeHealthBar(UHealthAttributeSet* InHealthAttributeSet) { - if (!InHealthComponent) + if (!InHealthAttributeSet) { return; } - if (HealthComponent) + if (HealthAttributeSet) { - HealthComponent->OnHealthChanged.RemoveDynamic(this, &UHealthBarWidget::HandleHealthChanged); - HealthComponent->OnHealthDebuffChanged.RemoveDynamic(this, &UHealthBarWidget::HandleHealthDebuffChanged); - HealthComponent->OnDeath.RemoveDynamic(this, &UHealthBarWidget::HandleDeath); + HealthAttributeSet->OnHealthChanged.RemoveDynamic(this, &UHealthBarWidget::HandleHealthChanged); + HealthAttributeSet->OnHealthDebuffChanged.RemoveDynamic(this, &UHealthBarWidget::HandleHealthDebuffChanged); + HealthAttributeSet->OnDeath.RemoveDynamic(this, &UHealthBarWidget::HandleDeath); } - HealthComponent = InHealthComponent; + HealthAttributeSet = InHealthAttributeSet; - HealthComponent->OnHealthChanged.AddDynamic(this, &UHealthBarWidget::HandleHealthChanged); - HealthComponent->OnHealthDebuffChanged.AddDynamic(this, &UHealthBarWidget::HandleHealthDebuffChanged); - HealthComponent->OnDeath.AddDynamic(this, &UHealthBarWidget::HandleDeath); + HealthAttributeSet->OnHealthChanged.AddDynamic(this, &UHealthBarWidget::HandleHealthChanged); + HealthAttributeSet->OnHealthDebuffChanged.AddDynamic(this, &UHealthBarWidget::HandleHealthDebuffChanged); + HealthAttributeSet->OnDeath.AddDynamic(this, &UHealthBarWidget::HandleDeath); - SetStatValue(HealthComponent->GetHealth(), HealthComponent->GetMaxHealth()); - SetMaxHealthDebuff(HealthComponent->GetHealthDebuff()); + SetStatValue(HealthAttributeSet->GetHealth(), HealthAttributeSet->GetNominalMaxHealth()); + SetMaxHealthDebuff(HealthAttributeSet->GetHealthDebuff()); } void UHealthBarWidget::SetMaxHealthDebuff(float InDebuffPercent) @@ -32,9 +32,9 @@ void UHealthBarWidget::SetMaxHealthDebuff(float InDebuffPercent) void UHealthBarWidget::HandleHealthChanged(float NewHealth) { - if (HealthComponent) + if (HealthAttributeSet) { - SetStatValue(NewHealth, HealthComponent->GetMaxHealth()); + SetStatValue(NewHealth, HealthAttributeSet->GetNominalMaxHealth()); } } diff --git a/Source/KingshearthLegacy/UI/HealthBarWidget.h b/Source/KingshearthLegacy/UI/HealthBarWidget.h index b2152ad..b516c58 100644 --- a/Source/KingshearthLegacy/UI/HealthBarWidget.h +++ b/Source/KingshearthLegacy/UI/HealthBarWidget.h @@ -4,11 +4,11 @@ #include "UI/StatBarWidget.h" #include "HealthBarWidget.generated.h" -class UHealthComponent; +class UHealthAttributeSet; /** - * Stat bar bound to a live UHealthComponent. Call InitializeHealthBar once the - * component is known (typically from the owning PlayerController on possession). + * Stat bar bound to a live UHealthAttributeSet. Call InitializeHealthBar once the + * attribute set is known (typically from the owning PlayerController on possession). */ UCLASS(abstract) class UHealthBarWidget : public UStatBarWidget @@ -17,7 +17,7 @@ class UHealthBarWidget : public UStatBarWidget public: UFUNCTION(BlueprintCallable, Category = "Health") - void InitializeHealthBar(UHealthComponent* InHealthComponent); + void InitializeHealthBar(UHealthAttributeSet* InHealthAttributeSet); /** Hook for a future debuff/status-effect system: 0-1 fraction of max health currently locked/unusable. */ UFUNCTION(BlueprintCallable, Category = "Health") @@ -38,5 +38,5 @@ protected: void OnHealthDepleted(); UPROPERTY(BlueprintReadOnly, Category = "Health") - TObjectPtr HealthComponent; + TObjectPtr HealthAttributeSet; }; diff --git a/Source/KingshearthLegacy/UI/PlayerHUDWidget.cpp b/Source/KingshearthLegacy/UI/PlayerHUDWidget.cpp index 619baa4..5e62f88 100644 --- a/Source/KingshearthLegacy/UI/PlayerHUDWidget.cpp +++ b/Source/KingshearthLegacy/UI/PlayerHUDWidget.cpp @@ -2,15 +2,15 @@ #include "UI/HealthBarWidget.h" #include "UI/StaminaBarWidget.h" -void UPlayerHUDWidget::InitializeHUD(UHealthComponent* InHealthComponent, UStaminaComponent* InStaminaComponent) +void UPlayerHUDWidget::InitializeHUD(UHealthAttributeSet* InHealthAttributeSet, UStaminaAttributeSet* InStaminaAttributeSet) { if (HealthBar) { - HealthBar->InitializeHealthBar(InHealthComponent); + HealthBar->InitializeHealthBar(InHealthAttributeSet); } if (StaminaBar) { - StaminaBar->InitializeStaminaBar(InStaminaComponent); + StaminaBar->InitializeStaminaBar(InStaminaAttributeSet); } } diff --git a/Source/KingshearthLegacy/UI/PlayerHUDWidget.h b/Source/KingshearthLegacy/UI/PlayerHUDWidget.h index 4fc6c20..636915e 100644 --- a/Source/KingshearthLegacy/UI/PlayerHUDWidget.h +++ b/Source/KingshearthLegacy/UI/PlayerHUDWidget.h @@ -6,8 +6,8 @@ class UHealthBarWidget; class UStaminaBarWidget; -class UHealthComponent; -class UStaminaComponent; +class UHealthAttributeSet; +class UStaminaAttributeSet; /** * Top-level player HUD. Owns a health bar and a stamina bar and forwards @@ -21,7 +21,7 @@ class UPlayerHUDWidget : public UUserWidget public: UFUNCTION(BlueprintCallable, Category = "HUD") - void InitializeHUD(UHealthComponent* InHealthComponent, UStaminaComponent* InStaminaComponent); + void InitializeHUD(UHealthAttributeSet* InHealthAttributeSet, UStaminaAttributeSet* InStaminaAttributeSet); protected: UPROPERTY(BlueprintReadOnly, meta = (BindWidgetOptional = true)) diff --git a/Source/KingshearthLegacy/UI/StaminaBarWidget.cpp b/Source/KingshearthLegacy/UI/StaminaBarWidget.cpp index c7cfa02..755a260 100644 --- a/Source/KingshearthLegacy/UI/StaminaBarWidget.cpp +++ b/Source/KingshearthLegacy/UI/StaminaBarWidget.cpp @@ -1,33 +1,33 @@ #include "StaminaBarWidget.h" -#include "StaminaComponent.h" +#include "StaminaAttributeSet.h" -void UStaminaBarWidget::InitializeStaminaBar(UStaminaComponent* InStaminaComponent) +void UStaminaBarWidget::InitializeStaminaBar(UStaminaAttributeSet* InStaminaAttributeSet) { - if (!InStaminaComponent) + if (!InStaminaAttributeSet) { return; } - if (StaminaComponent) + if (StaminaAttributeSet) { - StaminaComponent->OnStaminaChanged.RemoveDynamic(this, &UStaminaBarWidget::HandleStaminaChanged); - StaminaComponent->OnFatigueChanged.RemoveDynamic(this, &UStaminaBarWidget::HandleFatigueChanged); + StaminaAttributeSet->OnStaminaChanged.RemoveDynamic(this, &UStaminaBarWidget::HandleStaminaChanged); + StaminaAttributeSet->OnFatigueChanged.RemoveDynamic(this, &UStaminaBarWidget::HandleFatigueChanged); } - StaminaComponent = InStaminaComponent; + StaminaAttributeSet = InStaminaAttributeSet; - StaminaComponent->OnStaminaChanged.AddDynamic(this, &UStaminaBarWidget::HandleStaminaChanged); - StaminaComponent->OnFatigueChanged.AddDynamic(this, &UStaminaBarWidget::HandleFatigueChanged); + StaminaAttributeSet->OnStaminaChanged.AddDynamic(this, &UStaminaBarWidget::HandleStaminaChanged); + StaminaAttributeSet->OnFatigueChanged.AddDynamic(this, &UStaminaBarWidget::HandleFatigueChanged); - SetStatValue(StaminaComponent->GetStamina(), StaminaComponent->GetMaxStamina()); - SetFatigue(StaminaComponent->GetFatigue()); + SetStatValue(StaminaAttributeSet->GetStamina(), StaminaAttributeSet->GetNominalMaxStamina()); + SetFatigue(StaminaAttributeSet->GetFatigue()); } void UStaminaBarWidget::HandleStaminaChanged(float NewStamina) { - if (StaminaComponent) + if (StaminaAttributeSet) { - SetStatValue(NewStamina, StaminaComponent->GetMaxStamina()); + SetStatValue(NewStamina, StaminaAttributeSet->GetNominalMaxStamina()); } } diff --git a/Source/KingshearthLegacy/UI/StaminaBarWidget.h b/Source/KingshearthLegacy/UI/StaminaBarWidget.h index cf363ff..adf0d02 100644 --- a/Source/KingshearthLegacy/UI/StaminaBarWidget.h +++ b/Source/KingshearthLegacy/UI/StaminaBarWidget.h @@ -4,11 +4,11 @@ #include "UI/StatBarWidget.h" #include "StaminaBarWidget.generated.h" -class UStaminaComponent; +class UStaminaAttributeSet; /** - * Stat bar bound to a live UStaminaComponent. Call InitializeStaminaBar once the - * component is known (typically from the owning PlayerController on possession), + * Stat bar bound to a live UStaminaAttributeSet. Call InitializeStaminaBar once the + * attribute set is known (typically from the owning PlayerController on possession), * mirroring UHealthBarWidget::InitializeHealthBar. */ UCLASS(abstract) @@ -18,7 +18,7 @@ class UStaminaBarWidget : public UStatBarWidget public: UFUNCTION(BlueprintCallable, Category = "Stamina") - void InitializeStaminaBar(UStaminaComponent* InStaminaComponent); + void InitializeStaminaBar(UStaminaAttributeSet* InStaminaAttributeSet); UFUNCTION(BlueprintCallable, Category = "Fatigue") void SetFatigue(float NewFatigue); @@ -38,7 +38,7 @@ protected: void OnFatigueChanged(float NewFatigue); UPROPERTY(BlueprintReadOnly, Category = "Stamina") - TObjectPtr StaminaComponent; + TObjectPtr StaminaAttributeSet; /** 0-1 exhaustion amount. Drives the bar's penalty segment via SetPenaltyPercent. */ UPROPERTY(BlueprintReadOnly, Category = "Fatigue")