using System;
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.Configuration;
using BepInEx.Logging;
using ComputerysModdingUtilities;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: StraftatMod(true)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("SourceSensitivity")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.1.0.0")]
[assembly: AssemblyInformationalVersion("1.1.0+f1cd8a09eb71a2aa62afbb3ea694a60cdd19cacd")]
[assembly: AssemblyProduct("Source Sensitivity")]
[assembly: AssemblyTitle("SourceSensitivity")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.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.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace SourceSensitivity
{
[BepInPlugin("SourceSensitivity", "Source Sensitivity", "1.1.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public enum FovScalingMode
{
Trigonometric,
Linear,
None
}
[HarmonyPatch]
private class Patches
{
[HarmonyPrefix]
[HarmonyPatch(typeof(FirstPersonController))]
[HarmonyPatch("HandleMouseLook")]
private static bool HandleLook(FirstPersonController __instance, ref Vector2 ___mouseInput, float ___rotationZ, float ___upperLookLimit, float ___lowerLookLimit)
{
//IL_0129: 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_016d: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
Camera playerCamera = __instance.playerCamera;
Transform transform = ((Component)__instance).transform;
float num = (__instance.pauseManager.gamepad ? gamepad_multiplier.Value : 1f);
float defaultFOV = __instance.defaultFOV;
float fieldOfView = playerCamera.fieldOfView;
float num2 = fov_scaling_mode.Value switch
{
FovScalingMode.Trigonometric => Mathf.Tan(fieldOfView * (MathF.PI / 180f) / 2f) / Mathf.Tan(defaultFOV * (MathF.PI / 180f) / 2f),
FovScalingMode.Linear => fieldOfView / defaultFOV,
FovScalingMode.None => 1f,
_ => throw new ArgumentOutOfRangeException("FovScalingMode", fov_scaling_mode.Value, "invalid FoV scaling mode"),
};
float num3 = sensitivity.Value * num2 * num;
__instance.rotationX -= num3 * m_pitch.Value * ___mouseInput.y * (__instance.invertY ? (-1f) : 1f);
__instance.rotationX = Mathf.Clamp(__instance.rotationX, 0f - ___upperLookLimit, ___lowerLookLimit);
__instance.playerCameraHolder.transform.localRotation = Quaternion.Euler(__instance.rotationX, 0f, ___rotationZ);
transform.rotation *= Quaternion.Euler(0f, num3 * m_yaw.Value * ___mouseInput.x * (__instance.invertX ? (-1f) : 1f), 0f);
return false;
}
}
internal static ManualLogSource Logger;
public static ConfigEntry<float> sensitivity;
public static ConfigEntry<float> m_pitch;
public static ConfigEntry<float> m_yaw;
public static ConfigEntry<float> gamepad_multiplier;
public static ConfigEntry<FovScalingMode> fov_scaling_mode;
public static ConfigEntry<float> zoom_sensitivity_ratio;
private void Awake()
{
//IL_0010: Unknown result type (might be due to invalid IL or missing references)
Logger = ((BaseUnityPlugin)this).Logger;
new Harmony("SourceSensitivity").PatchAll();
BuildConfig();
Logger.LogInfo((object)"Plugin SourceSensitivity is loaded!");
}
private void BuildConfig()
{
sensitivity = ((BaseUnityPlugin)this).Config.Bind<float>("Source Sensitivity", "Sensitivity", 3f, "`sensitivity` in Source games");
m_pitch = ((BaseUnityPlugin)this).Config.Bind<float>("Source Sensitivity", "Pitch multiplier", 0.022f, "`m_pitch` in Source games\nPrecision is not actually capped to 2 decimals, you can confirm that in the config file :)");
m_yaw = ((BaseUnityPlugin)this).Config.Bind<float>("Source Sensitivity", "Yaw multiplier", 0.022f, "`m_yaw` in Source games\nSee 'Pitch multiplier's description");
gamepad_multiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Source Sensitivity", "Gamepad multiplier", 14f, "This is in the base game so why not");
fov_scaling_mode = ((BaseUnityPlugin)this).Config.Bind<FovScalingMode>("Source Sensitivity", "FoV scaling mode", FovScalingMode.Trigonometric, "Field of View sensitivity scaling mode.\nTrigonometric: Accurate scaling, equivalent to using a pre-calculated `zoom_sensitivity_ratio` in Source games, but works for all FoV values. This is recommended.\nLinear: Linear scaling, equivalent to using `zoom_sensitivity_ratio 1` in Source Games.\nNone: Disabled. Same mouse movement will always result in the same angular change.");
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "SourceSensitivity";
public const string PLUGIN_NAME = "Source Sensitivity";
public const string PLUGIN_VERSION = "1.1.0";
}
}