Decompiled source of FreeFlyCommand v1.0.2

Landoria.FreeFlyCommand.dll

Decompiled an hour ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Landoria.SharedLib;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Landoria.FreeFlyCommand")]
[assembly: AssemblyDescription("Allows server-authorized native free-camera commands within a limited range.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Landoria")]
[assembly: AssemblyProduct("Landoria.FreeFlyCommand")]
[assembly: AssemblyCopyright("Copyright © 2026 End3rbyte")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("037059B7-0C09-4B60-A05B-62627829B3D8")]
[assembly: AssemblyFileVersion("1.0.2")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = "")]
[assembly: AssemblyVersion("1.0.2.23100")]
namespace Landoria.FreeFlyCommand
{
	internal static class FreeFlyAuthorization
	{
		private const string RequestRpc = "Landoria_FreeFlyCommand_Request";

		private const string ResponseRpc = "Landoria_FreeFlyCommand_Response";

		private const float RetrySeconds = 2f;

		private static ZRoutedRpc _registeredRpc;

		private static ZNetPeer _serverPeer;

		private static bool? _serverAllowed;

		private static float _nextRequestAt;

		internal static bool IsAuthorized { get; private set; }

		internal static void Update()
		{
			RegisterRpcs();
			if ((Object)(object)ZNet.instance == (Object)null || ZRoutedRpc.instance == null)
			{
				ResetConnection();
			}
			else if (ZNet.instance.IsServer())
			{
				UpdateServerAuthorization();
			}
			else
			{
				UpdateClientAuthorization();
			}
		}

		internal static void ResetSession()
		{
			_serverAllowed = null;
			ResetConnection();
		}

		private static void RegisterRpcs()
		{
			ZRoutedRpc instance = ZRoutedRpc.instance;
			if (instance != null && instance != _registeredRpc)
			{
				instance.Register("Landoria_FreeFlyCommand_Request", (Action<long>)ReceiveRequest);
				instance.Register<bool>("Landoria_FreeFlyCommand_Response", (Action<long, bool>)ReceiveResponse);
				_registeredRpc = instance;
			}
		}

		private static void UpdateServerAuthorization()
		{
			bool serverEnabled = FreeFlyCommandPlugin.ServerEnabled;
			SetAuthorized(serverEnabled);
			if (_serverAllowed != serverEnabled)
			{
				_serverAllowed = serverEnabled;
				ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "Landoria_FreeFlyCommand_Response", new object[1] { serverEnabled });
				FreeFlyCommandPlugin.ModLogger.LogInfo($"Server free-camera authorization changed to {serverEnabled}.");
			}
		}

		private static void UpdateClientAuthorization()
		{
			if (!IsAuthorized)
			{
				FreeFlyController.Disable();
			}
			ZNetPeer serverPeer = ZNet.instance.GetServerPeer();
			if (serverPeer != _serverPeer)
			{
				ResetConnection();
				_serverPeer = serverPeer;
			}
			if (_serverPeer != null && !IsAuthorized && Time.unscaledTime >= _nextRequestAt)
			{
				_nextRequestAt = Time.unscaledTime + 2f;
				ZRoutedRpc.instance.InvokeRoutedRPC(_serverPeer.m_uid, "Landoria_FreeFlyCommand_Request", Array.Empty<object>());
			}
		}

		private static void ReceiveRequest(long sender)
		{
			if (!((Object)(object)ZNet.instance == (Object)null) && ZNet.instance.IsServer() && ZNet.instance.GetPeer(sender) != null && ZRoutedRpc.instance != null)
			{
				ZRoutedRpc.instance.InvokeRoutedRPC(sender, "Landoria_FreeFlyCommand_Response", new object[1] { FreeFlyCommandPlugin.ServerEnabled });
			}
		}

		private static void ReceiveResponse(long sender, bool allowed)
		{
			if (!((Object)(object)ZNet.instance == (Object)null) && !ZNet.instance.IsServer() && _serverPeer != null && _serverPeer.m_uid == sender)
			{
				SetAuthorized(allowed);
			}
		}

		private static void ResetConnection()
		{
			_serverPeer = null;
			_nextRequestAt = 0f;
			FreeFlyController.Disable();
			SetAuthorized(allowed: false);
		}

		private static void SetAuthorized(bool allowed)
		{
			if (IsAuthorized != allowed)
			{
				IsAuthorized = allowed;
				if (!allowed)
				{
					FreeFlyController.Disable();
				}
				FreeFlyCommandPlugin.ModLogger?.LogInfo($"Free-camera authorization is now {allowed}.");
			}
		}
	}
	internal static class FreeFlyCommands
	{
		private static ConsoleCommand _freeFlyCommand;

		private static ConsoleCommand _smoothCommand;

		internal static void Register()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Expected O, but got Unknown
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Expected O, but got Unknown
			//IL_003a: 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_0058: Expected O, but got Unknown
			//IL_0058: Expected O, but got Unknown
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: Expected O, but got Unknown
			_freeFlyCommand = new ConsoleCommand("freefly", "Toggles the server-authorized native free camera.", new ConsoleEventFailable(ToggleFreeFly), false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
			_smoothCommand = new ConsoleCommand("ffsmooth", "[0-1] sets native free-camera smoothing.", new ConsoleEventFailable(SetSmoothness), false, false, false, false, false, new ConsoleOptionsFetcher(SmoothnessOptions), false, false, false);
		}

		internal static bool IsManaged(ConsoleCommand command)
		{
			if (command != _freeFlyCommand)
			{
				return command == _smoothCommand;
			}
			return true;
		}

		private static object ToggleFreeFly(ConsoleEventArgs args)
		{
			if (!FreeFlyAuthorization.IsAuthorized)
			{
				return "Free camera is not authorized by this server.";
			}
			FreeFlyController.Toggle();
			return true;
		}

		private static object SetSmoothness(ConsoleEventArgs args)
		{
			if (!FreeFlyAuthorization.IsAuthorized)
			{
				return "Free camera smoothing is not authorized by this server.";
			}
			if (args.Length != 2 || !float.TryParse(args[1], NumberStyles.Float, CultureInfo.InvariantCulture, out var result) || result < 0f || result > 1f)
			{
				return "Use ffsmooth followed by a value from 0 to 1.";
			}
			GameCamera.instance.SetFreeFlySmoothness(result);
			return true;
		}

		private static List<string> SmoothnessOptions()
		{
			return new List<string> { "0", "0.25", "0.5", "0.75", "1" };
		}
	}
	internal static class FreeFlyController
	{
		internal const float MaximumDistance = 50f;

		internal static void Toggle()
		{
			if (FreeFlyAuthorization.IsAuthorized && !((Object)(object)GameCamera.instance == (Object)null))
			{
				GameCamera.instance.ToggleFreeFly();
			}
		}

		internal static void Disable()
		{
			if ((Object)(object)GameCamera.instance != (Object)null && GameCamera.InFreeFly())
			{
				GameCamera.instance.ToggleFreeFly();
			}
		}

		internal static void ClampToPlayer(GameCamera camera)
		{
			//IL_0024: 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_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0054: 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_0065: 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)
			Player localPlayer = Player.m_localPlayer;
			if (FreeFlyAuthorization.IsAuthorized && GameCamera.InFreeFly() && !((Object)(object)localPlayer == (Object)null))
			{
				Vector3 val = ((Component)camera).transform.position - ((Component)localPlayer).transform.position;
				if (((Vector3)(ref val)).sqrMagnitude > 2500f)
				{
					((Component)camera).transform.position = ((Component)localPlayer).transform.position + ((Vector3)(ref val)).normalized * 50f;
				}
			}
		}
	}
	[HarmonyPatch(typeof(Terminal), "InitTerminal")]
	internal static class FreeFlyCommandRegistrationPatch
	{
		private static void Postfix()
		{
			FreeFlyCommands.Register();
		}
	}
	[HarmonyPatch(typeof(ConsoleCommand), "IsValid")]
	internal static class FreeFlyCommandValidationPatch
	{
		[HarmonyPriority(0)]
		private static void Postfix(ConsoleCommand __instance, ref bool __result)
		{
			if (FreeFlyCommands.IsManaged(__instance) && !FreeFlyAuthorization.IsAuthorized)
			{
				__result = false;
			}
		}
	}
	[HarmonyPatch(typeof(GameCamera), "ToggleFreeFly")]
	internal static class UnauthorizedFreeFlyTogglePatch
	{
		private static bool Prefix()
		{
			if (!FreeFlyAuthorization.IsAuthorized)
			{
				return GameCamera.InFreeFly();
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(GameCamera), "UpdateFreeFly")]
	internal static class FreeFlyDistancePatch
	{
		private static void Postfix(GameCamera __instance)
		{
			FreeFlyController.ClampToPlayer(__instance);
		}
	}
	[HarmonyPatch(typeof(ZNet), "OnDestroy")]
	internal static class FreeFlyDisconnectPatch
	{
		private static void Prefix()
		{
			FreeFlyAuthorization.ResetSession();
		}
	}
	[BepInPlugin("Landoria.FreeFlyCommand", "Landoria.FreeFlyCommand", "1.0.2")]
	public sealed class FreeFlyCommandPlugin : LandoriaPlugin
	{
		internal const string PluginGuid = "Landoria.FreeFlyCommand";

		internal const string PluginName = "Landoria.FreeFlyCommand";

		internal const string PluginVersion = "1.0.2";

		private const string EnabledArgument = "--freeflycommand";

		internal static ModLog ModLogger { get; private set; }

		internal static bool ServerEnabled { get; private set; } = true;

		private void Awake()
		{
			ModLogger = InitializePlugin("Landoria.FreeFlyCommand");
			ServerEnabled = ReadServerEnabled();
			FreeFlyCommands.Register();
			ModLogger.LogInfo(string.Format("{0} {1} is loaded; server enabled={2}.", "Landoria.FreeFlyCommand", "1.0.2", ServerEnabled));
		}

		private void Update()
		{
			FreeFlyAuthorization.Update();
		}

		private static bool ReadServerEnabled()
		{
			string[] commandLineArgs = Environment.GetCommandLineArgs();
			for (int i = 0; i < commandLineArgs.Length; i++)
			{
				if (string.Equals(commandLineArgs[i], "--freeflycommand", StringComparison.OrdinalIgnoreCase))
				{
					if (i + 1 < commandLineArgs.Length && bool.TryParse(commandLineArgs[i + 1], out var result))
					{
						return result;
					}
					ModLogger.LogWarning("Invalid --freeflycommand value; using true.");
					return true;
				}
			}
			return true;
		}

		private void OnDestroy()
		{
			FreeFlyAuthorization.ResetSession();
			ModLogger?.LogInfo("Landoria.FreeFlyCommand 1.0.2 is unloaded.");
			ShutdownPlugin();
			ModLogger = null;
		}
	}
}
namespace Landoria.SharedLib
{
	public abstract class LandoriaPlugin : BaseUnityPlugin
	{
		private Harmony _harmony;

		private bool _patchesApplied;

		protected ModLog InitializePlugin(string pluginGuid)
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			ModLog modLog = new ModLog(((BaseUnityPlugin)this).Logger);
			Version version = ((object)this).GetType().Assembly.GetName().Version;
			modLog.LogInfo($"AssemblyVersion: {version}.");
			_harmony = new Harmony(pluginGuid);
			PatchOwnNamespace(modLog);
			return modLog;
		}

		protected void PatchOwnNamespace(ModLog log)
		{
			if (_patchesApplied)
			{
				log.LogDebug("Harmony patches are already active; skipping registration.");
				return;
			}
			string text = ((object)this).GetType().Namespace;
			Type[] types = Assembly.GetExecutingAssembly().GetTypes();
			foreach (Type type in types)
			{
				if (type.Namespace == text)
				{
					_harmony.CreateClassProcessor(type).Patch();
				}
			}
			_patchesApplied = true;
			log.LogDebug("Harmony patches were applied for the plugin namespace.");
		}

		protected void ShutdownPlugin()
		{
			if (_patchesApplied)
			{
				Harmony harmony = _harmony;
				if (harmony != null)
				{
					harmony.UnpatchSelf();
				}
				_patchesApplied = false;
			}
		}
	}
	public sealed class ModLog
	{
		private readonly ManualLogSource _logger;

		public ModLog(ManualLogSource logger)
		{
			_logger = logger;
		}

		public void LogFatal(object message)
		{
			Write((LogLevel)1, message);
		}

		public void LogError(object message)
		{
			Write((LogLevel)2, message);
		}

		public void LogWarning(object message)
		{
			Write((LogLevel)4, message);
		}

		public void LogMessage(object message)
		{
			Write((LogLevel)8, message);
		}

		public void LogInfo(object message)
		{
			Write((LogLevel)16, message);
		}

		public void LogDebug(object message)
		{
			Write((LogLevel)32, message);
		}

		public void Log(LogLevel level, object message)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			Write(level, message);
		}

		private void Write(LogLevel level, object message)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			string arg = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
			_logger.Log(level, (object)$"[{arg}] {message}");
		}
	}
}