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.Unity.IL2CPP; using Bossa.Cinematika; using Bossa.Cinematika.Controllers; using Bossa.Dynamika.Character; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.InputSystem; using WildSkies.Input; using WildSkies.Player; using WildSkies.ShipParts; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("kruft")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Saves the 3rd-person toggle state and allows the camera to zoom, wrap around, and lock in place.")] [assembly: AssemblyFileVersion("0.3.0.0")] [assembly: AssemblyInformationalVersion("0.3.0+81c388268d416e809ea4a81f49fd4aeb73964ea6")] [assembly: AssemblyProduct("ShipCam Pro")] [assembly: AssemblyTitle("kruft.ShipCamPro")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/kruftt/LostSkiesMods/tree/main/ShipCamPro")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.3.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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 ShipCamPro { internal class ShipCamProPatch { private const float SCROLL_SENSITIVITY = 0.1f; private const float MIN_ZOOM_DISTANCE = 2f; private static bool _isOnTurret = false; private static bool _isLooking = false; private static bool _hasTurned = false; private static bool _releaseCamera = false; private static bool _thirdPerson = false; private static float _zoom = 5f; private static float _angleX = 0f; private static float _angleY = 0f; private static Vector3 OFFSET_BASE = new Vector3(0f, 0f, -1f); private static Vector3 _thirdPersonOffset => OFFSET_BASE * _zoom; [HarmonyPostfix] [HarmonyPatch(typeof(LocalPlayer), "DropInteraction")] private static void ResetRemoteAiming(LocalPlayer __instance) { _isOnTurret = false; UserControlShip userControlShip = __instance._userControlShip; userControlShip._isRemoteAiming = false; ShipWeapon currentRemoteWeapon = userControlShip._currentRemoteWeapon; if ((Object)(object)currentRemoteWeapon != (Object)null) { currentRemoteWeapon.SetPilot((DynamikaCharacter)null); } } [HarmonyPrefix] [HarmonyPatch(typeof(LocalPlayer), "PilotTurret")] private static void IsOnTurret(LocalPlayer __instance) { _isOnTurret = true; } [HarmonyPostfix] [HarmonyPatch(typeof(LocalPlayer), "TakeControlOfShip")] private static void ApplyThirdPersonState(LocalPlayer __instance, Helm helm) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: 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_004b: 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_0053: 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_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) _isOnTurret = false; PilotCinematikaController controller = __instance._cameraManager.GetController(); if (_thirdPerson && !controller.ThirdPerson) { controller.ThirdPersonToggle(); } Settings currentSettings = controller.CurrentSettings; Vector3 thirdPersonOffset = _thirdPersonOffset; if (ShipCamProPlugin.cameraWrap.Value) { currentSettings._xWrap = true; } currentSettings._thirdPersonOffset = thirdPersonOffset; currentSettings._thirdPersonOffsetLowY = thirdPersonOffset; currentSettings._thirdPersonOffsetHighY = thirdPersonOffset; currentSettings._maxAngles.y = 89f; currentSettings._minAngles.y = -89f; controller.CurrentSettings = currentSettings; } [HarmonyPostfix] [HarmonyPatch(typeof(PilotCinematikaController), "ThirdPersonToggle")] private static void ThirdPersonToggle(PilotCinematikaController __instance) { _thirdPerson = __instance.ThirdPerson; } [HarmonyPrefix] [HarmonyPatch(typeof(PilotCinematikaController), "UpdateInput")] private static void StoreTargetAngles(PilotCinematikaController __instance, CameraInputState iState) { //IL_0001: 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_002a: 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_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) _angleX = __instance._targetAngles.x; _angleY = __instance._targetAngles.y; float y = ((InputControl)(object)Mouse.current.scroll).ReadValue().y; if (y != 0f) { _zoom = Mathf.Clamp(_zoom - _zoom * y * 0.1f, 2f, ShipCamProPlugin.maxZoom.Value); Vector3 thirdPersonOffset = _thirdPersonOffset; Settings currentSettings = __instance.CurrentSettings; currentSettings._thirdPersonOffset = thirdPersonOffset; currentSettings._thirdPersonOffsetLowY = thirdPersonOffset; currentSettings._thirdPersonOffsetHighY = thirdPersonOffset; __instance.CurrentSettings = currentSettings; } if (iState.LookEnable) { if (!_isLooking) { _isLooking = true; _hasTurned = false; _releaseCamera = false; } else if (iState.Look != Vector2.zero) { _hasTurned = true; } } else if (_isLooking) { if (!_hasTurned) { _releaseCamera = true; } _hasTurned = false; _isLooking = false; } } [HarmonyPostfix] [HarmonyPriority(100)] [HarmonyPatch(typeof(PilotCinematikaController), "UpdateInput")] private static void RestoreTargetAngles(PilotCinematikaController __instance, CameraInputState iState) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) if (_thirdPerson && !_isOnTurret && !iState.LookEnable && ShipCamProPlugin.cameraLock.Value && !_releaseCamera) { __instance._targetAngles = new Vector2(_angleX, _angleY); } } } [BepInPlugin("kruft.ShipCamPro", "ShipCam Pro", "0.3.0")] public class ShipCamProPlugin : BasePlugin { public static ConfigEntry cameraLock; public static ConfigEntry cameraWrap; public static ConfigEntry maxZoom; public override void Load() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) new Harmony("kruft.ShipCamPro").PatchAll(typeof(ShipCamProPatch)); cameraLock = ((BasePlugin)this).Config.Bind("General", "Lock_Camera", true, "Lock the free-look camera in place."); cameraWrap = ((BasePlugin)this).Config.Bind("General", "Wrap_Camera", true, "Allow the camera to wrap around."); maxZoom = ((BasePlugin)this).Config.Bind("General", "Max_Zoom", 120f, "Maximum zoom distance."); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "kruft.ShipCamPro"; public const string PLUGIN_NAME = "ShipCam Pro"; public const string PLUGIN_VERSION = "0.3.0"; } }