using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("SneakCameraAndCollision")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("SneakCameraAndCollision")]
[assembly: AssemblyCopyright("Copyright © 2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("c2a11acf-fe71-4f51-a922-504d7b45a13b")]
[assembly: AssemblyFileVersion("1.0.2.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.2.0")]
[module: UnverifiableCode]
namespace SneakCameraAndCollision;
[HarmonyPatch]
internal class CameraPatches
{
[HarmonyPatch(typeof(GameCamera), "GetCameraBaseOffset")]
[HarmonyPostfix]
private static void GetCameraBaseOffset(Player player, ref Vector3 __result)
{
//IL_002e: 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_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)player != (Object)(object)Player.m_localPlayer) && SneakConfig.LowerCameraWhen.Value != 0 && !(__result != ((Component)((Character)player).m_eye).transform.position - ((Component)player).transform.position) && ((Character)player).IsCrouching() && ((Character)player).IsOnGround())
{
bool flag = ((Character)player).IsSneaking();
if (SneakConfig.LowerCameraWhen.Value == SneakConfig.CrouchPosition.Crouching || (SneakConfig.LowerCameraWhen.Value == SneakConfig.CrouchPosition.CrouchWalking && flag) || (SneakConfig.LowerCameraWhen.Value == SneakConfig.CrouchPosition.CrouchStanding && !flag))
{
__result += Vector3.up * (0f - Mathf.Clamp(SneakConfig.CameraHeightReduction.Value, 0f, 1f));
}
}
}
}
[HarmonyPatch]
internal class CollisionPatches
{
private static float? standingSize;
private static float? crouchedSize;
[HarmonyPatch(typeof(Player), "FixedUpdate")]
[HarmonyPostfix]
private static void FixedUpdate(Player __instance)
{
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || !SneakConfig.ChangeCollisionCrouchHeight.Value)
{
return;
}
CapsuleCollider collider = ((Character)__instance).GetCollider();
if (Object.op_Implicit((Object)(object)collider))
{
if (!standingSize.HasValue)
{
standingSize = collider.height;
CalculateCrouchedSize();
}
bool flag = ((Character)__instance).IsCrouching() && ((Character)__instance).IsOnGround();
collider.height = (flag ? crouchedSize.Value : standingSize.Value);
collider.center = new Vector3(0f, collider.height / 2f, 0f);
}
}
internal static void CalculateCrouchedSize()
{
if (standingSize.HasValue && SneakConfig.CrouchHeightMultiplier != null)
{
crouchedSize = standingSize.Value * Mathf.Clamp(SneakConfig.CrouchHeightMultiplier.Value, 0.75f, 1f);
}
}
}
internal sealed class ConfigurationManagerAttributes
{
public bool? ShowRangeAsPercent;
public Action<ConfigEntryBase> CustomDrawer;
public bool? Browsable;
public string Category;
public object DefaultValue;
public bool? HideDefaultButton;
public bool? HideSettingName;
public string Description;
public string DispName;
public int? Order;
public bool? ReadOnly;
public bool? IsAdvanced;
public Func<object, string> ObjToStr;
public Func<string, object> StrToObj;
internal static ConfigDescription ShowAsPercentOverride<T>(bool showRangeAsPercent, AcceptableValueRange<T> acceptableValues, string description = "") where T : IComparable
{
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
return new ConfigDescription(description, (AcceptableValueBase)(object)acceptableValues, new object[1]
{
new ConfigurationManagerAttributes
{
ShowRangeAsPercent = showRangeAsPercent
}
});
}
}
[BepInPlugin("goldenrevolver.SneakCameraAndCollision", "Sneak Camera and Collision Height", "1.0.2")]
public class SneakCameraAndCollisionPlugin : BaseUnityPlugin
{
public const string GUID = "goldenrevolver.SneakCameraAndCollision";
public const string NAME = "Sneak Camera and Collision Height";
public const string VERSION = "1.0.2";
protected void Awake()
{
LoadConfig();
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
}
private void LoadConfig()
{
string text = "Camera Height";
SneakConfig.LowerCameraWhen = ((BaseUnityPlugin)this).Config.Bind<SneakConfig.CrouchPosition>(text, "LowerCameraWhen", SneakConfig.CrouchPosition.Crouching, "When to lower the camera height (crouching means both standing and moving)");
SneakConfig.CameraHeightReduction = ((BaseUnityPlugin)this).Config.Bind<float>(text, "CameraHeightReduction", 0.5f, ConfigurationManagerAttributes.ShowAsPercentOverride<float>(showRangeAsPercent: false, new AcceptableValueRange<float>(0f, 1f), "By how much to lower the camera (in meters)"));
text = "Collision Height";
SneakConfig.ChangeCollisionCrouchHeight = ((BaseUnityPlugin)this).Config.Bind<bool>(text, "ChangeCollisionCrouchHeight", true, "Whether to change the player collision height at all");
SneakConfig.CrouchHeightMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>(text, "CrouchHeightMultiplier", 0.8f, ConfigurationManagerAttributes.ShowAsPercentOverride<float>(showRangeAsPercent: false, new AcceptableValueRange<float>(0.75f, 1f), "By how many percent to reduce the default standing player height (which by default is 1.85 meters)"));
SneakConfig.CrouchHeightMultiplier.SettingChanged += delegate
{
CollisionPatches.CalculateCrouchedSize();
};
}
}
internal class SneakConfig
{
public enum CrouchPosition
{
Disabled,
Crouching,
CrouchStanding,
CrouchWalking
}
public static ConfigEntry<CrouchPosition> LowerCameraWhen;
public static ConfigEntry<float> CameraHeightReduction;
internal const float CameraMin = 0f;
internal const float CameraMax = 1f;
public static ConfigEntry<bool> ChangeCollisionCrouchHeight;
public static ConfigEntry<float> CrouchHeightMultiplier;
internal const float HeightMultMin = 0.75f;
internal const float HeightMultMax = 1f;
}