using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using FistVR;
using HLin_Mods.SharedBubble;
using HarmonyLib;
using OtherLoader;
using UnityEngine;
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.0.0")]
[module: UnverifiableCode]
namespace HLin_Mods.NightForcePlus
{
[BepInPlugin("HLin_Mods.NightForcePlus", "NightForcePlus", "1.0.5")]
[BepInProcess("h3vr.exe")]
[Description("Built with MeatKit")]
[BepInDependency("h3vr.otherloader", "1.3.0")]
public class NightForcePlusPlugin : BaseUnityPlugin
{
private static readonly string BasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
internal static ManualLogSource Logger;
private void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
LoadAssets();
}
private void LoadAssets()
{
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "HLin_Mods.NightForcePlus");
OtherLoader.RegisterDirectLoad(BasePath, "HLin_Mods.NightForcePlus", "", "", "hlin-nightforceplus", "");
}
}
public class BubbleLevel : MonoBehaviour
{
[Header("FVRAttachment")]
public GameObject baseObject = null;
[Header("FVRAttachment")]
public FVRFireArmAttachment attachment = null;
[Header("LevelBubble")]
public GameObject level_bubble = null;
private void Start()
{
}
private void Update()
{
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: 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_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
float num = ((!((Object)(object)attachment != (Object)null) || !((Object)(object)attachment.curMount != (Object)null)) ? baseObject.transform.eulerAngles.z : ((Component)attachment.curMount.GetRootMount()).transform.eulerAngles.z);
if (180f < num && num < 360f)
{
num -= 360f;
}
Vector3 localPosition = level_bubble.transform.localPosition;
localPosition.x = Mathf.Clamp(-0.0084f + num / 8f, -0.33f, 0.33f);
level_bubble.transform.localPosition = localPosition;
}
}
}
namespace HLin_Mods.SharedBubble
{
public static class GravityBubbleLevelMotion
{
public struct State
{
public float BubbleVelocity;
public Transform BubbleTransform;
public Transform MovementSpace;
public Vector3 CachedGravity;
public Vector3 CachedGravityDirection;
public float CachedFullScaleAngle;
public float CachedFullScaleGravity;
public bool HasCachedGravityDirection;
public bool HasCachedFullScaleGravity;
public bool Initialized;
}
public static bool Initialize(GameObject baseObject, GameObject levelBubble, ref State state)
{
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)baseObject == (Object)null || (Object)(object)levelBubble == (Object)null)
{
return false;
}
state.BubbleTransform = levelBubble.transform;
state.MovementSpace = ((!((Object)(object)state.BubbleTransform.parent != (Object)null)) ? baseObject.transform : state.BubbleTransform.parent);
RefreshGravityDirection(Physics.gravity, ref state);
state.Initialized = (Object)(object)state.MovementSpace != (Object)null;
return state.Initialized;
}
public static bool Step(GameObject baseObject, GameObject levelBubble, float centerLocalX, float minimumLocalX, float maximumLocalX, float fullScaleAngleDegrees, float restoringAcceleration, float fluidDrag, float staticFrictionDistance, float settleVelocity, float maximumVelocity, ref State state)
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: 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_0065: 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_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
//IL_0203: Unknown result type (might be due to invalid IL or missing references)
if ((!state.Initialized || (Object)(object)state.BubbleTransform == (Object)null || (Object)(object)state.MovementSpace == (Object)null) && !Initialize(baseObject, levelBubble, ref state))
{
return false;
}
Vector3 gravity = Physics.gravity;
if (state.HasCachedGravityDirection)
{
Vector3 val = gravity - state.CachedGravity;
if (!(((Vector3)(ref val)).sqrMagnitude > 1E-06f))
{
goto IL_007f;
}
}
RefreshGravityDirection(gravity, ref state);
goto IL_007f;
IL_007f:
Vector3 right = state.MovementSpace.right;
if (!state.HasCachedGravityDirection || ((Vector3)(ref right)).sqrMagnitude < 1E-06f)
{
return true;
}
float gravityAlongTravel = Mathf.Clamp(Vector3.Dot(state.CachedGravityDirection, right), -1f, 1f);
float gravityTarget = GetGravityTarget(GetFullScaleTravel(gravityAlongTravel, fullScaleAngleDegrees, ref state), centerLocalX, minimumLocalX, maximumLocalX);
Vector3 localPosition = state.BubbleTransform.localPosition;
float num = gravityTarget - localPosition.x;
if (Mathf.Abs(num) <= staticFrictionDistance && Mathf.Abs(state.BubbleVelocity) <= settleVelocity)
{
localPosition.x = gravityTarget;
state.BubbleVelocity = 0f;
}
else
{
float num2 = restoringAcceleration * num - fluidDrag * state.BubbleVelocity;
state.BubbleVelocity = Mathf.Clamp(state.BubbleVelocity + num2 * Time.fixedDeltaTime, 0f - maximumVelocity, maximumVelocity);
float num3 = localPosition.x + state.BubbleVelocity * Time.fixedDeltaTime;
if (num3 <= minimumLocalX)
{
localPosition.x = minimumLocalX;
if (state.BubbleVelocity < 0f)
{
state.BubbleVelocity = 0f;
}
}
else if (num3 >= maximumLocalX)
{
localPosition.x = maximumLocalX;
if (state.BubbleVelocity > 0f)
{
state.BubbleVelocity = 0f;
}
}
else
{
localPosition.x = num3;
}
}
state.BubbleTransform.localPosition = localPosition;
return true;
}
private static void RefreshGravityDirection(Vector3 gravity, ref State state)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003b: 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)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
state.CachedGravity = gravity;
float sqrMagnitude = ((Vector3)(ref gravity)).sqrMagnitude;
if (sqrMagnitude < 1E-06f)
{
state.CachedGravityDirection = Vector3.zero;
state.HasCachedGravityDirection = false;
}
else
{
state.CachedGravityDirection = gravity / Mathf.Sqrt(sqrMagnitude);
state.HasCachedGravityDirection = true;
}
}
private static float GetGravityTarget(float gravityAlongTravel, float centerLocalX, float minimumLocalX, float maximumLocalX)
{
if (gravityAlongTravel >= 0f)
{
return centerLocalX - gravityAlongTravel * (centerLocalX - minimumLocalX);
}
return centerLocalX - gravityAlongTravel * (maximumLocalX - centerLocalX);
}
private static float GetFullScaleTravel(float gravityAlongTravel, float fullScaleAngleDegrees, ref State state)
{
float num = Mathf.Clamp(fullScaleAngleDegrees, 1f, 45f);
if (!state.HasCachedFullScaleGravity || Mathf.Abs(state.CachedFullScaleAngle - num) > 0.0001f)
{
state.CachedFullScaleAngle = num;
state.CachedFullScaleGravity = Mathf.Sin(num * ((float)Math.PI / 180f));
state.HasCachedFullScaleGravity = true;
}
return Mathf.Clamp(gravityAlongTravel / state.CachedFullScaleGravity, -1f, 1f);
}
}
}
namespace HLin_Mods.BubbleLevelScope
{
public class BubbleLevelScope : MonoBehaviour
{
private const float ScopeCenterLocalX = -0.0084f;
private const float ScopeMinimumLocalX = -0.33f;
private const float ScopeMaximumLocalX = 0.33f;
private const float ScopeFullScaleAngleDegrees = 2.64f;
private const float ScopeRestoringAcceleration = 60f;
private const float ScopeFluidDrag = 15f;
private const float ScopeStaticFrictionDistance = 5E-05f;
private const float ScopeSettleVelocity = 0.0005f;
private const float ScopeMaximumVelocity = 1.2f;
[Header("BaseObject")]
public GameObject baseObject = null;
[Header("FVRAttachment")]
public FVRFireArmAttachment attachment = null;
[Header("LevelBubble")]
public GameObject level_bubble = null;
private GravityBubbleLevelMotion.State motionState;
private void Awake()
{
if (!GravityBubbleLevelMotion.Initialize(baseObject, level_bubble, ref motionState))
{
Debug.LogWarning((object)"BubbleLevelScope disabled because its base object or bubble reference is missing.", (Object)(object)this);
((Behaviour)this).enabled = false;
}
}
private void FixedUpdate()
{
if (!GravityBubbleLevelMotion.Step(baseObject, level_bubble, -0.0084f, -0.33f, 0.33f, 2.64f, 60f, 15f, 5E-05f, 0.0005f, 1.2f, ref motionState))
{
((Behaviour)this).enabled = false;
}
}
}
}