using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using HarmonyLib; using LethalConfig; using LethalConfig.ConfigItems; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: IgnoresAccessChecksTo("AmazingAssets.TerrainToMesh")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: IgnoresAccessChecksTo("ClientNetworkTransform")] [assembly: IgnoresAccessChecksTo("com.olegknyazev.softmask")] [assembly: IgnoresAccessChecksTo("DissonanceVoip")] [assembly: IgnoresAccessChecksTo("DunGen")] [assembly: IgnoresAccessChecksTo("DunGen.Integration.ASPP")] [assembly: IgnoresAccessChecksTo("DunGen.Integration.UnityNav")] [assembly: IgnoresAccessChecksTo("EasyTextEffects")] [assembly: IgnoresAccessChecksTo("Facepunch Transport for Netcode for GameObjects")] [assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")] [assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging")] [assembly: IgnoresAccessChecksTo("Unity.Animation.Rigging.DocCodeExamples")] [assembly: IgnoresAccessChecksTo("Unity.Burst")] [assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")] [assembly: IgnoresAccessChecksTo("Unity.Collections")] [assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem")] [assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")] [assembly: IgnoresAccessChecksTo("Unity.Jobs")] [assembly: IgnoresAccessChecksTo("Unity.Mathematics")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.Common")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.MetricTypes")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStats")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Component")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsMonitor.Implementation")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetStatsReporting")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkProfiler.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Multiplayer.Tools.NetworkSolutionInterface")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Components")] [assembly: IgnoresAccessChecksTo("Unity.Netcode.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.Networking.Transport")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Csg")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.KdTree")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Poly2Tri")] [assembly: IgnoresAccessChecksTo("Unity.ProBuilder.Stl")] [assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Config.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.HighDefinition.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")] [assembly: IgnoresAccessChecksTo("Unity.Services.Authentication")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Analytics")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Components")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Configuration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Device")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Environments.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Internal")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Networking")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Registration")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Scheduler")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Telemetry")] [assembly: IgnoresAccessChecksTo("Unity.Services.Core.Threading")] [assembly: IgnoresAccessChecksTo("Unity.Services.QoS")] [assembly: IgnoresAccessChecksTo("Unity.Services.Relay")] [assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")] [assembly: IgnoresAccessChecksTo("Unity.Timeline")] [assembly: IgnoresAccessChecksTo("Unity.VisualEffectGraph.Runtime")] [assembly: IgnoresAccessChecksTo("Unity.XR.CoreUtils")] [assembly: IgnoresAccessChecksTo("Unity.XR.Management")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.ConformanceAutomation")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MetaQuestSupport")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.MockRuntime")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.OculusQuestSupport")] [assembly: IgnoresAccessChecksTo("Unity.XR.OpenXR.Features.RuntimeDebugger")] [assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")] [assembly: IgnoresAccessChecksTo("UnityEngine.SpatialTracking")] [assembly: IgnoresAccessChecksTo("UnityEngine.UI")] [assembly: IgnoresAccessChecksTo("UnityEngine.XR.LegacyInputHelpers")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("CameraOverhaul")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("More satisfying movement through dynamic camera rotations.")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d61077992626cbceea323d3eae3fcff35298451a")] [assembly: AssemblyProduct("CameraOverhaul")] [assembly: AssemblyTitle("CameraOverhaul")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace CameraOverhaul { internal struct CameraContext { public bool isSprinting; public bool isCrouching; public bool inVehicle; public bool isClimbing; public bool isExhausted; public bool isInspectingItem; public bool criticallyInjured; public bool isUsingJetpack; public bool isBeingShocked; public float sprintMeter; public float drunkness; public float insanity; public float poison; public float sinkingValue; public float shipTakeoffPhase; public float shipLandingPhase; public bool inWater; public bool submerged; public Vector3 velocity; public Vector3 forwardRelVelocity; public double pitch; public double yaw; public bool resetSmoothing; } internal sealed class CameraSystem { private const NoiseKind SwayNoise = NoiseKind.Fractal; private const NoiseKind ExhaustionNoise = NoiseKind.Fractal; private const NoiseKind InsanityNoise = NoiseKind.Fractal; private const NoiseKind DrunknessNoise = NoiseKind.OpenSimplex2; private const NoiseKind TinnitusNoise = NoiseKind.Simplex; private const NoiseKind CriticalNoise = NoiseKind.Fractal; private const NoiseKind PoisonNoise = NoiseKind.Simplex; private const NoiseKind JetpackNoise = NoiseKind.Fractal; private const NoiseKind ShockNoise = NoiseKind.FrequencyMod; private const NoiseKind ShipNoise = NoiseKind.Fractal; private const NoiseKind WaterWadeNoise = NoiseKind.Fractal; private const NoiseKind WaterDriftNoise = NoiseKind.OpenSimplex2; private Vector3 _offsetEuler; private Vector3 _impairOffset; private Vector3 _smoothing; private float _master = 1f; private float _masterBase = 1f; private ConfigData.Contextual? _ctxCfg; private double _prevPitch; private double _prevYaw; private double _lastActionTime; private double _prevVerticalPitch; private double _prevForwardPitch; private double _turningRollTarget; private double _prevStrafingRoll; private double _swayFactor; private double _swayFactorTarget; private double _swayTime; private double _exhaustionTime; private double _insanityTime; private double _drunkTime; private double _criticalTime; private double _poisonTime; private double _jetpackTime; private double _shockTime; private double _shipTime; private double _waterTime; private double _exhaustionSeverity; private double _criticalSeverity; private double _jetpackSeverity; private double _shockSeverity; private double _drunkSeverity; private double _drunkRoll; private double _drunkPitch; private double _drunkYaw; private double _waterWadeSeverity; private double _waterSubmergeSeverity; private Vector3 _punch; private Vector3 _punchVel; private bool _msInit; private double _prevYawNorm; private double _prevPitchNorm; private double _contYaw; private double _contPitch; private double _smYaw; private double _smPitch; private const double PunchImpulseScale = 15.0; private const double RecoilImpulseScale = 35.0; private const double ACTION_VELOCITY_EPS_SQ = 0.0004; private const double ACTION_LOOK_EPS = 0.05; private const float PunchStiffness = 220f; private const float PunchDamping = 22f; private const float MaxPunch = 60f; private const double BASE_VERTICAL_PITCH_SMOOTHING = 4E-05; private const double VERTICAL_PITCH_THRESHOLD = 0.4; private const double BASE_FORWARD_PITCH_SMOOTHING = 0.008; private const double BASE_TURNING_ROLL_ACCUMULATION = 0.0048; private const double BASE_TURNING_ROLL_INTENSITY = 1.25; private const double BASE_TURNING_ROLL_SMOOTHING = 0.0825; private const double BASE_STRAFING_ROLL_SMOOTHING = 0.008; private const double BASE_SWAY_SPEED = 0.5; private const double INSANITY_THRESHOLD = 0.7; private const double DRUNK_SEVERITY_SMOOTHING = 0.06; private const double DRUNK_OFFSET_SMOOTHING = 0.025; private const double DRUNK_BASE_ROLL_DEG = 6.5; private const double DRUNK_BASE_PITCH_DEG = 3.0; private const double DRUNK_BASE_YAW_DEG = 2.2; private const double DRUNK_INTENSITY_NORMALIZER = 6.0; private const double DRUNK_NOISE_SPEED_MIN = 0.18; private const double DRUNK_NOISE_SPEED_MAX = 0.42; private const double WATER_WADE_SMOOTHING = 0.06; private const double WATER_SUBMERGE_SMOOTHING = 0.05; private const double WATER_WADE_SPEED = 0.9; private const double WATER_DRIFT_SPEED = 0.4; private const double SHIP_SHAKE_DEG = 0.85; private const double SHIP_RUMBLE_SPEED = 9.0; private const double SHIP_FORWARD_LURCH = 1.2; private const double SHIP_RISE_PITCH = 0.8; private const double BASE_MOUSE_SMOOTHING = 16.0; private const double MOUSE_SMOOTHING_THRESHOLD = 0.001; private static double Now => Time.timeAsDouble; public Vector3 OffsetEuler => _offsetEuler * _master + _impairOffset * _masterBase + _smoothing + ScreenShakes.EulerOffset; public void Reset() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) _offsetEuler = Vector3.zero; _impairOffset = Vector3.zero; _smoothing = Vector3.zero; _ctxCfg = null; _prevPitch = 0.0; _prevYaw = 0.0; _lastActionTime = 0.0; _prevVerticalPitch = 0.0; _prevForwardPitch = 0.0; _turningRollTarget = 0.0; _prevStrafingRoll = 0.0; _swayFactor = 0.0; _swayFactorTarget = 0.0; _swayTime = 0.0; _exhaustionTime = 0.0; _insanityTime = 0.0; _drunkTime = 0.0; _criticalTime = 0.0; _poisonTime = 0.0; _jetpackTime = 0.0; _shockTime = 0.0; _shipTime = 0.0; _waterTime = 0.0; _exhaustionSeverity = 0.0; _criticalSeverity = 0.0; _jetpackSeverity = 0.0; _shockSeverity = 0.0; _drunkSeverity = 0.0; _drunkRoll = 0.0; _drunkPitch = 0.0; _drunkYaw = 0.0; _waterWadeSeverity = 0.0; _waterSubmergeSeverity = 0.0; _punch = Vector3.zero; _punchVel = Vector3.zero; _msInit = false; ScreenShakes.Reset(); } public void AddLandingImpulse(double severity) { _punchVel.x += (float)(ConfigManager.Data.general.landingDipStrength * severity * 15.0); } public void AddWaterSplash(double dipDegrees) { _punchVel.x += (float)(dipDegrees * 15.0); } public void AddRecoil(double kickDeg) { float num = 0f - (float)(kickDeg * 35.0); if (num < _punchVel.x) { _punchVel.x = num; } } public void AddDamageKick(Vector3 degrees) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) _punchVel += degrees * 15f; } public void OnCameraUpdate(in CameraContext context, double dt, PlayerControllerB player) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) ConfigData data = ConfigManager.Data; ConfigData.General general = data.general; float num = 1f; if (general.enableHealthCondition && (double)player.health < general.healthConditionTriggerLimit) { num = Mathf.Clamp01((float)player.health / (float)general.healthConditionTriggerLimit); } _masterBase = (float)general.masterStrength; _master = _masterBase * num; UpdateContext(in context, dt, data); _offsetEuler = Vector3.zero; _impairOffset = Vector3.zero; _smoothing = Vector3.zero; ScreenShakes.OnCameraUpdate(dt); UpdateActionTime(in context); CameraSmoothingOffset(in context, dt); if (general.enableSway) { IdleSwayOffset(dt, data); } ApplyStatusEffects(in context, dt, data); ApplyMotionEffects(in context, dt, data); _prevPitch = context.pitch; _prevYaw = context.yaw; } private void UpdateActionTime(in CameraContext context) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) double num = Math.Abs(MathUtils.UnwrapStep(context.yaw - _prevYaw)); double num2 = Math.Abs(context.pitch - _prevPitch); Vector3 velocity = context.velocity; if ((double)((Vector3)(ref velocity)).sqrMagnitude > 0.0004 || num > 0.05 || num2 > 0.05 || context.isInspectingItem) { _lastActionTime = Now; } } private void ApplyStatusEffects(in CameraContext context, double dt, ConfigData cfg) { ConfigData.General general = cfg.general; if (general.enableExhaustionEffect) { ExhaustionOffset(in context, dt, cfg); } if (general.enableInsanityEffect) { InsanityOffset(in context, dt, cfg); } if (general.enableTinnitusEffect) { TinnitusOffset(dt, cfg); } if (general.enableDrunknessEffect) { DrunknessOffset(in context, dt, cfg); } if (general.enableCriticalInjuryEffect) { CriticalInjuryOffset(in context, dt, cfg); } if (general.enablePoisonEffect) { PoisonOffset(in context, dt, cfg); } if (general.enableJetpackTurbulence) { JetpackTurbulenceOffset(in context, dt, cfg); } if (general.enableShockEffect) { ShockOffset(in context, dt, cfg); } if (general.enableSinkingTilt) { SinkingTiltOffset(in context, cfg); } if (general.enableWaterEffect) { WaterOffset(in context, dt, cfg); } } private void ApplyMotionEffects(in CameraContext context, double dt, ConfigData cfg) { ConfigData.General general = cfg.general; ShipMotionOffset(in context, dt, cfg); if (general.enablePitch) { VerticalVelocityPitchOffset(in context, dt, general.maxVelocityPitch); ForwardVelocityPitchOffset(in context, dt, general.maxVelocityPitch); } PunchOffset(dt); if (general.enableRoll) { TurningRollOffset(in context, dt, cfg); StrafingRollOffset(in context, dt, general.maxVelocityRoll); } } private void UpdateContext(in CameraContext context, double dt, ConfigData cfg) { if (_ctxCfg == null) { _ctxCfg = cfg.walking.Clone(); } ConfigData.Contextual b = (context.inVehicle ? cfg.cruiser : (context.isSprinting ? cfg.sprinting : cfg.walking)); double step = ((cfg.general.contextTransitionSmoothing > 0.0) ? MathUtils.DampStep(cfg.general.contextTransitionSmoothing, dt) : 1.0); _ctxCfg.Lerp(_ctxCfg, b, step); } private void PunchOffset(double dt) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) float num = (float)dt; _punchVel += (-220f * _punch - 22f * _punchVel) * num; _punch += _punchVel * num; _punch = Vector3.ClampMagnitude(_punch, 60f); _offsetEuler += _punch; } private void VerticalVelocityPitchOffset(in CameraContext context, double dt, double maxVelocityPitch) { double verticalVelocityPitchFactor = _ctxCfg.verticalVelocityPitchFactor; double smoothing = 4E-05 * _ctxCfg.verticalVelocitySmoothingFactor; double value = (context.isClimbing ? 0.0 : ((double)context.velocity.y * verticalVelocityPitchFactor)); if (Math.Abs(value) < 0.4) { value = 0.0; } value = MathUtils.Clamp(value, 0.0 - maxVelocityPitch, maxVelocityPitch); double num = MathUtils.Damp(_prevVerticalPitch, value, smoothing, dt); _offsetEuler.x += (float)num; _prevVerticalPitch = num; } private void ForwardVelocityPitchOffset(in CameraContext context, double dt, double maxVelocityPitch) { double forwardVelocityPitchFactor = _ctxCfg.forwardVelocityPitchFactor; double smoothing = 0.008 * _ctxCfg.horizontalVelocitySmoothingFactor; double value = (context.isClimbing ? 0.0 : ((double)context.forwardRelVelocity.z * forwardVelocityPitchFactor)); value = MathUtils.Clamp(value, 0.0 - maxVelocityPitch, maxVelocityPitch); double num = MathUtils.Damp(_prevForwardPitch, value, smoothing, dt); _offsetEuler.x += (float)num; _prevForwardPitch = num; } private void TurningRollOffset(in CameraContext context, double dt, ConfigData cfg) { double smoothing = 0.0825 * cfg.general.turningRollSmoothing; double num = 1.25 * cfg.general.turningRollIntensity; double num2 = 0.0048 * cfg.general.turningRollAccumulation; double num3 = MathUtils.UnwrapStep(_prevYaw - context.yaw); if (context.resetSmoothing) { num3 = 0.0; } _turningRollTarget = MathUtils.Damp(_turningRollTarget, 0.0, smoothing, dt); _turningRollTarget = MathUtils.Clamp(_turningRollTarget + num3 * num2, -1.0, 1.0); double num4 = MathUtils.Clamp01(TurningEasing(Math.Abs(_turningRollTarget))) * num * (double)Math.Sign(_turningRollTarget); _offsetEuler.z += (float)num4; } private static double TurningEasing(double x) { if (x < 0.5) { return 4.0 * x * x * x; } double num = -2.0 * x + 2.0; return 1.0 - num * num * num / 2.0; } private void StrafingRollOffset(in CameraContext context, double dt, double maxVelocityRoll) { double strafingRollFactor = _ctxCfg.strafingRollFactor; double smoothing = 0.008 * _ctxCfg.horizontalVelocitySmoothingFactor; double value = (double)(0f - context.forwardRelVelocity.x) * strafingRollFactor; value = MathUtils.Clamp(value, 0.0 - maxVelocityRoll, maxVelocityRoll); double num = MathUtils.Damp(_prevStrafingRoll, value, smoothing, dt); _offsetEuler.z += (float)num; _prevStrafingRoll = num; } private void IdleSwayOffset(double dt, ConfigData cfg) { double now = Now; double cameraSwayIntensity = cfg.general.cameraSwayIntensity; double cameraSwayFrequency = cfg.general.cameraSwayFrequency; if (now - _lastActionTime < cfg.general.cameraSwayFadeInDelay) { _swayFactorTarget = 0.0; } else if (_swayFactor == _swayFactorTarget) { _swayFactorTarget = 1.0; } double num = ((_swayFactorTarget > 0.0) ? cfg.general.cameraSwayFadeInLength : cfg.general.cameraSwayFadeOutLength); double step = ((num > 0.0) ? (dt / num) : 1.0); _swayFactor = MathUtils.StepTowards(_swayFactor, _swayFactorTarget, step); double num2 = _swayFactor * _swayFactor * _swayFactor; if (!(num2 <= 0.0)) { _swayTime += dt * cameraSwayFrequency * 0.5; double num3 = cameraSwayIntensity * num2; _offsetEuler.x += (float)(Noise.Sample(NoiseKind.Fractal, _swayTime, 420.0) * num3); _offsetEuler.y += (float)(Noise.Sample(NoiseKind.Fractal, _swayTime, 1337.0) * num3); } } private void ExhaustionOffset(in CameraContext context, double dt, ConfigData cfg) { double destination = 0.0; if (context.isExhausted) { destination = 1.0; } else if (cfg.general.exhaustionTriggerStamina > 0.0 && (double)context.sprintMeter < cfg.general.exhaustionTriggerStamina) { destination = 1.0 - Math.Max(context.sprintMeter, 0.0) / cfg.general.exhaustionTriggerStamina; } _exhaustionSeverity = MathUtils.Damp(_exhaustionSeverity, destination, 0.02, dt); if (!(_exhaustionSeverity <= 0.01)) { _exhaustionTime += dt * 0.5; double num = cfg.general.exhaustionSwayMultiplier * _exhaustionSeverity * 0.5; _offsetEuler.x += (float)(Noise.Sample(NoiseKind.Fractal, _exhaustionTime, 5500.0) * num); _offsetEuler.y += (float)(Noise.Sample(NoiseKind.Fractal, _exhaustionTime * 1.1, 6600.0) * num * 0.7); } } private void InsanityOffset(in CameraContext context, double dt, ConfigData cfg) { if (!((double)context.insanity < 0.7)) { float num = (float)MathUtils.Clamp01(((double)context.insanity - 0.7) / 0.30000000000000004); if (!(num <= 0f)) { _insanityTime += dt * (1.0 + (double)num * 1.25); double num2 = cfg.general.insanitySwayMultiplier * (double)num * 0.4; _offsetEuler.x += (float)(Noise.Sample(NoiseKind.Fractal, _insanityTime, 7700.0) * num2); _offsetEuler.y += (float)(Noise.Sample(NoiseKind.Fractal, _insanityTime * 1.2, 8800.0) * num2 * 0.6); } } } private void TinnitusOffset(double dt, ConfigData cfg) { if (!((Object)(object)SoundManager.Instance == (Object)null) && !(SoundManager.Instance.earsRingingTimer <= 0f)) { double num = MathUtils.Clamp01((double)SoundManager.Instance.earsRingingTimer / 5.0); double now = Now; double num2 = cfg.general.tinnitusSwayMultiplier * num; _offsetEuler.x += (float)(Noise.Sample(NoiseKind.Simplex, now * 1.25, 800.0) * num2); _offsetEuler.y += (float)(Noise.Sample(NoiseKind.Simplex, now * 1.25 * 0.8, 900.0) * num2); _offsetEuler.z += (float)(Noise.Sample(NoiseKind.Simplex, now * 1.25 * 1.1, 1000.0) * num2 * 0.5); } } private void DrunknessOffset(in CameraContext context, double dt, ConfigData cfg) { double destination = MathUtils.Clamp01(context.drunkness); _drunkSeverity = MathUtils.Damp(_drunkSeverity, destination, 0.06, dt); if (_drunkSeverity <= 0.001) { _drunkPitch = MathUtils.Damp(_drunkPitch, 0.0, 0.025, dt); _drunkYaw = MathUtils.Damp(_drunkYaw, 0.0, 0.025, dt); _drunkRoll = MathUtils.Damp(_drunkRoll, 0.0, 0.025, dt); return; } double num = _drunkSeverity * _drunkSeverity * (3.0 - 2.0 * _drunkSeverity); double num2 = MathUtils.Clamp(cfg.general.drunknessSwayMultiplier / 6.0, 0.25, 2.0); double num3 = MathUtils.Lerp(0.18, 0.42, num); _drunkTime += dt * num3; double num4 = 6.5 * num2; double num5 = 3.0 * num2; double num6 = 2.2 * num2; double destination2 = Noise.Sample(NoiseKind.OpenSimplex2, _drunkTime * 0.84, 3000.0) * num4 * num; double destination3 = Noise.Sample(NoiseKind.OpenSimplex2, _drunkTime * 0.58, 4000.0) * num5 * num; double destination4 = Noise.Sample(NoiseKind.OpenSimplex2, _drunkTime * 0.63, 5000.0) * num6 * num; _drunkRoll = MathUtils.Clamp(MathUtils.Damp(_drunkRoll, destination2, 0.025, dt), 0.0 - num4, num4); _drunkPitch = MathUtils.Clamp(MathUtils.Damp(_drunkPitch, destination3, 0.025, dt), 0.0 - num5, num5); _drunkYaw = MathUtils.Clamp(MathUtils.Damp(_drunkYaw, destination4, 0.025, dt), 0.0 - num6, num6); _impairOffset.z += (float)_drunkRoll; _impairOffset.x += (float)_drunkPitch; _impairOffset.y += (float)_drunkYaw; } private void CriticalInjuryOffset(in CameraContext context, double dt, ConfigData cfg) { double destination = (context.criticallyInjured ? 1.0 : 0.0); _criticalSeverity = MathUtils.Damp(_criticalSeverity, destination, 0.05, dt); if (!(_criticalSeverity <= 0.01)) { _criticalTime += dt * 0.35; double num = 0.75 + 0.25 * Math.Sin(Now * 2.4); double num2 = cfg.general.criticalInjurySwayMultiplier * _criticalSeverity * num; _impairOffset.x += (float)(Noise.Sample(NoiseKind.Fractal, _criticalTime, 9100.0) * num2); _impairOffset.y += (float)(Noise.Sample(NoiseKind.Fractal, _criticalTime * 1.1, 9200.0) * num2 * 0.8); _impairOffset.z += (float)(Noise.Sample(NoiseKind.Fractal, _criticalTime * 0.6, 9300.0) * num2 * 0.4); } } private void PoisonOffset(in CameraContext context, double dt, ConfigData cfg) { if (!(context.poison <= 0f)) { _poisonTime += dt * 1.5; double num = MathUtils.Clamp01(context.poison) * cfg.general.poisonSwayMultiplier; _impairOffset.x += (float)(Noise.Sample(NoiseKind.Simplex, _poisonTime, 10100.0) * num); _impairOffset.y += (float)(Noise.Sample(NoiseKind.Simplex, _poisonTime * 1.3, 10200.0) * num * 0.8); _impairOffset.z += (float)(Noise.Sample(NoiseKind.Simplex, _poisonTime * 0.9, 10300.0) * num * 0.5); } } private void JetpackTurbulenceOffset(in CameraContext context, double dt, ConfigData cfg) { double destination = (context.isUsingJetpack ? 1.0 : 0.0); _jetpackSeverity = MathUtils.Damp(_jetpackSeverity, destination, 0.03, dt); if (!(_jetpackSeverity <= 0.01)) { _jetpackTime += dt * 2.0; double num = cfg.general.jetpackTurbulenceIntensity * _jetpackSeverity; _impairOffset.x += (float)(Noise.Sample(NoiseKind.Fractal, _jetpackTime, 11100.0) * num); _impairOffset.y += (float)(Noise.Sample(NoiseKind.Fractal, _jetpackTime * 1.2, 11200.0) * num); _impairOffset.z += (float)(Noise.Sample(NoiseKind.Fractal, _jetpackTime * 0.8, 11300.0) * num * 0.6); } } private void ShockOffset(in CameraContext context, double dt, ConfigData cfg) { double destination = (context.isBeingShocked ? 1.0 : 0.0); _shockSeverity = MathUtils.Damp(_shockSeverity, destination, 0.02, dt); if (!(_shockSeverity <= 0.01)) { _shockTime += dt * 25.0; double num = cfg.general.shockShakeMultiplier * _shockSeverity; _impairOffset.x += (float)(Noise.Sample(NoiseKind.FrequencyMod, _shockTime, 12100.0) * num); _impairOffset.y += (float)(Noise.Sample(NoiseKind.FrequencyMod, _shockTime * 1.1, 12200.0) * num); _impairOffset.z += (float)(Noise.Sample(NoiseKind.FrequencyMod, _shockTime * 0.9, 12300.0) * num * 0.7); } } private void SinkingTiltOffset(in CameraContext context, ConfigData cfg) { if (!(context.sinkingValue <= 0f)) { double num = MathUtils.Clamp01(context.sinkingValue) * cfg.general.sinkingTiltStrength; _impairOffset.x += (float)num; } } private void WaterOffset(in CameraContext context, double dt, ConfigData cfg) { double destination = ((context.inWater && !context.submerged) ? 1.0 : 0.0); double destination2 = (context.submerged ? 1.0 : 0.0); _waterWadeSeverity = MathUtils.Damp(_waterWadeSeverity, destination, 0.06, dt); _waterSubmergeSeverity = MathUtils.Damp(_waterSubmergeSeverity, destination2, 0.05, dt); if (!(_waterWadeSeverity <= 0.01) || !(_waterSubmergeSeverity <= 0.01)) { _waterTime += dt; if (_waterWadeSeverity > 0.01) { double num = cfg.general.waterWadeStrength * _waterWadeSeverity; double num2 = _waterTime * 0.9; _impairOffset.x += (float)(Noise.Sample(NoiseKind.Fractal, num2, 14100.0) * num * 0.6); _impairOffset.z += (float)(Noise.Sample(NoiseKind.Fractal, num2 * 0.8, 14200.0) * num); } if (_waterSubmergeSeverity > 0.01) { double num3 = cfg.general.waterSubmergedDriftStrength * _waterSubmergeSeverity; double num4 = _waterTime * 0.4; _impairOffset.z += (float)(Noise.Sample(NoiseKind.OpenSimplex2, num4, 14300.0) * num3); _impairOffset.x += (float)(Noise.Sample(NoiseKind.OpenSimplex2, num4 * 0.82, 14400.0) * num3 * 0.8); _impairOffset.y += (float)(Noise.Sample(NoiseKind.OpenSimplex2, num4 * 0.9, 14500.0) * num3 * 0.7); } } } private void ShipMotionOffset(in CameraContext context, double dt, ConfigData cfg) { bool flag = context.shipTakeoffPhase >= 0f && cfg.general.shipTakeoffShakeStrength > 0.0; bool flag2 = context.shipLandingPhase >= 0f && cfg.general.shipLandingShakeStrength > 0.0; if (flag || flag2) { double num2; double num3; double num5; if (flag) { double num = MathUtils.Clamp01(context.shipTakeoffPhase); num2 = cfg.general.shipTakeoffShakeStrength; num3 = num * num; double num4 = Math.Max(0.0, 1.0 - num * 3.0); num5 = (num4 * 1.2 + num3 * 0.8) * num2; } else { double num = MathUtils.Clamp01(context.shipLandingPhase); num2 = cfg.general.shipLandingShakeStrength; num3 = Math.Sin(num * Math.PI); num5 = num3 * 1.2 * num2; } double num6 = num2 * num3 * 0.85; if (!(num6 <= 0.0) || num5 != 0.0) { _shipTime += dt * 9.0; _offsetEuler.x += (float)(Noise.Sample(NoiseKind.Fractal, _shipTime, 13100.0) * num6 + num5); _offsetEuler.y += (float)(Noise.Sample(NoiseKind.Fractal, _shipTime * 1.1, 13200.0) * num6 * 0.7); _offsetEuler.z += (float)(Noise.Sample(NoiseKind.Fractal, _shipTime * 0.9, 13300.0) * num6 * 0.8); } } } private void CameraSmoothingOffset(in CameraContext context, double dt) { double num = Math.Max(0.0, _ctxCfg.cameraSmoothing); double yaw = context.yaw; double pitch = context.pitch; if (!_msInit || context.resetSmoothing) { _prevYawNorm = yaw; _prevPitchNorm = pitch; _contYaw = yaw; _contPitch = pitch; _smYaw = yaw; _smPitch = pitch; _msInit = true; return; } double num2 = MathUtils.UnwrapStep(yaw - _prevYawNorm); double num3 = MathUtils.UnwrapStep(pitch - _prevPitchNorm); _prevYawNorm = yaw; _prevPitchNorm = pitch; _contYaw += num2; _contPitch += num3; if (num <= 0.001) { _smYaw = _contYaw; _smPitch = _contPitch; return; } double num4 = 16.0 / num; double num5 = 1.0 - Math.Exp((0.0 - num4) * Math.Max(0.0, dt)); _smYaw += (_contYaw - _smYaw) * num5; _smPitch += (_contPitch - _smPitch) * num5; _smoothing.y += (float)MathUtils.UnwrapStep(_smYaw - yaw); _smoothing.x += (float)MathUtils.UnwrapStep(_smPitch - pitch); } } internal static class LethalConfigCompat { private const string Guid = "ainavt.lc.lethalconfig"; private static bool? _present; public static bool Present { get { bool valueOrDefault = _present == true; if (!_present.HasValue) { valueOrDefault = Chainloader.PluginInfos.ContainsKey("ainavt.lc.lethalconfig"); _present = valueOrDefault; return valueOrDefault; } return valueOrDefault; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void Register(IReadOnlyList entries) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown foreach (ConfigEntryBase entry in entries) { if (!(entry is ConfigEntry val)) { if (!(entry is ConfigEntry val2)) { if (entry is ConfigEntry val3) { LethalConfigManager.AddConfigItem((BaseConfigItem)new BoolCheckBoxConfigItem(val3, false)); } else { Plugin.Log.LogDebug((object)("Skipping unsupported LethalConfig entry type: " + entry.SettingType.Name)); } } else { LethalConfigManager.AddConfigItem((BaseConfigItem)new IntSliderConfigItem(val2, false)); } } else { LethalConfigManager.AddConfigItem((BaseConfigItem)new FloatSliderConfigItem(val, false)); } } } } internal static class VisorCompat { public static void StickVisor(Transform? localVisor, Transform? targetPoint, float strength) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)localVisor == (Object)null) && !((Object)(object)targetPoint == (Object)null)) { localVisor.rotation = ((strength >= 0.999f) ? targetPoint.rotation : Quaternion.Slerp(localVisor.rotation, targetPoint.rotation, strength)); } } } internal static class ConfigManager { private sealed class ContextEntries { public ConfigEntry Strafe; public ConfigEntry ForwardPitch; public ConfigEntry VerticalPitch; public ConfigEntry HSmooth; public ConfigEntry VSmooth; public ConfigEntry MouseSmoothing; } private static readonly ConfigData _data = new ConfigData(); private static readonly List _entries = new List(); private static ConfigEntry _masterStrength = null; private static ConfigEntry _contextTransitionSmoothing = null; private static ConfigEntry _maxVelocityRoll = null; private static ConfigEntry _maxVelocityPitch = null; private static ConfigEntry _enableRoll = null; private static ConfigEntry _enablePitch = null; private static ConfigEntry _enableSway = null; private static ConfigEntry _enableScreenShake = null; private static ConfigEntry _enableLandingDip = null; private static ConfigEntry _enableWeaponShake = null; private static ConfigEntry _enableMeleeWeaponShake = null; private static ConfigEntry _enableTinnitusEffect = null; private static ConfigEntry _enableExhaustionEffect = null; private static ConfigEntry _enableInsanityEffect = null; private static ConfigEntry _enableDrunknessEffect = null; private static ConfigEntry _enableCriticalInjuryEffect = null; private static ConfigEntry _enablePoisonEffect = null; private static ConfigEntry _enableJetpackTurbulence = null; private static ConfigEntry _enableShockEffect = null; private static ConfigEntry _enableSinkingTilt = null; private static ConfigEntry _enableWaterEffect = null; private static ConfigEntry _enableHealthCondition = null; private static ConfigEntry _turningRollIntensity = null; private static ConfigEntry _turningRollAccumulation = null; private static ConfigEntry _turningRollSmoothing = null; private static ConfigEntry _swayIntensity = null; private static ConfigEntry _swayFrequency = null; private static ConfigEntry _swayFadeInDelay = null; private static ConfigEntry _swayFadeInLength = null; private static ConfigEntry _swayFadeOutLength = null; private static ConfigEntry _tinnitusSwayMultiplier = null; private static ConfigEntry _exhaustionSwayMultiplier = null; private static ConfigEntry _exhaustionTriggerStamina = null; private static ConfigEntry _insanitySwayMultiplier = null; private static ConfigEntry _drunknessSwayMultiplier = null; private static ConfigEntry _criticalInjurySwayMultiplier = null; private static ConfigEntry _poisonSwayMultiplier = null; private static ConfigEntry _jetpackTurbulenceIntensity = null; private static ConfigEntry _shockShakeMultiplier = null; private static ConfigEntry _sinkingTiltStrength = null; private static ConfigEntry _waterWadeStrength = null; private static ConfigEntry _waterSubmergedDriftStrength = null; private static ConfigEntry _waterSplashStrength = null; private static ConfigEntry _shakeMaxIntensity = null; private static ConfigEntry _shakeMaxFrequency = null; private static ConfigEntry _shakeDecay = null; private static ConfigEntry _explosionTrauma = null; private static ConfigEntry _landingTrauma = null; private static ConfigEntry _damageTrauma = null; private static ConfigEntry _damageKick = null; private static ConfigEntry _vehicleImpactTrauma = null; private static ConfigEntry _flashbangTrauma = null; private static ConfigEntry _shipTakeoffShakeStrength = null; private static ConfigEntry _shipLandingShakeStrength = null; private static ConfigEntry _weaponShakeTrauma = null; private static ConfigEntry _weaponRecoilKick = null; private static ConfigEntry _meleeWeaponShakeTrauma = null; private static ConfigEntry _meleeWeaponRecoilKick = null; private static ConfigEntry _meleeWeaponMissMultiplier = null; private static ConfigEntry _landingDipStrength = null; private static ConfigEntry _landingWeightInfluence = null; private static ConfigEntry _healthConditionTriggerLimit = null; private static readonly ContextEntries _walk = new ContextEntries(); private static readonly ContextEntries _sprint = new ContextEntries(); private static readonly ContextEntries _cruiser = new ContextEntries(); public static ConfigData Data => _data; internal static void Initialize(ConfigFile config) { _entries.Clear(); config.SaveOnConfigSet = false; ConfigData configData = new ConfigData(); _masterStrength = BindFloat(config, "1. General", "MasterStrength", (float)configData.general.masterStrength, 0f, 3f, "Scales every effect."); _contextTransitionSmoothing = BindFloat(config, "1. General", "ContextTransitionSmoothing", (float)configData.general.contextTransitionSmoothing, 0f, 1f, "How smoothly tuning blends when your movement context changes."); _maxVelocityRoll = BindFloat(config, "1. General", "MaxVelocityRoll", (float)configData.general.maxVelocityRoll, 0f, 90f, "Safety cap on speed-driven roll so very high speeds can't fling the view."); _maxVelocityPitch = BindFloat(config, "1. General", "MaxVelocityPitch", (float)configData.general.maxVelocityPitch, 0f, 90f, "Safety cap on speed-driven pitch so very high speeds can't fling the view."); _enableRoll = BindBool(config, "2. Effect Toggles", "EnableRoll", configData.general.enableRoll, "Strafing lean and turning roll."); _enablePitch = BindBool(config, "2. Effect Toggles", "EnablePitch", configData.general.enablePitch, "Forward/back and vertical velocity pitch."); _enableSway = BindBool(config, "2. Effect Toggles", "EnableSway", configData.general.enableSway, "Idle camera sway while standing still."); _enableScreenShake = BindBool(config, "2. Effect Toggles", "EnableScreenShake", configData.general.enableScreenShake, "Screen shake from explosions, hard landings and taking damage."); _enableLandingDip = BindBool(config, "2. Effect Toggles", "EnableLandingDip", configData.general.enableLandingDip, "Quick downward pitch punch when you land hard."); _enableWeaponShake = BindBool(config, "2. Effect Toggles", "EnableWeaponShake", configData.general.enableWeaponShake, "Rattle and upward recoil kick when you fire a gun."); _enableMeleeWeaponShake = BindBool(config, "2. Effect Toggles", "EnableMeleeWeaponShake", configData.general.enableMeleeWeaponShake, "Rattle and upward punch when you swing a melee weapon."); _enableTinnitusEffect = BindBool(config, "2. Effect Toggles", "EnableTinnitusEffect", configData.general.enableTinnitusEffect, "Increases camera sway heavily while having tinnitues."); _enableExhaustionEffect = BindBool(config, "2. Effect Toggles", "EnableExhaustionEffect", configData.general.enableExhaustionEffect, "Heavy breathing/sway when you are completely out of stamina."); _enableInsanityEffect = BindBool(config, "2. Effect Toggles", "EnableInsanityEffect", configData.general.enableInsanityEffect, "Faster camera sway when character insanity limit drops."); _enableDrunknessEffect = BindBool(config, "2. Effect Toggles", "EnableDrunknessEffect", configData.general.enableDrunknessEffect, "Smooth floating camera drift when intoxicated."); _enableCriticalInjuryEffect = BindBool(config, "2. Effect Toggles", "EnableCriticalInjuryEffect", configData.general.enableCriticalInjuryEffect, "Pulsing near death sway while critically injured."); _enablePoisonEffect = BindBool(config, "2. Effect Toggles", "EnablePoisonEffect", configData.general.enablePoisonEffect, "Jittery sway while poisoned."); _enableJetpackTurbulence = BindBool(config, "2. Effect Toggles", "EnableJetpackTurbulence", configData.general.enableJetpackTurbulence, "Turbulence sway while flying a jetpack."); _enableShockEffect = BindBool(config, "2. Effect Toggles", "EnableShockEffect", configData.general.enableShockEffect, "Electric jitter while being zapped by a zap gun."); _enableSinkingTilt = BindBool(config, "2. Effect Toggles", "EnableSinkingTilt", configData.general.enableSinkingTilt, "Forward pitch tilt as you sink into quicksand."); _enableWaterEffect = BindBool(config, "2. Effect Toggles", "EnableWaterEffect", configData.general.enableWaterEffect, "Sloshy sway while wading and floaty drift while submerged in water."); _enableHealthCondition = BindBool(config, "2. Effect Toggles", "EnableHealthCondition", configData.general.enableHealthCondition, "When health is low, camera effects gradually fade out."); _turningRollIntensity = BindFloat(config, "3. Turning Roll", "Intensity", (float)configData.general.turningRollIntensity, 0f, 5f, "Maximum roll the camera leans when you whip the view left/right."); _turningRollAccumulation = BindFloat(config, "3. Turning Roll", "Accumulation", (float)configData.general.turningRollAccumulation, 0f, 5f, "How quickly fast turning builds up the lean."); _turningRollSmoothing = BindFloat(config, "3. Turning Roll", "Smoothing", (float)configData.general.turningRollSmoothing, 0f, 5f, "How quickly the turning lean settles back to level once you stop turning."); _swayIntensity = BindFloat(config, "4. Camera Sway", "Intensity", (float)configData.general.cameraSwayIntensity, 0f, 5f, "Strength of the idle sway while standing still."); _swayFrequency = BindFloat(config, "4. Camera Sway", "Frequency", (float)configData.general.cameraSwayFrequency, 0f, 2f, "Speed of the idle sway."); _swayFadeInDelay = BindFloat(config, "4. Camera Sway", "FadeInDelay", (float)configData.general.cameraSwayFadeInDelay, 0f, 5f, "Seconds of stillness before sway starts fading in."); _swayFadeInLength = BindFloat(config, "4. Camera Sway", "FadeInLength", (float)configData.general.cameraSwayFadeInLength, 0f, 20f, "Seconds for sway to reach full strength once it starts fading in."); _swayFadeOutLength = BindFloat(config, "4. Camera Sway", "FadeOutLength", (float)configData.general.cameraSwayFadeOutLength, 0f, 5f, "Seconds for sway to fade back out when you start moving."); _tinnitusSwayMultiplier = BindFloat(config, "4. Camera Sway", "TinnitusSwayMultiplier", (float)configData.general.tinnitusSwayMultiplier, 1f, 10f, "Multiplier on camera sway while you have tinnitus."); _exhaustionSwayMultiplier = BindFloat(config, "4. Camera Sway", "ExhaustionSwayMultiplier", (float)configData.general.exhaustionSwayMultiplier, 1f, 10f, "Multiplier on camera sway while exhausted."); _exhaustionTriggerStamina = BindFloat(config, "4. Camera Sway", "ExhaustionTriggerStamina", (float)configData.general.exhaustionTriggerStamina, 0.05f, 1f, "Stamina level below which exhaustion sway starts creeping in."); _insanitySwayMultiplier = BindFloat(config, "4. Camera Sway", "InsanitySwayMultiplier", (float)configData.general.insanitySwayMultiplier, 1f, 10f, "Multiplier on camera sway frequency while panicked/insane."); _drunknessSwayMultiplier = BindFloat(config, "4. Camera Sway", "DrunknessSwayMultiplier", (float)configData.general.drunknessSwayMultiplier, 1f, 10f, "Multiplier on camera sway drift while intoxicated."); _criticalInjurySwayMultiplier = BindFloat(config, "4. Camera Sway", "CriticalInjurySwayMultiplier", (float)configData.general.criticalInjurySwayMultiplier, 1f, 10f, "Strength of the heavy near-death sway while critically injured."); _poisonSwayMultiplier = BindFloat(config, "4. Camera Sway", "PoisonSwayMultiplier", (float)configData.general.poisonSwayMultiplier, 1f, 10f, "Strength of the jittery sway while poisoned."); _jetpackTurbulenceIntensity = BindFloat(config, "4. Camera Sway", "JetpackTurbulenceIntensity", (float)configData.general.jetpackTurbulenceIntensity, 0f, 10f, "Strength of the turbulence sway while flying a jetpack."); _shockShakeMultiplier = BindFloat(config, "4. Camera Sway", "ShockShakeMultiplier", (float)configData.general.shockShakeMultiplier, 0f, 10f, "Strength of the electric jitter while being shocked."); _sinkingTiltStrength = BindFloat(config, "4. Camera Sway", "SinkingTiltStrength", (float)configData.general.sinkingTiltStrength, 0f, 45f, "Degrees of forward pitch tilt at full sink in quicksand."); _shakeMaxIntensity = BindFloat(config, "5. Screen Shake", "MaxIntensity", (float)configData.general.screenShakesMaxIntensity, 0f, 10f, "Screen shake strength multiplying all shake."); _shakeMaxFrequency = BindFloat(config, "5. Screen Shake", "MaxFrequency", (float)configData.general.screenShakesMaxFrequency, 0f, 20f, "Screen shake speed/harshness."); _shakeDecay = BindFloat(config, "5. Screen Shake", "Decay", (float)configData.general.screenShakeDecay, 0.1f, 5f, "How fast shake fades. Trauma drained per second."); _explosionTrauma = BindFloat(config, "5. Screen Shake", "ExplosionTrauma", (float)configData.general.explosionTrauma, 0f, 3f, "Shake strength of a nearby explosion, scaled by distance."); _landingTrauma = BindFloat(config, "5. Screen Shake", "LandingTrauma", (float)configData.general.landingTrauma, 0f, 3f, "Shake strength of a hard landing, scaled by fall force and carry weight."); _damageTrauma = BindFloat(config, "5. Screen Shake", "DamageTrauma", (float)configData.general.damageTrauma, 0f, 3f, "Shake strength of taking damage, scaled by the hit size."); _damageKick = BindFloat(config, "5. Screen Shake", "DamageKick", (float)configData.general.damageKick, 0f, 20f, "Directional camera punch away from a hit, scaled by hit size."); _vehicleImpactTrauma = BindFloat(config, "5. Screen Shake", "VehicleImpactTrauma", (float)configData.general.vehicleImpactTrauma, 0f, 3f, "Shake strength of a hard cruiser crash, scaled by how fast you stopped."); _flashbangTrauma = BindFloat(config, "5. Screen Shake", "FlashbangTrauma", (float)configData.general.flashbangTrauma, 0f, 5f, "Shake strength of a Stun Grenade detonation, scaled by distance."); _shipTakeoffShakeStrength = BindFloat(config, "5. Screen Shake", "ShipTakeoffShakeStrength", (float)configData.general.shipTakeoffShakeStrength, 0f, 5f, "Camera shake that builds up as the ship blasts off. 0 disables."); _shipLandingShakeStrength = BindFloat(config, "5. Screen Shake", "ShipLandingShakeStrength", (float)configData.general.shipLandingShakeStrength, 0f, 5f, "Camera shake as the ship descends and touches down. 0 disables."); _weaponShakeTrauma = BindFloat(config, "5. Screen Shake", "WeaponShakeTrauma", (float)configData.general.weaponShakeTrauma, 0f, 3f, "Shake strength of a gunshot."); _weaponRecoilKick = BindFloat(config, "5. Screen Shake", "WeaponRecoilKick", (float)configData.general.weaponRecoilKick, 0f, 60f, "Upward recoil punch per shot."); _meleeWeaponShakeTrauma = BindFloat(config, "5. Screen Shake", "MeleeWeaponShakeTrauma", (float)configData.general.meleeWeaponShakeTrauma, 0f, 3f, "Shake strength of a shovel swing."); _meleeWeaponRecoilKick = BindFloat(config, "5. Screen Shake", "MeleeWeaponRecoilKick", (float)configData.general.meleeWeaponRecoilKick, 0f, 60f, "Upward punch per shovel swing."); _meleeWeaponMissMultiplier = BindFloat(config, "5. Screen Shake", "MeleeWeaponMissMultiplier", (float)configData.general.meleeWeaponMissMultiplier, 0f, 1f, "Multiplier on the shovel swing shake/kick if you swing but hit nothing."); _landingDipStrength = BindFloat(config, "5. Screen Shake", "LandingDipStrength", (float)configData.general.landingDipStrength, 0f, 20f, "How far the camera dips down on a hard landing."); _landingWeightInfluence = BindFloat(config, "5. Screen Shake", "LandingWeightInfluence", (float)configData.general.landingWeightInfluence, 0f, 2f, "How much carry weight hardens landings."); _healthConditionTriggerLimit = BindFloat(config, "5. Screen Shake", "HealthConditionTriggerLimit", (float)configData.general.healthConditionTriggerLimit, 0f, 100f, "Below this health, camera effects start to fade out."); BindContext(config, "6. Walking", _walk, configData.walking); BindContext(config, "7. Sprinting", _sprint, configData.sprinting); BindContext(config, "8. Cruiser", _cruiser, configData.cruiser); _waterWadeStrength = BindFloat(config, "9. Water", "WadeStrength", (float)configData.general.waterWadeStrength, 0f, 10f, "Strength of the heavy slosh sway while wading through water."); _waterSubmergedDriftStrength = BindFloat(config, "9. Water", "SubmergedDriftStrength", (float)configData.general.waterSubmergedDriftStrength, 0f, 15f, "Strength of the slow floaty drift while fully submerged."); _waterSplashStrength = BindFloat(config, "9. Water", "SplashStrength", (float)configData.general.waterSplashStrength, 0f, 10f, "Downward camera dip when entering water and when your head goes under."); Sync(); config.SettingChanged += delegate { Sync(); }; ClearOrphanedEntries(config); config.Save(); config.SaveOnConfigSet = true; if (LethalConfigCompat.Present) { LethalConfigCompat.Register(_entries); } } private static void BindContext(ConfigFile c, string section, ContextEntries e, ConfigData.Contextual def) { e.Strafe = BindFloat(c, section, "StrafingRollFactor", (float)def.strafingRollFactor, 0f, 30f, "How hard the camera leans/rolls into sideways movement."); e.ForwardPitch = BindFloat(c, section, "ForwardVelocityPitchFactor", (float)def.forwardVelocityPitchFactor, 0f, 30f, "How much the camera tilts/pitches with forward/back speed."); e.VerticalPitch = BindFloat(c, section, "VerticalVelocityPitchFactor", (float)def.verticalVelocityPitchFactor, 0f, 30f, "How much the camera tilts up/down with vertical speed."); e.HSmooth = BindFloat(c, section, "HorizontalVelocitySmoothingFactor", (float)def.horizontalVelocitySmoothingFactor, 0f, 10f, "Smoothing for the strafe roll and forward-pitch effects."); e.VSmooth = BindFloat(c, section, "VerticalVelocitySmoothingFactor", (float)def.verticalVelocitySmoothingFactor, 0f, 10f, "Smoothing for the vertical velocity pitch."); e.MouseSmoothing = BindFloat(c, section, "CameraSmoothing", (float)def.cameraSmoothing, 0f, 5f, "Mouse moving smoothing."); } private static ConfigEntry BindFloat(ConfigFile c, string section, string key, float def, float min, float max, string desc) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown ConfigEntry val = c.Bind(section, key, def, new ConfigDescription(desc, (AcceptableValueBase)(object)new AcceptableValueRange(min, max), Array.Empty())); _entries.Add((ConfigEntryBase)(object)val); return val; } private static ConfigEntry BindBool(ConfigFile c, string section, string key, bool def, string desc) { ConfigEntry val = c.Bind(section, key, def, desc); _entries.Add((ConfigEntryBase)(object)val); return val; } private static void Sync() { ConfigData.General general = _data.general; general.masterStrength = _masterStrength.Value; general.contextTransitionSmoothing = _contextTransitionSmoothing.Value; general.maxVelocityRoll = _maxVelocityRoll.Value; general.maxVelocityPitch = _maxVelocityPitch.Value; general.enableRoll = _enableRoll.Value; general.enablePitch = _enablePitch.Value; general.enableSway = _enableSway.Value; general.enableScreenShake = _enableScreenShake.Value; general.enableLandingDip = _enableLandingDip.Value; general.enableWeaponShake = _enableWeaponShake.Value; general.enableMeleeWeaponShake = _enableMeleeWeaponShake.Value; general.enableTinnitusEffect = _enableTinnitusEffect.Value; general.enableExhaustionEffect = _enableExhaustionEffect.Value; general.enableInsanityEffect = _enableInsanityEffect.Value; general.enableDrunknessEffect = _enableDrunknessEffect.Value; general.enableCriticalInjuryEffect = _enableCriticalInjuryEffect.Value; general.enablePoisonEffect = _enablePoisonEffect.Value; general.enableJetpackTurbulence = _enableJetpackTurbulence.Value; general.enableShockEffect = _enableShockEffect.Value; general.enableSinkingTilt = _enableSinkingTilt.Value; general.enableWaterEffect = _enableWaterEffect.Value; general.enableHealthCondition = _enableHealthCondition.Value; general.turningRollIntensity = _turningRollIntensity.Value; general.turningRollAccumulation = _turningRollAccumulation.Value; general.turningRollSmoothing = _turningRollSmoothing.Value; general.cameraSwayIntensity = _swayIntensity.Value; general.cameraSwayFrequency = _swayFrequency.Value; general.cameraSwayFadeInDelay = _swayFadeInDelay.Value; general.cameraSwayFadeInLength = _swayFadeInLength.Value; general.cameraSwayFadeOutLength = _swayFadeOutLength.Value; general.tinnitusSwayMultiplier = _tinnitusSwayMultiplier.Value; general.exhaustionSwayMultiplier = _exhaustionSwayMultiplier.Value; general.exhaustionTriggerStamina = _exhaustionTriggerStamina.Value; general.insanitySwayMultiplier = _insanitySwayMultiplier.Value; general.drunknessSwayMultiplier = _drunknessSwayMultiplier.Value; general.criticalInjurySwayMultiplier = _criticalInjurySwayMultiplier.Value; general.poisonSwayMultiplier = _poisonSwayMultiplier.Value; general.jetpackTurbulenceIntensity = _jetpackTurbulenceIntensity.Value; general.shockShakeMultiplier = _shockShakeMultiplier.Value; general.sinkingTiltStrength = _sinkingTiltStrength.Value; general.waterWadeStrength = _waterWadeStrength.Value; general.waterSubmergedDriftStrength = _waterSubmergedDriftStrength.Value; general.waterSplashStrength = _waterSplashStrength.Value; general.screenShakesMaxIntensity = _shakeMaxIntensity.Value; general.screenShakesMaxFrequency = _shakeMaxFrequency.Value; general.screenShakeDecay = _shakeDecay.Value; general.explosionTrauma = _explosionTrauma.Value; general.landingTrauma = _landingTrauma.Value; general.damageTrauma = _damageTrauma.Value; general.damageKick = _damageKick.Value; general.vehicleImpactTrauma = _vehicleImpactTrauma.Value; general.flashbangTrauma = _flashbangTrauma.Value; general.shipTakeoffShakeStrength = _shipTakeoffShakeStrength.Value; general.shipLandingShakeStrength = _shipLandingShakeStrength.Value; general.weaponShakeTrauma = _weaponShakeTrauma.Value; general.weaponRecoilKick = _weaponRecoilKick.Value; general.meleeWeaponShakeTrauma = _meleeWeaponShakeTrauma.Value; general.meleeWeaponRecoilKick = _meleeWeaponRecoilKick.Value; general.meleeWeaponMissMultiplier = _meleeWeaponMissMultiplier.Value; general.landingDipStrength = _landingDipStrength.Value; general.landingWeightInfluence = _landingWeightInfluence.Value; general.healthConditionTriggerLimit = _healthConditionTriggerLimit.Value; SyncContext(_walk, _data.walking); SyncContext(_sprint, _data.sprinting); SyncContext(_cruiser, _data.cruiser); } private static void SyncContext(ContextEntries e, ConfigData.Contextual c) { c.strafingRollFactor = e.Strafe.Value; c.forwardVelocityPitchFactor = e.ForwardPitch.Value; c.verticalVelocityPitchFactor = e.VerticalPitch.Value; c.horizontalVelocitySmoothingFactor = e.HSmooth.Value; c.verticalVelocitySmoothingFactor = e.VSmooth.Value; c.cameraSmoothing = e.MouseSmoothing.Value; } private static void ClearOrphanedEntries(ConfigFile config) { try { PropertyInfo propertyInfo = AccessTools.Property(typeof(ConfigFile), "OrphanedEntries"); if (propertyInfo != null && propertyInfo.GetValue(config) is Dictionary dictionary) { dictionary.Clear(); Plugin.Log.LogDebug((object)"Cleared orphaned config entries"); } } catch (Exception ex) { Plugin.Log.LogWarning((object)("Could not clear orphaned config entries: " + ex.Message)); } } } internal sealed class ConfigData { public sealed class General { public double masterStrength = 1.0; public double contextTransitionSmoothing = 0.1; public bool enableRoll = true; public bool enablePitch = true; public bool enableSway = true; public bool enableScreenShake = true; public bool enableLandingDip = true; public bool enableWeaponShake = true; public bool enableMeleeWeaponShake = true; public bool enableTinnitusEffect = true; public bool enableExhaustionEffect = true; public bool enableInsanityEffect = true; public bool enableDrunknessEffect = true; public bool enableCriticalInjuryEffect = true; public bool enablePoisonEffect = true; public bool enableJetpackTurbulence = true; public bool enableShockEffect = true; public bool enableSinkingTilt = true; public bool enableWaterEffect = true; public bool enableHealthCondition = true; public double turningRollAccumulation = 2.5; public double turningRollIntensity = 3.0; public double turningRollSmoothing = 1.0; public double cameraSwayIntensity = 2.0; public double cameraSwayFrequency = 0.16; public double cameraSwayFadeInDelay = 2.0; public double cameraSwayFadeInLength = 5.0; public double cameraSwayFadeOutLength = 0.75; public double tinnitusSwayMultiplier = 10.0; public double exhaustionSwayMultiplier = 4.0; public double exhaustionTriggerStamina = 0.4; public double insanitySwayMultiplier = 1.5; public double drunknessSwayMultiplier = 6.0; public double criticalInjurySwayMultiplier = 4.0; public double poisonSwayMultiplier = 6.0; public double jetpackTurbulenceIntensity = 1.5; public double shockShakeMultiplier = 3.0; public double sinkingTiltStrength = 12.0; public double waterWadeStrength = 2.0; public double waterSubmergedDriftStrength = 5.0; public double waterSplashStrength = 5.0; public double screenShakesMaxIntensity = 2.5; public double screenShakesMaxFrequency = 6.0; public double screenShakeDecay = 1.5; public double explosionTrauma = 1.7; public double landingTrauma = 1.0; public double damageTrauma = 4.0; public double damageKick = 4.0; public double vehicleImpactTrauma = 2.0; public double flashbangTrauma = 2.5; public double shipTakeoffShakeStrength = 0.5; public double shipLandingShakeStrength = 0.7; public double weaponShakeTrauma = 1.3; public double weaponRecoilKick = 30.0; public double meleeWeaponShakeTrauma = 1.0; public double meleeWeaponRecoilKick = 5.0; public double meleeWeaponMissMultiplier = 0.5; public double landingDipStrength = 6.0; public double landingWeightInfluence = 0.3; public double maxVelocityRoll = 12.0; public double maxVelocityPitch = 10.0; public double healthConditionTriggerLimit = 20.0; } public sealed class Contextual { public double strafingRollFactor = 8.0; public double forwardVelocityPitchFactor = 2.0; public double verticalVelocityPitchFactor = 7.0; public double horizontalVelocitySmoothingFactor = 1.0; public double verticalVelocitySmoothingFactor = 1.0; public double cameraSmoothing; public void CopyFrom(Contextual o) { strafingRollFactor = o.strafingRollFactor; forwardVelocityPitchFactor = o.forwardVelocityPitchFactor; verticalVelocityPitchFactor = o.verticalVelocityPitchFactor; horizontalVelocitySmoothingFactor = o.horizontalVelocitySmoothingFactor; verticalVelocitySmoothingFactor = o.verticalVelocitySmoothingFactor; cameraSmoothing = o.cameraSmoothing; } public Contextual Clone() { Contextual contextual = new Contextual(); contextual.CopyFrom(this); return contextual; } public void Lerp(Contextual a, Contextual b, double step) { strafingRollFactor = MathUtils.Lerp(a.strafingRollFactor, b.strafingRollFactor, step); forwardVelocityPitchFactor = MathUtils.Lerp(a.forwardVelocityPitchFactor, b.forwardVelocityPitchFactor, step); verticalVelocityPitchFactor = MathUtils.Lerp(a.verticalVelocityPitchFactor, b.verticalVelocityPitchFactor, step); horizontalVelocitySmoothingFactor = MathUtils.Lerp(a.horizontalVelocitySmoothingFactor, b.horizontalVelocitySmoothingFactor, step); verticalVelocitySmoothingFactor = MathUtils.Lerp(a.verticalVelocitySmoothingFactor, b.verticalVelocitySmoothingFactor, step); cameraSmoothing = MathUtils.Lerp(a.cameraSmoothing, b.cameraSmoothing, step); } } public General general = new General(); public Contextual walking = new Contextual(); public Contextual sprinting = new Contextual(); public Contextual cruiser = new Contextual(); public ConfigData() { sprinting.strafingRollFactor = 10.0; sprinting.forwardVelocityPitchFactor = 9.5; sprinting.verticalVelocityPitchFactor = 8.0; sprinting.cameraSmoothing = 0.0; cruiser.strafingRollFactor = 5.0; cruiser.forwardVelocityPitchFactor = 3.5; cruiser.verticalVelocityPitchFactor = 5.0; cruiser.cameraSmoothing = 0.0; } } internal static class ModGUIDs { public const string ImmersiveVisor = "ImmersiveVisor"; public const string LethalConfig = "ainavt.lc.lethalconfig"; } [HarmonyPatch(typeof(PlayerControllerB))] internal static class CameraPatches { private static readonly CameraSystem _system = new CameraSystem(); private static bool _wasActive; private static float _lastYawOffset; private static float _lastRollOffset; private static Vector3 _lastBodyPos; private static bool _hasLastBodyPos; private static float _vehicleSpeed; private static bool _hasVehicleSpeed; private static bool _wasClimbing; private static bool _wasInVehicle; private static bool _wasInSpecialInteract; private static bool _wasInTerminal; private static bool _wasInWater; private static bool _wasSubmerged; private const double VelocityScale = 0.05; private const float VehicleImpactDecel = 220f; private const float MaxDeltaTime = 0.05f; private const float MaxEffectPitch = 85f; private const float MaxEffectYaw = 60f; private const float MaxEffectRoll = 70f; internal static CameraSystem System => _system; [HarmonyPostfix] [HarmonyPatch("LateUpdate")] [HarmonyPriority(0)] private static void LateUpdatePostfix(PlayerControllerB __instance, float ___cameraUp) { //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_02da: Unknown result type (might be due to invalid IL or missing references) //IL_02dc: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_02f3: Unknown result type (might be due to invalid IL or missing references) //IL_02f5: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0312: Unknown result type (might be due to invalid IL or missing references) //IL_0344: Unknown result type (might be due to invalid IL or missing references) //IL_0349: Unknown result type (might be due to invalid IL or missing references) //IL_037a: Unknown result type (might be due to invalid IL or missing references) //IL_0388: Unknown result type (might be due to invalid IL or missing references) //IL_038f: Unknown result type (might be due to invalid IL or missing references) //IL_0397: Unknown result type (might be due to invalid IL or missing references) //IL_03a4: Unknown result type (might be due to invalid IL or missing references) //IL_03ac: Unknown result type (might be due to invalid IL or missing references) //IL_03b9: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_03cb: Unknown result type (might be due to invalid IL or missing references) //IL_03d7: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance?.localPlayerController) { return; } Camera gameplayCamera = __instance.gameplayCamera; CharacterController thisController = __instance.thisController; Transform thisPlayerBody = __instance.thisPlayerBody; if (ShouldSkipCameraUpdate(__instance, gameplayCamera, thisController, thisPlayerBody)) { DeactivateCameraState(gameplayCamera); return; } bool flag = !_wasActive; bool flag2 = IsInControlledCamera(__instance); bool flag3 = NeedsCameraRestore(flag, __instance); if (flag) { _system.Reset(); } Transform transform = ((Component)gameplayCamera).transform; if (flag3) { Vector3 localEulerAngles = transform.localEulerAngles; transform.localEulerAngles = new Vector3(localEulerAngles.x, localEulerAngles.y - _lastYawOffset, localEulerAngles.z - _lastRollOffset); _lastYawOffset = 0f; _lastRollOffset = 0f; } MarkCameraStateActive(__instance); Vector3 localEulerAngles2 = transform.localEulerAngles; float num = Mathf.Min(Time.deltaTime, 0.05f); Vector3 val = ReadVelocity(__instance, thisPlayerBody, thisController, flag2, num) * 0.05f; float num2 = Mathf.Clamp01(__instance.drunkness); if (!ConfigManager.Data.general.enableDrunknessEffect && num2 > 0f) { val = RemoveVanillaDrunkSpeedScaling(val, num2); num2 = 0f; } Vector3 val2 = thisPlayerBody.forward; val2.y = 0f; val2 = ((((Vector3)(ref val2)).sqrMagnitude > 1E-06f) ? ((Vector3)(ref val2)).normalized : Vector3.forward); Vector3 val3 = thisPlayerBody.right; val3.y = 0f; val3 = ((((Vector3)(ref val3)).sqrMagnitude > 1E-06f) ? ((Vector3)(ref val3)).normalized : Vector3.right); ShipMotionTracker.GetLocalShipShakePhases(__instance, out var takeoff, out var landing); bool isUnderwater = __instance.isUnderwater; int num3; if (isUnderwater && (Object)(object)__instance.underwaterCollider != (Object)null) { Bounds bounds = __instance.underwaterCollider.bounds; num3 = (((Bounds)(ref bounds)).Contains(transform.position) ? 1 : 0); } else { num3 = 0; } bool submerged = (byte)num3 != 0; TriggerWaterSplashes(isUnderwater, submerged); CameraContext context = new CameraContext { isSprinting = __instance.isSprinting, isCrouching = __instance.isCrouching, inVehicle = __instance.inVehicleAnimation, isClimbing = __instance.isClimbingLadder, isExhausted = __instance.isExhausted, isInspectingItem = __instance.IsInspectingItem, criticallyInjured = __instance.criticallyInjured, isUsingJetpack = __instance.jetpackControls, isBeingShocked = ShockTracker.BeingShocked, sprintMeter = __instance.sprintMeter, drunkness = num2, insanity = ((__instance.maxInsanityLevel > 0f) ? (__instance.insanityLevel / __instance.maxInsanityLevel) : 0f), poison = __instance.poison, sinkingValue = __instance.sinkingValue, shipTakeoffPhase = takeoff, shipLandingPhase = landing, inWater = isUnderwater, submerged = submerged, velocity = val, forwardRelVelocity = new Vector3(Vector3.Dot(val, val3), val.y, Vector3.Dot(val, val2)), pitch = ___cameraUp, yaw = thisPlayerBody.eulerAngles.y, resetSmoothing = flag3 }; _system.OnCameraUpdate(in context, num, __instance); Vector3 off = _system.OffsetEuler; if (__instance.inVehicleAnimation) { off.y = 0f; off.z = 0f; } else if (flag2) { off = Vector3.zero; } ClampEffectOffset(ref off, localEulerAngles2.x); transform.localEulerAngles = new Vector3(localEulerAngles2.x + off.x, localEulerAngles2.y - _lastYawOffset + off.y, localEulerAngles2.z - _lastRollOffset + off.z); _lastYawOffset = off.y; _lastRollOffset = off.z; VisorCompat.StickVisor(__instance.localVisor, __instance.localVisorTargetPoint, 1f); } private static bool ShouldSkipCameraUpdate(PlayerControllerB player, Camera? cam, CharacterController? controller, Transform? body) { if (!IsLookLocked(player) && !player.teleportedLastFrame && player.isPlayerControlled && !player.isPlayerDead && !((Object)(object)cam == (Object)null) && !((Object)(object)controller == (Object)null)) { return (Object)(object)body == (Object)null; } return true; } private static void DeactivateCameraState(Camera? cam) { if (_wasActive && (Object)(object)cam != (Object)null) { RestoreCamera(((Component)cam).transform); } _wasActive = false; _hasLastBodyPos = false; _hasVehicleSpeed = false; _wasInWater = false; _wasSubmerged = false; VehicleTracker.Reset(); ShockTracker.BeingShocked = false; } private static void TriggerWaterSplashes(bool inWater, bool submerged) { ConfigData.General general = ConfigManager.Data.general; if (general.enableWaterEffect && general.waterSplashStrength > 0.0) { if (inWater && !_wasInWater) { _system.AddWaterSplash(general.waterSplashStrength * 0.5); } if (submerged && !_wasSubmerged) { _system.AddWaterSplash(general.waterSplashStrength); } } _wasInWater = inWater; _wasSubmerged = submerged; } private static bool IsInControlledCamera(PlayerControllerB player) { if (!player.isClimbingLadder && !player.inVehicleAnimation && !player.inSpecialInteractAnimation) { return player.inTerminalMenu; } return true; } private static bool NeedsCameraRestore(bool justActivated, PlayerControllerB player) { if (!justActivated && _wasClimbing == player.isClimbingLadder && _wasInVehicle == player.inVehicleAnimation && _wasInSpecialInteract == player.inSpecialInteractAnimation) { return _wasInTerminal != player.inTerminalMenu; } return true; } private static void MarkCameraStateActive(PlayerControllerB player) { _wasActive = true; _wasClimbing = player.isClimbingLadder; _wasInVehicle = player.inVehicleAnimation; _wasInSpecialInteract = player.inSpecialInteractAnimation; _wasInTerminal = player.inTerminalMenu; } private static Vector3 ReadVelocity(PlayerControllerB p, Transform body, CharacterController controller, bool inControlledCamera, float dt) { //IL_016d: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) float num = Mathf.Max(dt, 0.0001f); if (p.inVehicleAnimation) { VehicleController val = VehicleTracker.ResolveActive(p); if ((Object)(object)val == (Object)null) { Vector3 result = (_hasLastBodyPos ? ((body.position - _lastBodyPos) / num) : Vector3.zero); _hasVehicleSpeed = false; _lastBodyPos = body.position; _hasLastBodyPos = true; return result; } Vector3 averageVelocity = val.averageVelocity; float magnitude; if (!((Object)(object)val.mainRigidbody != (Object)null)) { magnitude = ((Vector3)(ref averageVelocity)).magnitude; } else { Vector3 velocity = val.mainRigidbody.velocity; magnitude = ((Vector3)(ref velocity)).magnitude; } float num2 = magnitude; if (_hasVehicleSpeed) { float num3 = (_vehicleSpeed - num2) / num; if (num3 > 220f && _vehicleSpeed > 4f) { ConfigData.General general = ConfigManager.Data.general; float num4 = Mathf.Clamp01((num3 - 220f) / 250f); if (general.enableScreenShake && general.vehicleImpactTrauma > 0.0) { ScreenShakes.BumpTrauma((float)general.vehicleImpactTrauma * num4); } _system.AddDamageKick(new Vector3(3f * num4, 0f, 0f)); } } _vehicleSpeed = num2; _hasVehicleSpeed = true; _lastBodyPos = body.position; _hasLastBodyPos = true; return averageVelocity; } _hasLastBodyPos = false; _hasVehicleSpeed = false; VehicleTracker.ClearCachedActiveIf(p); if (!inControlledCamera) { return controller.velocity; } return Vector3.zero; } private static Vector3 RemoveVanillaDrunkSpeedScaling(Vector3 velocity, float drunkness) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null || instance.drunknessSpeedEffect == null) { return velocity; } float num = instance.drunknessSpeedEffect.Evaluate(drunkness) / 5f + 1f; num = Mathf.Max(num, 0.25f); return velocity / num; } [HarmonyPostfix] [HarmonyPatch("PlayerHitGroundEffects")] private static void PlayerHitGroundEffectsPostfix(PlayerControllerB __instance) { if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance?.localPlayerController) { return; } ConfigData.General general = ConfigManager.Data.general; float num = 0f - __instance.fallValue; if (!(num < 9f)) { float num2 = Mathf.Clamp01((num - 9f) / 16f); float num3 = Mathf.Max(1f, __instance.carryWeight); num2 *= 1f + (num3 - 1f) * (float)general.landingWeightInfluence; if (general.enableScreenShake && general.landingTrauma > 0.0) { ScreenShakes.BumpTrauma((float)general.landingTrauma * num2); } if (general.enableLandingDip) { _system.AddLandingImpulse(num2); } } } [HarmonyPostfix] [HarmonyPatch("DamagePlayer")] private static void DamagePlayerPostfix(PlayerControllerB __instance, int damageNumber, Vector3 force) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)StartOfRound.Instance?.localPlayerController || damageNumber <= 0) { return; } ConfigData.General general = ConfigManager.Data.general; if (general.enableScreenShake) { float num = Mathf.Clamp01((float)damageNumber / 50f); if (general.damageTrauma > 0.0) { ScreenShakes.BumpTrauma((float)general.damageTrauma * num); } Vector3 val = force; if (general.damageKick > 0.0 && ((Vector3)(ref val)).sqrMagnitude > 0.0001f) { Vector3 val2 = ((Component)__instance.gameplayCamera).transform.InverseTransformDirection(((Vector3)(ref val)).normalized); float num2 = (float)general.damageKick * num; _system.AddDamageKick(new Vector3(val2.z * num2, 0f, (0f - val2.x) * num2)); } } } private static void RestoreCamera(Transform camT) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) Vector3 localEulerAngles = camT.localEulerAngles; camT.localEulerAngles = new Vector3(localEulerAngles.x, localEulerAngles.y - _lastYawOffset, localEulerAngles.z - _lastRollOffset); _lastYawOffset = 0f; _lastRollOffset = 0f; } private static void ClampEffectOffset(ref Vector3 off, float basePitchEuler) { off.y = Mathf.Clamp(off.y, -60f, 60f); off.z = Mathf.Clamp(off.z, -70f, 70f); float num = NormalizeSignedAngle(basePitchEuler); if (num > 85f) { off.x = Mathf.Min(off.x, 0f); return; } if (num < -85f) { off.x = Mathf.Max(off.x, 0f); return; } float num2 = -85f - num; float num3 = 85f - num; off.x = Mathf.Clamp(off.x, num2, num3); } private static float NormalizeSignedAngle(float angle) { return Mathf.Repeat(angle + 180f, 360f) - 180f; } private static bool IsLookLocked(PlayerControllerB p) { if ((!((Object)(object)p.quickMenuManager != (Object)null) || !p.quickMenuManager.isMenuOpen) && !p.inSpecialMenu && !p.disableLookInput) { if ((Object)(object)StartOfRound.Instance != (Object)null) { return StartOfRound.Instance.newGameIsLoading; } return false; } return true; } } [HarmonyPatch(typeof(Landmine))] internal static class ExplosionShakePatch { private const float Radius = 20f; [HarmonyPostfix] [HarmonyPatch("SpawnExplosion")] private static void SpawnExplosionPostfix(Vector3 explosionPosition) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) ConfigData.General general = ConfigManager.Data.general; if (general.enableScreenShake && !(general.explosionTrauma <= 0.0)) { float num = ProximityFactor(explosionPosition, 20f); if (num > 0f) { ScreenShakes.AddTrauma((float)general.explosionTrauma * num); } } } internal static float ProximityFactor(Vector3 source, float radius) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) PlayerControllerB val = StartOfRound.Instance?.localPlayerController; if ((Object)(object)val == (Object)null) { return 0f; } float num = Vector3.Distance(((Component)val.gameplayCamera).transform.position, source); return 1f - Mathf.Clamp01(num / radius); } } [HarmonyPatch(typeof(StunGrenadeItem))] internal static class FlashbangShakePatch { private const float Radius = 30f; [HarmonyPostfix] [HarmonyPatch("StunExplosion")] private static void StunExplosionPostfix(Vector3 explosionPosition) { //IL_0025: Unknown result type (might be due to invalid IL or missing references) ConfigData.General general = ConfigManager.Data.general; if (general.enableScreenShake && !(general.flashbangTrauma <= 0.0)) { float num = ExplosionShakePatch.ProximityFactor(explosionPosition, 30f); if (num > 0f) { ScreenShakes.AddTrauma((float)general.flashbangTrauma * num); } } } } [HarmonyPatch(typeof(ShotgunItem))] internal static class ShotgunShakePatch { [HarmonyPostfix] [HarmonyPatch("ShootGun")] private static void ShootGunPostfix(ShotgunItem __instance) { if ((Object)(object)((GrabbableObject)__instance).playerHeldBy != (Object)(object)StartOfRound.Instance?.localPlayerController) { return; } ConfigData.General general = ConfigManager.Data.general; if (general.enableWeaponShake) { if (general.weaponShakeTrauma > 0.0) { ScreenShakes.BumpTrauma((float)general.weaponShakeTrauma); } if (general.weaponRecoilKick > 0.0) { CameraPatches.System.AddRecoil(general.weaponRecoilKick); } } } } [HarmonyPatch(typeof(Shovel))] internal static class ShovelShakePatch { [HarmonyPostfix] [HarmonyPatch("HitShovel")] private static void HitShovelPostfix(Shovel __instance) { MeleeShake.Apply(((GrabbableObject)__instance).playerHeldBy, __instance.objectsHitByShovelList); } } [HarmonyPatch(typeof(KnifeItem))] internal static class KnifeShakePatch { [HarmonyPostfix] [HarmonyPatch("HitKnife")] private static void HitKnifePostfix(KnifeItem __instance, List ___objectsHitByKnifeList) { MeleeShake.Apply(__instance.previousPlayerHeldBy, ___objectsHitByKnifeList); } } internal static class MeleeShake { private const int RoomLayer = 8; private const int CollidersLayer = 11; public static void Apply(PlayerControllerB? holder, List? hits) { if ((Object)(object)holder == (Object)null || (Object)(object)holder != (Object)(object)StartOfRound.Instance?.localPlayerController) { return; } ConfigData.General general = ConfigManager.Data.general; if (general.enableMeleeWeaponShake) { float num = (Connected(hits, holder) ? 1f : ((float)general.meleeWeaponMissMultiplier)); if (general.meleeWeaponShakeTrauma > 0.0) { ScreenShakes.BumpTrauma((float)general.meleeWeaponShakeTrauma * num); } if (general.meleeWeaponRecoilKick > 0.0) { CameraPatches.System.AddRecoil(general.meleeWeaponRecoilKick * (double)num); } } } private static bool Connected(List? hits, PlayerControllerB holder) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (hits == null) { return false; } IHittable val = default(IHittable); foreach (RaycastHit hit in hits) { RaycastHit current = hit; if ((Object)(object)((RaycastHit)(ref current)).collider == (Object)null) { continue; } int layer = ((Component)((RaycastHit)(ref current)).transform).gameObject.layer; if (layer == 8 || layer == 11) { if (!((RaycastHit)(ref current)).collider.isTrigger) { return true; } } else if (((Component)((RaycastHit)(ref current)).transform).TryGetComponent(ref val) && (Object)(object)((RaycastHit)(ref current)).transform != (Object)(object)((Component)holder).transform) { return true; } } return false; } } [HarmonyPatch(typeof(StartOfRound))] internal static class ShipMotionTracker { public static float LandingStartRealtime = -1f; private static Collider[] _catwalkColliders = Array.Empty(); private static Collider? _shipBoundsCollider; private static Transform? _hangarRoot; private static bool _cacheInitialized; private static float _nextCatwalkRefreshTime; private const float ShipTakeoffDuration = 15f; private const float ShipLandingDuration = 10f; private const float ShipCacheRefreshInterval = 8f; [HarmonyPostfix] [HarmonyPatch("Awake")] private static void AwakePostfix(StartOfRound __instance) { __instance.StartedLandingShip -= OnStartedLanding; __instance.StartedLandingShip += OnStartedLanding; LandingStartRealtime = -1f; _shipBoundsCollider = null; _hangarRoot = null; _catwalkColliders = Array.Empty(); _cacheInitialized = false; _nextCatwalkRefreshTime = 0f; WarmShipReferences(__instance); } [HarmonyPostfix] [HarmonyPatch("SceneManager_OnLoadComplete1")] private static void SceneManager_OnLoadComplete1Postfix(StartOfRound __instance) { WarmShipReferences(__instance); } private static void OnStartedLanding() { LandingStartRealtime = Time.realtimeSinceStartup; } internal static void GetLocalShipShakePhases(PlayerControllerB player, out float takeoff, out float landing) { takeoff = -1f; landing = -1f; if (!ConfigManager.Data.general.enableScreenShake) { return; } StartOfRound instance = StartOfRound.Instance; if ((Object)(object)instance == (Object)null) { return; } bool shipIsLeaving = instance.shipIsLeaving; bool flag = LandingStartRealtime >= 0f; if ((shipIsLeaving || flag) && IsPlayerOnShipOrCatwalk(player, instance)) { float realtimeSinceStartup = Time.realtimeSinceStartup; if (shipIsLeaving) { takeoff = TakeoffPhase(realtimeSinceStartup, instance); } if (flag) { landing = LandingPhase(realtimeSinceStartup); } } } private static float TakeoffPhase(float now, StartOfRound so) { float num = now - so.timeWhenShipStartedLeaving; if (!(num >= 0f) || !(num <= 15f)) { return -1f; } return num / 15f; } private static float LandingPhase(float now) { float num = now - LandingStartRealtime; if (num >= 0f && num <= 10f) { return num / 10f; } if (num > 10f) { LandingStartRealtime = -1f; } return -1f; } private static bool IsPlayerOnShipOrCatwalk(PlayerControllerB player, StartOfRound so) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Unknown result type (might be due to invalid IL or missing references) if (player.isInHangarShipRoom) { return true; } EnsureShipReferences(so); Vector3 val = ((Component)player).transform.position + Vector3.up * 0.25f; if ((Object)(object)_shipBoundsCollider != (Object)null) { Bounds bounds = _shipBoundsCollider.bounds; if (((Bounds)(ref bounds)).Contains(val)) { return true; } } for (int i = 0; i < _catwalkColliders.Length; i++) { Collider val2 = _catwalkColliders[i]; if (!((Object)(object)val2 == (Object)null)) { Bounds bounds2 = val2.bounds; ((Bounds)(ref bounds2)).Expand(new Vector3(0.2f, 0.7f, 0.2f)); if (((Bounds)(ref bounds2)).Contains(val)) { return true; } } } return false; } private static void WarmShipReferences(StartOfRound so) { _nextCatwalkRefreshTime = Time.realtimeSinceStartup + 8f; RebuildShipReferences(so); } private static void EnsureShipReferences(StartOfRound so) { float realtimeSinceStartup = Time.realtimeSinceStartup; if (!_cacheInitialized || !(realtimeSinceStartup < _nextCatwalkRefreshTime)) { _nextCatwalkRefreshTime = realtimeSinceStartup + 8f; RebuildShipReferences(so); } } private static void RebuildShipReferences(StartOfRound so) { _shipBoundsCollider = so.shipBounds; _hangarRoot = (Transform?)(((Object)(object)_shipBoundsCollider != (Object)null) ? ((object)((Component)_shipBoundsCollider).transform.root) : ((object)FindHangarRoot())); if ((Object)(object)_hangarRoot == (Object)null) { _catwalkColliders = Array.Empty(); _cacheInitialized = true; return; } Collider[] componentsInChildren = ((Component)_hangarRoot).GetComponentsInChildren(true); Collider[] array = (Collider[])(object)new Collider[componentsInChildren.Length]; int num = 0; foreach (Collider val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !val.isTrigger && HasCatwalkInHierarchy(((Component)val).transform, _hangarRoot)) { array[num++] = val; } } if (num == 0) { _catwalkColliders = Array.Empty(); _cacheInitialized = true; } else { _catwalkColliders = (Collider[])(object)new Collider[num]; Array.Copy(array, _catwalkColliders, num); _cacheInitialized = true; } } private static Transform? FindHangarRoot() { GameObject obj = GameObject.Find("HangarShip"); object obj2 = ((obj != null) ? obj.transform : null); if (obj2 == null) { GameObject obj3 = GameObject.Find("Environment/HangarShip"); obj2 = ((obj3 != null) ? obj3.transform : null); if (obj2 == null) { GameObject obj4 = GameObject.Find("/Environment/HangarShip"); if (obj4 == null) { return null; } obj2 = obj4.transform; } } return (Transform?)obj2; } private static bool HasCatwalkInHierarchy(Transform t, Transform hangarRoot) { Transform val = t; while ((Object)(object)val != (Object)null) { if (((Object)val).name.IndexOf("catwalk", StringComparison.OrdinalIgnoreCase) >= 0) { return true; } if ((Object)(object)val == (Object)(object)hangarRoot) { break; } val = val.parent; } return false; } } internal static class ShockTracker { public static bool BeingShocked; internal static MethodBase ResolveInterfaceMethod(string name) { InterfaceMapping interfaceMap = typeof(PlayerControllerB).GetInterfaceMap(typeof(IShockableWithGun)); for (int i = 0; i < interfaceMap.InterfaceMethods.Length; i++) { if (interfaceMap.InterfaceMethods[i].Name == name) { return interfaceMap.TargetMethods[i]; } } throw new MissingMethodException("PlayerControllerB.IShockableWithGun." + name + " not found"); } } [HarmonyPatch] internal static class ShockStartPatch { private static MethodBase TargetMethod() { return ShockTracker.ResolveInterfaceMethod("ShockWithGun"); } [HarmonyPostfix] private static void Postfix(PlayerControllerB __instance) { if ((Object)(object)__instance == (Object)(object)StartOfRound.Instance?.localPlayerController) { ShockTracker.BeingShocked = true; } } } [HarmonyPatch] internal static class ShockStopPatch { private static MethodBase TargetMethod() { return ShockTracker.ResolveInterfaceMethod("StopShockingWithGun"); } [HarmonyPostfix] private static void Postfix(PlayerControllerB __instance) { if ((Object)(object)__instance == (Object)(object)StartOfRound.Instance?.localPlayerController) { ShockTracker.BeingShocked = false; } } } [HarmonyPatch(typeof(VehicleController))] internal static class VehicleTracker { private static VehicleController? _active; [HarmonyPostfix] [HarmonyPatch("Update")] private static void UpdatePostfix(VehicleController __instance) { PlayerControllerB localPlayer = StartOfRound.Instance?.localPlayerController; if (IsPlayerInVehicle(localPlayer, __instance)) { _active = __instance; } else if ((Object)(object)_active == (Object)(object)__instance) { _active = null; } } public static VehicleController? ResolveActive(PlayerControllerB? localPlayer) { if (!IsPlayerInVehicle(localPlayer, _active)) { return null; } return _active; } public static void ClearCachedActiveIf(PlayerControllerB? localPlayer) { if (!IsPlayerInVehicle(localPlayer, _active)) { _active = null; } } public static void Reset() { _active = null; } private static bool IsPlayerInVehicle(PlayerControllerB? localPlayer, VehicleController? vehicle) { if ((Object)(object)localPlayer == (Object)null || (Object)(object)vehicle == (Object)null) { return false; } if (!((Object)(object)vehicle.currentDriver == (Object)(object)localPlayer) && !((Object)(object)vehicle.currentPassenger == (Object)(object)localPlayer) && !vehicle.localPlayerInControl) { return vehicle.localPlayerInPassengerSeat; } return true; } } [BepInPlugin("com.seeya.cameraoverhaul", "Camera Overhaul", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BaseUnityPlugin { private readonly Harmony _harmony = new Harmony("com.seeya.cameraoverhaul"); public static Plugin Instance { get; private set; } public static ManualLogSource Log { get; private set; } private void Awake() { Instance = this; Log = ((BaseUnityPlugin)this).Logger; Log.LogInfo((object)"Initializing Camera Overhaul"); ConfigManager.Initialize(((BaseUnityPlugin)this).Config); _harmony.PatchAll(); Log.LogInfo((object)"Camera Overhaul is loaded!"); } } internal static class ScreenShakes { private const float TraumaCeiling = 3f; private const float MaxShakeAngle = 25f; private const NoiseKind ShakeNoise = NoiseKind.FrequencyMod; private static float _trauma; private static Vector3 _euler; public static Vector3 EulerOffset => _euler; public static void AddTrauma(float amount) { if (amount > 0f) { _trauma = Mathf.Min(_trauma + amount, 3f); } } public static void BumpTrauma(float level) { if (level > 0f && level > _trauma) { _trauma = Mathf.Min(level, 3f); } } public static void Reset() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) _trauma = 0f; _euler = Vector3.zero; } public static void OnCameraUpdate(double dt) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) ConfigData.General general = ConfigManager.Data.general; _trauma = Mathf.Max(0f, _trauma - (float)(general.screenShakeDecay * dt)); if (!general.enableScreenShake || _trauma <= 0f) { _euler = Vector3.zero; return; } float num = _trauma * _trauma; double x = Time.timeAsDouble * general.screenShakesMaxFrequency; float num2 = num * (float)general.screenShakesMaxIntensity; _euler = new Vector3(Mathf.Clamp((float)Noise.Sample(NoiseKind.FrequencyMod, x, -69.0) * num2, -25f, 25f), Mathf.Clamp((float)Noise.Sample(NoiseKind.FrequencyMod, x, -420.0) * num2, -25f, 25f), Mathf.Clamp((float)Noise.Sample(NoiseKind.FrequencyMod, x, -1337.0) * num2, -25f, 25f)); } } internal static class MathUtils { public static double Clamp(double value, double min, double max) { if (!(value < min)) { if (!(value > max)) { return value; } return max; } return min; } public static double Clamp01(double value) { if (!(value < 0.0)) { if (!(value > 1.0)) { return value; } return 1.0; } return 0.0; } public static double Lerp(double a, double b, double time) { return a + (b - a) * Clamp01(time); } public static double Damp(double source, double destination, double smoothing, double dt) { return Lerp(source, destination, DampStep(smoothing, dt)); } public static double DampStep(double smoothing, double dt) { return 1.0 - Math.Pow(smoothing * smoothing, dt); } public static double StepTowards(double current, double target, double step) { if (current < target) { return Math.Min(current + step, target); } if (current > target) { return Math.Max(current - step, target); } return current; } public static double UnwrapStep(double d) { d %= 360.0; if (d <= -180.0) { d += 360.0; } else if (d > 180.0) { d -= 360.0; } return d; } } internal enum NoiseKind { Simplex, OpenSimplex2, Perlin, PerlinWorley, Fractal, FrequencyMod } internal static class Noise { private static readonly int[,] Grad = new int[8, 2] { { 1, 1 }, { -1, 1 }, { 1, -1 }, { -1, -1 }, { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 } }; private static readonly int[] Perm = BuildPerm(); public static double Sample(NoiseKind kind, double x, double seed) { return kind switch { NoiseKind.Perlin => Perlin((float)x, (float)seed), NoiseKind.PerlinWorley => PerlinWorley((float)x, (float)seed), NoiseKind.Fractal => Fractal((float)x, (float)seed), NoiseKind.OpenSimplex2 => OpenSimplex2((float)x, (float)seed), NoiseKind.FrequencyMod => FrequencyMod((float)x, (float)seed), _ => Simplex((float)x, (float)seed), }; } private static double Perlin(float x, float seed) { float num = Mathf.PerlinNoise(x + 0.137f, seed + 0.613f); return (double)num * 2.0 - 1.0; } private static float Fractal(float x, float y) { float num = 0f; float num2 = 0.5f; float num3 = 1f; float num4 = 0f; for (int i = 0; i < 3; i++) { num += num2 * Simplex(x * num3, y * num3); num4 += num2; num2 *= 0.5f; num3 *= 2f; } return num / num4; } private static double PerlinWorley(float x, float seed) { double num = Perlin(x, seed); double num2 = Worley1D(x * 0.5f, seed) * 2.0 - 1.0; return num * (0.5 + 0.5 * num2); } private static double Worley1D(float x, float seed) { int num = Mathf.FloorToInt(x); float num2 = x - (float)num; double num3 = Mathf.Abs(num2 - Hash01(num, seed)); double num4 = Mathf.Abs(num2 - 1f - Hash01(num + 1, seed)); double num5 = Mathf.Abs(num2 + 1f - Hash01(num - 1, seed)); double num6 = Mathf.Min((float)num3, Mathf.Min((float)num4, (float)num5)); return 1.0 - (double)Mathf.Min((float)num6 * 2f, 1f); } private static float Hash01(int i, float seed) { int num = i ^ (int)(seed * 8192f); num = (num << 13) ^ num; num = num * (num * num * 15731 + 789221) + 1376312589; return (float)(num & 0x7FFFFFFF) / 2.1474836E+09f; } private static double FrequencyMod(float x, float seed) { double num = Math.Sin(x + seed); return Math.Sin(num * 3.700000047683716 + (double)x * 0.5); } private static int[] BuildPerm() { int[] array = new int[256] { 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 }; int[] array2 = new int[512]; for (int i = 0; i < 512; i++) { array2[i] = array[i & 0xFF]; } return array2; } private static float Simplex(float xin, float yin) { float num = (xin + yin) * 0.3660254f; int num2 = FastFloor(xin + num); int num3 = FastFloor(yin + num); float num4 = (float)(num2 + num3) * 0.21132487f; float num5 = xin - ((float)num2 - num4); float num6 = yin - ((float)num3 - num4); int num7 = ((num5 > num6) ? 1 : 0); int num8 = ((!(num5 > num6)) ? 1 : 0); float x = num5 - (float)num7 + 0.21132487f; float y = num6 - (float)num8 + 0.21132487f; float x2 = num5 - 1f + 0.42264974f; float y2 = num6 - 1f + 0.42264974f; int num9 = num2 & 0xFF; int num10 = num3 & 0xFF; int gi = Perm[num9 + Perm[num10]] % 8; int gi2 = Perm[num9 + num7 + Perm[num10 + num8]] % 8; int gi3 = Perm[num9 + 1 + Perm[num10 + 1]] % 8; return 70f * (Corner(num5, num6, gi) + Corner(x, y, gi2) + Corner(x2, y2, gi3)); } private static float Corner(float x, float y, int gi) { float num = 0.5f - x * x - y * y; if (num < 0f) { return 0f; } num *= num; return num * num * ((float)Grad[gi, 0] * x + (float)Grad[gi, 1] * y); } private static double OpenSimplex2(float x, float seed) { float num = (x + seed) * 0.57735026f; float num2 = seed * 0.57735026f; return Simplex(num * 1.4f, num2 * 1.4f + 17.3f); } private static int FastFloor(float v) { int num = (int)v; if (!(v < (float)num)) { return num; } return num - 1; } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.seeya.cameraoverhaul"; public const string PLUGIN_NAME = "Camera Overhaul"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }