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)ReceiveRequest); instance.Register("Landoria_FreeFlyCommand_Response", (Action)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()); } } 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 SmoothnessOptions() { return new List { "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}"); } } }