Decompiled source of NoServerPassword v1.0.9

Landoria.NoServerPassword.dll

Decompiled 6 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Logging;
using GUIFramework;
using HarmonyLib;
using Landoria.SharedLib;
using PlayFab;
using PlayFab.MultiplayerModels;
using Splatform;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Landoria.NoServerPassword")]
[assembly: AssemblyDescription("Allows password-free public Valheim servers")]
[assembly: AssemblyCompany("Landoria Gaming")]
[assembly: AssemblyProduct("Landoria.NoServerPassword")]
[assembly: AssemblyCopyright("Copyright © Landoria Gaming 2026")]
[assembly: ComVisible(false)]
[assembly: Guid("C424AE43-8596-4E8C-9517-0B4BF2927364")]
[assembly: AssemblyFileVersion("1.0.9")]
[assembly: AssemblyInformationalVersion("1.0.9")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = "")]
[assembly: AssemblyVersion("1.0.9.13996")]
namespace Landoria.NoServerPassword
{
	[HarmonyPatch(typeof(FejdStartup), "GetPublicPasswordError")]
	internal static class PublicPasswordErrorPatch
	{
		private static bool Prefix(string password, ref string __result)
		{
			if (!string.IsNullOrEmpty(password))
			{
				return true;
			}
			__result = string.Empty;
			return false;
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "IsPublicPasswordValid")]
	internal static class PublicPasswordValidationPatch
	{
		private static bool Prefix(string password, ref bool __result)
		{
			if (!string.IsNullOrEmpty(password))
			{
				return true;
			}
			__result = true;
			return false;
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "CanStartServer")]
	internal static class CanStartServerPatch
	{
		private static void Postfix(GuiInputField ___m_serverPassword, World ___m_world, ref bool __result)
		{
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			if (!__result && string.IsNullOrEmpty((___m_serverPassword != null) ? ((TMP_InputField)___m_serverPassword).text : null) && ___m_world != null && (int)___m_world.m_dataError == 0)
			{
				__result = true;
			}
		}
	}
	[HarmonyPatch(typeof(FejdStartup), "UpdatePasswordError")]
	internal static class PasswordErrorDisplayPatch
	{
		private static void Postfix(GuiInputField ___m_serverPassword, TMP_Text ___m_passwordError)
		{
			if (string.IsNullOrEmpty((___m_serverPassword != null) ? ((TMP_InputField)___m_serverPassword).text : null) && (Object)(object)___m_passwordError != (Object)null)
			{
				___m_passwordError.text = string.Empty;
			}
		}
	}
	[BepInPlugin("Landoria.NoServerPassword", "Landoria.NoServerPassword", "1.0.9")]
	public sealed class NoServerPasswordPlugin : LandoriaPlugin
	{
		private const string PluginGuid = "Landoria.NoServerPassword";

		private const string PluginName = "Landoria.NoServerPassword";

		private const string PluginVersion = "1.0.9";

		internal static ModLog Log { get; private set; }

		private void Awake()
		{
			Log = InitializePlugin("Landoria.NoServerPassword");
			Log.LogInfo("Landoria.NoServerPassword 1.0.9 is loaded.");
		}

		private void OnDestroy()
		{
			Log?.LogInfo("Landoria.NoServerPassword 1.0.9 is unloaded.");
			ShutdownPlugin();
			Log = null;
		}
	}
	internal static class PasswordFreeServerMarker
	{
		internal const string SearchDataKey = "string_key7";

		private static readonly ConditionalWeakTable<PlayFabMatchmakingServerData, object> MarkedServers = new ConditionalWeakTable<PlayFabMatchmakingServerData, object>();

		internal static bool IsPresent(IReadOnlyDictionary<string, string> searchData)
		{
			if (searchData != null && searchData.TryGetValue("string_key7", out var value))
			{
				if (!string.Equals(value, "TRUE", StringComparison.Ordinal))
				{
					return string.Equals(value, "FALSE", StringComparison.Ordinal);
				}
				return true;
			}
			return false;
		}

		internal static void Mark(PlayFabMatchmakingServerData server)
		{
			if (server != null)
			{
				MarkedServers.GetValue(server, (PlayFabMatchmakingServerData _) => new object());
			}
		}

		internal static bool IsMarked(PlayFabMatchmakingServerData server)
		{
			object value;
			if (server != null)
			{
				return MarkedServers.TryGetValue(server, out value);
			}
			return false;
		}
	}
	[HarmonyPatch(typeof(PlayFabMultiplayerAPI), "CreateLobby")]
	internal static class PublishPasswordFreeServerMarkerPatch
	{
		private static void Prefix(CreateLobbyRequest request)
		{
			if (request?.SearchData != null && !((Object)(object)ZNet.instance == (Object)null) && ZNet.instance.IsServer())
			{
				string text = request.SearchData["string_key7"];
				request.SearchData["string_key7"] = text.ToUpperInvariant();
				NoServerPasswordPlugin.Log.LogDebug("Published the password-free PlayFab marker.");
			}
		}
	}
	[HarmonyPatch(typeof(ZPlayFabLobbySearch), "ToServerData", new Type[]
	{
		typeof(string),
		typeof(uint),
		typeof(uint),
		typeof(Dictionary<string, string>),
		typeof(Dictionary<string, string>),
		typeof(bool)
	})]
	internal static class ReadPasswordFreeServerMarkerPatch
	{
		private static void Postfix(Dictionary<string, string> searchData, PlayFabMatchmakingServerData __result)
		{
			if (__result != null && PasswordFreeServerMarker.IsPresent(searchData))
			{
				PasswordFreeServerMarker.Mark(__result);
			}
		}
	}
	[HarmonyPatch(typeof(PlayFabMatchmakingServerData), "ToServerMatchmakingData")]
	internal static class PlayFabPasswordDisplayPatch
	{
		private static bool Prefix(PlayFabMatchmakingServerData __instance, DateTime timestampUtc, ref ServerMatchmakingData __result)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			if (!PasswordFreeServerMarker.IsMarked(__instance))
			{
				return true;
			}
			__result = CreateMatchmakingData(__instance, timestampUtc);
			return false;
		}

		private static ServerMatchmakingData CreateMatchmakingData(PlayFabMatchmakingServerData server, DateTime timestampUtc)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: 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_0038: Unknown result type (might be due to invalid IL or missing references)
			return new ServerMatchmakingData(timestampUtc, server.serverName, server.numPlayers, server.maxNumPlayers, server.platformUserID, server.gameVersion, server.networkVersion, server.joinCode, false, server.platformRestriction, server.modifiers);
		}
	}
}
namespace Landoria.SharedLib
{
	public abstract class LandoriaPlugin : BaseUnityPlugin
	{
		private Harmony _harmony;

		private bool _patchesApplied;

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

		protected ModLog InitializePlugin(string pluginGuid, Type[] patchTypes)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			ModLog modLog = new ModLog(((BaseUnityPlugin)this).Logger);
			Version version = ((object)this).GetType().Assembly.GetName().Version;
			modLog.LogInfo($"AssemblyVersion: {version}.");
			EnsureSharedPatches(modLog);
			_harmony = new Harmony(pluginGuid);
			foreach (Type type in patchTypes)
			{
				_harmony.CreateClassProcessor(type).Patch();
				modLog.LogInfo("Server patch: " + type.Name);
			}
			_patchesApplied = true;
			return modLog;
		}

		private static void EnsureSharedPatches(ModLog log)
		{
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			lock (AppDomain.CurrentDomain)
			{
				if (AppDomain.CurrentDomain.GetData("Landoria.SharedLib.ConnectionFailureMenuPatch.v1") == null)
				{
					new Harmony("Landoria.SharedLib").CreateClassProcessor(typeof(ConnectionFailureMenuPatch)).Patch();
					AppDomain.CurrentDomain.SetData("Landoria.SharedLib.ConnectionFailureMenuPatch.v1", true);
					log.LogDebug("Shared connection failure menu patch was applied.");
				}
			}
		}

		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 static class ConnectionFailureMessages
	{
		private const string StateKey = "Landoria.SharedLib.ConnectionFailureMessages.v1";

		private static readonly ManualLogSource Log = Logger.CreateLogSource("Landoria.ConnectionFailureMessages");

		public static void Push(string source, string message)
		{
			Push(source, message, (string)null);
		}

		public static void Push(string source, string userMessage, string systemMessage)
		{
			Push(source, userMessage, systemMessage, null);
		}

		public static void Push(string source, string userMessage, Exception exception)
		{
			Push(source, userMessage, exception?.Message, exception);
		}

		public static void Push(string source, string userMessage, string systemMessage, Exception exception)
		{
			string text = DisplayMessage(userMessage, systemMessage ?? exception?.Message);
			if (string.IsNullOrWhiteSpace(source) || text == null)
			{
				return;
			}
			bool flag = false;
			lock (AppDomain.CurrentDomain)
			{
				Stack<Tuple<string, string, string>> messages = GetMessages();
				Tuple<string, string, string> item = Tuple.Create(source, text, systemMessage);
				if (!messages.Contains(item))
				{
					messages.Push(item);
					flag = true;
				}
			}
			if (flag)
			{
				LogQueued(source, text, systemMessage, exception);
			}
		}

		public static void Clear(string source)
		{
			if (string.IsNullOrWhiteSpace(source))
			{
				return;
			}
			lock (AppDomain.CurrentDomain)
			{
				Stack<Tuple<string, string, string>> messages = GetMessages();
				Stack<Tuple<string, string, string>> stack = new Stack<Tuple<string, string, string>>();
				while (messages.Count > 0)
				{
					Tuple<string, string, string> tuple = messages.Pop();
					if (tuple.Item1 != source)
					{
						stack.Push(tuple);
					}
				}
				while (stack.Count > 0)
				{
					messages.Push(stack.Pop());
				}
			}
		}

		internal static bool TryPopAll(out string message)
		{
			lock (AppDomain.CurrentDomain)
			{
				Stack<Tuple<string, string, string>> messages = GetMessages();
				if (messages.Count > 0)
				{
					List<string> list = new List<string>();
					while (messages.Count > 0)
					{
						list.Add(messages.Pop().Item2);
					}
					message = string.Join("\n", list);
					return true;
				}
			}
			message = null;
			return false;
		}

		private static Stack<Tuple<string, string, string>> GetMessages()
		{
			if (AppDomain.CurrentDomain.GetData("Landoria.SharedLib.ConnectionFailureMessages.v1") is Stack<Tuple<string, string, string>> result)
			{
				return result;
			}
			Stack<Tuple<string, string, string>> stack = new Stack<Tuple<string, string, string>>();
			AppDomain.CurrentDomain.SetData("Landoria.SharedLib.ConnectionFailureMessages.v1", stack);
			return stack;
		}

		private static string DisplayMessage(string userMessage, string systemMessage)
		{
			if (!string.IsNullOrWhiteSpace(userMessage))
			{
				return userMessage;
			}
			if (!string.IsNullOrWhiteSpace(systemMessage))
			{
				return systemMessage;
			}
			return null;
		}

		private static void LogQueued(string source, string userMessage, string systemMessage, Exception exception)
		{
			string text = exception?.ToString() ?? Environment.StackTrace;
			if (string.IsNullOrWhiteSpace(systemMessage) || systemMessage == userMessage)
			{
				Log.LogWarning((object)("Queued connection failure message from " + source + ": " + userMessage + "\nDiagnostic stack:\n" + text));
			}
			else
			{
				Log.LogWarning((object)("Queued connection failure message from " + source + ": userMessage=" + userMessage + "; systemMessage=" + systemMessage + "\nDiagnostic stack:\n" + text));
			}
		}
	}
	[HarmonyPatch]
	internal static class ConnectionFailureMenuPatch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(FejdStartup), "ShowConnectError")]
		private static void ShowConnectError(TMP_Text ___m_connectionFailedError)
		{
			if (ConnectionFailureMessages.TryPopAll(out var message))
			{
				___m_connectionFailedError.text = message;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(FejdStartup), "Start")]
		private static void Start(GameObject ___m_connectionFailedPanel, TMP_Text ___m_connectionFailedError)
		{
			ShowNext(___m_connectionFailedPanel, ___m_connectionFailedError);
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(FejdStartup), "OnConnectionFailedOk")]
		private static void OnConnectionFailedOk(GameObject ___m_connectionFailedPanel, TMP_Text ___m_connectionFailedError)
		{
			ShowNext(___m_connectionFailedPanel, ___m_connectionFailedError);
		}

		private static void ShowNext(GameObject panel, TMP_Text text)
		{
			if (ConnectionFailureMessages.TryPopAll(out var message))
			{
				text.text = message;
				panel.SetActive(true);
			}
		}
	}
	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}");
		}
	}
	public static class PlatformPlayerIdentity
	{
		public unsafe static string Resolve(PlayerInfo player)
		{
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			string text = ((object)(*(PlatformUserID*)(&player.m_userInfo.m_id))/*cast due to .constrained prefix*/).ToString();
			if (!string.IsNullOrWhiteSpace(text))
			{
				return text;
			}
			ZNetPeer obj = FindPeer(player);
			if (obj == null)
			{
				return null;
			}
			ISocket socket = obj.m_socket;
			if (socket == null)
			{
				return null;
			}
			return socket.GetHostName();
		}

		public static ZNetPeer FindPeer(PlayerInfo player)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)ZNet.instance == (Object)null || ((ZDOID)(ref player.m_characterID)).IsNone())
			{
				return null;
			}
			return ((IEnumerable<ZNetPeer>)ZNet.instance.GetPeers()).FirstOrDefault((Func<ZNetPeer, bool>)((ZNetPeer peer) => peer != null && ((ZDOID)(ref peer.m_characterID)).Equals(player.m_characterID)));
		}
	}
	public static class ServerRole
	{
		public static bool IsDedicatedServer
		{
			get
			{
				if ((Object)(object)ZNet.instance != (Object)null && ZNet.instance.IsServer())
				{
					return ZNet.instance.IsDedicated();
				}
				return false;
			}
		}
	}
}