Decompiled source of Venture Multiplayer Tweaks v0.11.0

Plugins/VentureValheim.MultiplayerTweaks.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Jotunn.Managers;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("VentureValheim.MultiplayerTweaks")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("VentureValheim.MultiplayerTweaks")]
[assembly: AssemblyCopyright("Copyright ©  2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("18EFA4BF-41BC-4ABE-916B-34F034DD5DCE")]
[assembly: AssemblyFileVersion("0.11.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.11.0.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace VentureValheim.MultiplayerTweaks
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.orianaventure.mod.MultiplayerTweaks", "MultiplayerTweaks", "0.11.0")]
	public class MultiplayerTweaksPlugin : BaseUnityPlugin
	{
		private const string ModName = "MultiplayerTweaks";

		private const string ModVersion = "0.11.0";

		private const string Author = "com.orianaventure.mod";

		private const string ModGUID = "com.orianaventure.mod.MultiplayerTweaks";

		private static string ConfigFileName = "com.orianaventure.mod.MultiplayerTweaks.cfg";

		private static string ConfigFileFullPath;

		private readonly Harmony HarmonyInstance = new Harmony("com.orianaventure.mod.MultiplayerTweaks");

		public static readonly ManualLogSource MultiplayerTweaksLogger;

		internal static ConfigEntry<bool> CE_AdminBypass;

		internal static ConfigEntry<int> CE_GameDayOffset;

		internal static ConfigEntry<bool> CE_OverridePlayerPVP;

		internal static ConfigEntry<bool> CE_ForcePlayerPVPOn;

		internal static ConfigEntry<bool> CE_TeleportOnAnyDeath;

		internal static ConfigEntry<bool> CE_TeleportOnPVPDeath;

		internal static ConfigEntry<bool> CE_SkillLossOnAnyDeath;

		internal static ConfigEntry<bool> CE_SkillLossOnPVPDeath;

		internal static ConfigEntry<bool> CE_HidePlatformTag;

		internal static ConfigEntry<string> CE_PlayerDefaultSpawnPoint;

		internal static ConfigEntry<bool> CE_EnableValkrie;

		internal static ConfigEntry<bool> CE_EnableArrivalMessage;

		internal static ConfigEntry<bool> CE_EnableArrivalMessageShout;

		internal static ConfigEntry<string> CE_OverrideArrivalMessage;

		internal static ConfigEntry<bool> CE_EnableTempleMapPin;

		internal static ConfigEntry<bool> CE_EnableHaldorMapPin;

		internal static ConfigEntry<bool> CE_EnableHildirMapPin;

		internal static ConfigEntry<bool> CE_OverridePlayerMapPins;

		internal static ConfigEntry<bool> CE_ForcePlayerMapPinsOn;

		internal static ConfigEntry<bool> CE_AllowMapPings;

		internal static ConfigEntry<bool> CE_AllowShoutPings;

		private readonly ConfigurationManagerAttributes AdminConfig = new ConfigurationManagerAttributes
		{
			IsAdminOnly = true
		};

		private readonly ConfigurationManagerAttributes ClientConfig = new ConfigurationManagerAttributes
		{
			IsAdminOnly = false
		};

		public static bool GetAdminBypass()
		{
			return CE_AdminBypass.Value;
		}

		public static int GetGameDayOffset()
		{
			return CE_GameDayOffset.Value;
		}

		public static bool GetOverridePlayerPVP()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return false;
			}
			return CE_OverridePlayerPVP.Value;
		}

		public static bool GetForcePlayerPVPOn()
		{
			return CE_ForcePlayerPVPOn.Value;
		}

		public static bool GetTeleportOnAnyDeath()
		{
			return CE_TeleportOnAnyDeath.Value;
		}

		public static bool GetTeleportOnPVPDeath()
		{
			return CE_TeleportOnPVPDeath.Value;
		}

		public static bool GetSkillLossOnAnyDeath()
		{
			return CE_SkillLossOnAnyDeath.Value;
		}

		public static bool GetSkillLossOnPVPDeath()
		{
			return CE_SkillLossOnPVPDeath.Value;
		}

		public static bool GetHidePlatformTag()
		{
			return CE_HidePlatformTag.Value;
		}

		public static string GetPlayerDefaultSpawnPoint()
		{
			return CE_PlayerDefaultSpawnPoint.Value;
		}

		public static bool GetEnableValkrie()
		{
			return CE_EnableValkrie.Value;
		}

		public static bool GetEnableArrivalMessage()
		{
			return CE_EnableArrivalMessage.Value;
		}

		public static bool GetEnableArrivalMessageShout()
		{
			return CE_EnableArrivalMessageShout.Value;
		}

		public static string GetOverrideArrivalMessage()
		{
			return CE_OverrideArrivalMessage.Value;
		}

		public static bool GetEnableTempleMapPin()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return true;
			}
			return CE_EnableTempleMapPin.Value;
		}

		public static bool GetEnableHaldorMapPin()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return true;
			}
			return CE_EnableHaldorMapPin.Value;
		}

		public static bool GetEnableHildirMapPin()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return true;
			}
			return CE_EnableHildirMapPin.Value;
		}

		public static bool GetOverridePlayerMapPins()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return false;
			}
			return CE_OverridePlayerMapPins.Value;
		}

		public static bool GetForcePlayerMapPinsOn()
		{
			return CE_ForcePlayerMapPinsOn.Value;
		}

		public static bool GetAllowMapPings()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return true;
			}
			return CE_AllowMapPings.Value;
		}

		public static bool GetAllowShoutPings()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return true;
			}
			return CE_AllowShoutPings.Value;
		}

		private void AddConfig<T>(string key, string section, string description, bool synced, T value, ref ConfigEntry<T> configEntry)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Expected O, but got Unknown
			string extendedDescription = GetExtendedDescription(description, synced);
			configEntry = ((BaseUnityPlugin)this).Config.Bind<T>(section, key, value, new ConfigDescription(extendedDescription, (AcceptableValueBase)null, new object[1] { synced ? AdminConfig : ClientConfig }));
		}

		public string GetExtendedDescription(string description, bool synchronizedSetting)
		{
			return description + (synchronizedSetting ? " [Synced with Server]" : " [Not Synced with Server]");
		}

		public void Awake()
		{
			AddConfig("AdminBypass", "General", "True to allow admins to bypass some setting restrictions (boolean).", synced: true, value: false, ref CE_AdminBypass);
			AddConfig("GameDayOffset", "General", "Number to offset the game day display (int).", synced: true, 0, ref CE_GameDayOffset);
			AddConfig("OverridePlayerPVP", "General", "Override Player pvp behavior (boolean).", synced: true, value: false, ref CE_OverridePlayerPVP);
			AddConfig("ForcePlayerPVPOn", "General", "True to set pvp always on when OverridePlayerPVP is True (boolean).", synced: true, value: true, ref CE_ForcePlayerPVPOn);
			AddConfig("TeleportOnAnyDeath", "General", "False to respawn players at their graves on any death (boolean).", synced: true, value: true, ref CE_TeleportOnAnyDeath);
			AddConfig("TeleportOnPVPDeath", "General", "False to respawn players at their graves on a PVP death (boolean).", synced: true, value: true, ref CE_TeleportOnPVPDeath);
			AddConfig("SkillLossOnAnyDeath", "General", "False to prevent skill loss on any death (boolean).", synced: true, value: true, ref CE_SkillLossOnAnyDeath);
			AddConfig("SkillLossOnPVPDeath", "General", "False to prevent skill loss on a PVP death (boolean).", synced: true, value: true, ref CE_SkillLossOnPVPDeath);
			AddConfig("HidePlatformTag", "General", "When true hides steam/xbox platform tags from pings and chat messages (boolean).", synced: true, value: false, ref CE_HidePlatformTag);
			AddConfig("PlayerDefaultSpawnPoint", "Arrival", "Coordinates for the default player spawn point (x,y,z) no parentheses, leave empty to use game default (comma-separated floats).", synced: true, "", ref CE_PlayerDefaultSpawnPoint);
			AddConfig("EnableValkrie", "Arrival", "True to enable Valkrie Intro (boolean).", synced: true, value: true, ref CE_EnableValkrie);
			AddConfig("EnableArrivalMessage", "Arrival", "True to enable Arrival Message on player login (boolean).", synced: true, value: true, ref CE_EnableArrivalMessage);
			AddConfig("UseArrivalShout", "Arrival", "False to use a Normal message when EnableArrivalMessage is True (boolean).", synced: true, value: true, ref CE_EnableArrivalMessageShout);
			AddConfig("OverrideArrivalMessage", "Arrival", "Set a new arrival message, leave blank to use default (string).", synced: true, "", ref CE_OverrideArrivalMessage);
			AddConfig("EnableTempleMapPin", "Map", "False to hide Starting Temple map pin on Minimap (boolean).", synced: true, value: true, ref CE_EnableTempleMapPin);
			AddConfig("EnableHaldorMapPin", "Map", "False to hide Haldor map pin on Minimap (boolean).", synced: true, value: true, ref CE_EnableHaldorMapPin);
			AddConfig("EnableHildirMapPin", "Map", "False to hide Hildir map pin on Minimap (boolean).", synced: true, value: true, ref CE_EnableHildirMapPin);
			AddConfig("OverridePlayerMapPositions", "Map", "Override Player map pin position behavior for Minimap (boolean).", synced: true, value: false, ref CE_OverridePlayerMapPins);
			AddConfig("ForcePlayerMapPositionOn", "Map", "True to always show Player position on Minimap when OverridePlayerMapPositions is True (boolean).", synced: true, value: true, ref CE_ForcePlayerMapPinsOn);
			AddConfig("AllowMapPings", "Map", "False to disable pings on the map from players (boolean).", synced: true, value: true, ref CE_AllowMapPings);
			AddConfig("AllowShoutPings", "Map", "False to disable pings on the map when players shout messages (boolean).", synced: true, value: true, ref CE_AllowShoutPings);
			MultiplayerTweaksLogger.LogInfo((object)"Watch me Tweak, now watch me Neigh Neigh.");
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			HarmonyInstance.PatchAll(executingAssembly);
			SetupWatcher();
		}

		private void OnDestroy()
		{
			((BaseUnityPlugin)this).Config.Save();
		}

		private void SetupWatcher()
		{
			FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(Paths.ConfigPath, ConfigFileName);
			fileSystemWatcher.Changed += ReadConfigValues;
			fileSystemWatcher.Created += ReadConfigValues;
			fileSystemWatcher.Renamed += ReadConfigValues;
			fileSystemWatcher.IncludeSubdirectories = true;
			fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
			fileSystemWatcher.EnableRaisingEvents = true;
		}

		private void ReadConfigValues(object sender, FileSystemEventArgs e)
		{
			if (!File.Exists(ConfigFileFullPath))
			{
				return;
			}
			try
			{
				MultiplayerTweaksLogger.LogDebug((object)"Attempting to reload configuration...");
				((BaseUnityPlugin)this).Config.Reload();
			}
			catch
			{
				MultiplayerTweaksLogger.LogError((object)("There was an issue loading " + ConfigFileName));
			}
		}

		static MultiplayerTweaksPlugin()
		{
			string configPath = Paths.ConfigPath;
			char directorySeparatorChar = Path.DirectorySeparatorChar;
			ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
			MultiplayerTweaksLogger = Logger.CreateLogSource("MultiplayerTweaks");
			CE_AdminBypass = null;
			CE_GameDayOffset = null;
			CE_OverridePlayerPVP = null;
			CE_ForcePlayerPVPOn = null;
			CE_TeleportOnAnyDeath = null;
			CE_TeleportOnPVPDeath = null;
			CE_SkillLossOnAnyDeath = null;
			CE_SkillLossOnPVPDeath = null;
			CE_HidePlatformTag = null;
			CE_PlayerDefaultSpawnPoint = null;
			CE_EnableValkrie = null;
			CE_EnableArrivalMessage = null;
			CE_EnableArrivalMessageShout = null;
			CE_OverrideArrivalMessage = null;
			CE_EnableTempleMapPin = null;
			CE_EnableHaldorMapPin = null;
			CE_EnableHildirMapPin = null;
			CE_OverridePlayerMapPins = null;
			CE_ForcePlayerMapPinsOn = null;
			CE_AllowMapPings = null;
			CE_AllowShoutPings = null;
		}
	}
	public class GeneralTweaks
	{
		[HarmonyPriority(0)]
		[HarmonyPatch(typeof(Player), "ShowTutorial")]
		public static class Patch_Player_ShowTutorial
		{
			private static bool Prefix(Player __instance, string name)
			{
				if (!Raven.m_tutorialsEnabled)
				{
					__instance.SetSeenTutorial(name);
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Player), "OnSpawned")]
		public static class Patch_Player_OnSpawned
		{
			private static void Postfix(Player __instance)
			{
				if (MultiplayerTweaksPlugin.GetOverridePlayerPVP())
				{
					ZNetView nview = ((Character)__instance).m_nview;
					if (nview != null)
					{
						ZDO zDO = nview.GetZDO();
						if (zDO != null)
						{
							zDO.Set(ZDOVars.s_pvp, MultiplayerTweaksPlugin.GetForcePlayerPVPOn());
						}
					}
					__instance.m_pvp = MultiplayerTweaksPlugin.GetForcePlayerPVPOn();
					InventoryGui.instance.m_pvp.isOn = MultiplayerTweaksPlugin.GetForcePlayerPVPOn();
				}
				_lastSpawnTime = ZNet.instance.GetTimeSeconds();
				_lastHitByPlayer = false;
			}
		}

		[HarmonyPatch(typeof(Player), "CanSwitchPVP")]
		public static class Patch_Player_CanSwitchPVP
		{
			private static void Postfix(ref bool __result)
			{
				if (MultiplayerTweaksPlugin.GetOverridePlayerPVP())
				{
					__result = false;
				}
			}
		}

		[HarmonyPatch(typeof(Player), "OnDamaged")]
		public static class Patch_Player_OnDamaged
		{
			private static void Postfix(HitData hit)
			{
				//IL_0001: Unknown result type (might be due to invalid IL or missing references)
				if (IsPlayer(hit.m_attacker))
				{
					_lastHitByPlayer = true;
				}
				else
				{
					_lastHitByPlayer = false;
				}
			}
		}

		[HarmonyPatch(typeof(PlayerProfile), "SetDeathPoint")]
		public static class Patch_PlayerProfile_SetDeathPoint
		{
			private static void Postfix(PlayerProfile __instance, Vector3 point)
			{
				//IL_0016: Unknown result type (might be due to invalid IL or missing references)
				if (!MultiplayerTweaksPlugin.GetTeleportOnAnyDeath() || (!MultiplayerTweaksPlugin.GetTeleportOnPVPDeath() && _lastHitByPlayer))
				{
					__instance.SetLogoutPoint(point);
				}
			}
		}

		[HarmonyPatch(typeof(Game), "RequestRespawn")]
		public static class Patch_Game_RequestRespawn
		{
			private static void Prefix(ref bool afterDeath)
			{
				if (!MultiplayerTweaksPlugin.GetTeleportOnAnyDeath() || (!MultiplayerTweaksPlugin.GetTeleportOnPVPDeath() && _lastHitByPlayer))
				{
					afterDeath = false;
				}
			}
		}

		[HarmonyPatch(typeof(Skills), "LowerAllSkills")]
		public static class Patch_Skills_LowerAllSkills
		{
			[HarmonyPriority(500)]
			private static bool Prefix()
			{
				if (!MultiplayerTweaksPlugin.GetSkillLossOnAnyDeath() || (!MultiplayerTweaksPlugin.GetSkillLossOnPVPDeath() && _lastHitByPlayer))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Skills), "Clear")]
		public static class Patch_Skills_Clear
		{
			[HarmonyPriority(500)]
			private static bool Prefix()
			{
				if (!MultiplayerTweaksPlugin.GetSkillLossOnAnyDeath() || (!MultiplayerTweaksPlugin.GetSkillLossOnPVPDeath() && _lastHitByPlayer))
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Character), "CheckDeath")]
		public static class Patch_Character_CheckDeath
		{
			private static bool Prefix(Character __instance)
			{
				if ((Object)(object)__instance == (Object)(object)Player.m_localPlayer && ZNet.instance.GetTimeSeconds() - _lastSpawnTime < 15.0)
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(EnvMan), "GetCurrentDay")]
		public static class Patch_EnvMan_GetCurrentDay
		{
			private static void Postfix(ref int __result)
			{
				int gameDayOffset = MultiplayerTweaksPlugin.GetGameDayOffset();
				__result -= gameDayOffset;
				if (__result < 0)
				{
					__result = 0;
				}
			}
		}

		[HarmonyPatch(typeof(UserInfo), "GamertagSuffix")]
		public static class Patch_UserInfo_GamertagSuffix
		{
			private static void Postfix(ref string __result)
			{
				if (MultiplayerTweaksPlugin.GetHidePlatformTag())
				{
					__result = "";
				}
			}
		}

		private static bool _lastHitByPlayer;

		private static double _lastSpawnTime;

		public static bool IsPlayer(ZDOID id)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (!((ZDOID)(ref id)).IsNone() && Player.s_players != null)
			{
				List<Player> s_players = Player.s_players;
				for (int i = 0; i < s_players.Count; i++)
				{
					ZDOID zDOID = ((Character)s_players[i]).GetZDOID();
					if (((ZDOID)(ref zDOID)).Equals(id))
					{
						return true;
					}
				}
			}
			return false;
		}
	}
	public class MapTweaks
	{
		[HarmonyPatch(typeof(ZoneSystem), "GetLocationIcons")]
		public static class Patch_ZoneSystem_GetLocationIcons
		{
			private static void Postfix(ref Dictionary<Vector3, string> icons)
			{
				//IL_0069: Unknown result type (might be due to invalid IL or missing references)
				//IL_007f: Unknown result type (might be due to invalid IL or missing references)
				//IL_0095: Unknown result type (might be due to invalid IL or missing references)
				//IL_00c7: 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)
				//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
				if (MultiplayerTweaksPlugin.GetEnableTempleMapPin() && MultiplayerTweaksPlugin.GetEnableHaldorMapPin() && MultiplayerTweaksPlugin.GetEnableHildirMapPin())
				{
					return;
				}
				List<Vector3> list = new List<Vector3>();
				foreach (KeyValuePair<Vector3, string> icon in icons)
				{
					switch (icon.Value)
					{
					case "StartTemple":
						if (!MultiplayerTweaksPlugin.GetEnableTempleMapPin())
						{
							list.Add(icon.Key);
						}
						break;
					case "Vendor_BlackForest":
						if (!MultiplayerTweaksPlugin.GetEnableHaldorMapPin())
						{
							list.Add(icon.Key);
						}
						break;
					case "Hildir_camp":
						if (!MultiplayerTweaksPlugin.GetEnableHildirMapPin())
						{
							list.Add(icon.Key);
						}
						break;
					}
				}
				foreach (Vector3 item in list)
				{
					icons.Remove(item);
				}
			}
		}

		[HarmonyPatch(typeof(Player), "OnSpawned")]
		public static class Patch_Player_OnSpawned
		{
			private static void Postfix()
			{
				if (MultiplayerTweaksPlugin.GetOverridePlayerMapPins())
				{
					ZNet.instance.SetPublicReferencePosition(MultiplayerTweaksPlugin.GetForcePlayerMapPinsOn());
				}
			}
		}

		[HarmonyPatch(typeof(ZNet), "SetPublicReferencePosition")]
		public static class Patch_ZNet_SetPublicReferencePosition
		{
			private static void Prefix(ref bool pub)
			{
				if (MultiplayerTweaksPlugin.GetOverridePlayerMapPins())
				{
					pub = MultiplayerTweaksPlugin.GetForcePlayerMapPinsOn();
				}
			}
		}

		[HarmonyPatch(typeof(Chat), "GetShoutWorldTexts")]
		public static class Patch_Chat_GetShoutWorldTexts
		{
			private static bool Prefix()
			{
				if (!MultiplayerTweaksPlugin.GetAllowShoutPings())
				{
					return false;
				}
				return true;
			}
		}

		[HarmonyPatch(typeof(Chat), "SendPing")]
		public static class Patch_Chat_SendPing
		{
			[HarmonyPriority(300)]
			private static bool Prefix(ref bool __runOriginal)
			{
				if (!MultiplayerTweaksPlugin.GetAllowMapPings() || !__runOriginal)
				{
					return false;
				}
				return true;
			}
		}
	}
	public class ArrivalTweaks
	{
		[HarmonyPatch(typeof(Game), "UpdateRespawn")]
		public static class Patch_Game_UpdateRespawn
		{
			private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e6: Expected O, but got Unknown
				List<CodeInstruction> list = new List<CodeInstruction>(instructions);
				MethodInfo obj = AccessTools.Method(typeof(Chat), "SendText", (Type[])null, (Type[])null);
				for (int i = 5; i < list.Count; i++)
				{
					if (list[i].opcode == OpCodes.Callvirt)
					{
						object operand = list[i].operand;
						if (operand != null && operand.Equals(obj))
						{
							list[i - 5].opcode = OpCodes.Nop;
							list[i - 4].opcode = OpCodes.Nop;
							list[i - 3].opcode = OpCodes.Nop;
							list[i - 2].opcode = OpCodes.Nop;
							list[i - 1].opcode = OpCodes.Nop;
							MethodInfo methodInfo = AccessTools.Method(typeof(ArrivalTweaks), "SendArrivalMessage", (Type[])null, (Type[])null);
							list[i] = new CodeInstruction(OpCodes.Call, (object)methodInfo);
							break;
						}
					}
				}
				return list.AsEnumerable();
			}
		}

		[HarmonyPatch(typeof(Player), "OnSpawned")]
		public static class Patch_Player_OnSpawned
		{
			[HarmonyPriority(0)]
			private static void Prefix(Player __instance)
			{
				if (!MultiplayerTweaksPlugin.GetEnableValkrie())
				{
					__instance.m_firstSpawn = false;
				}
			}

			private static void Postfix()
			{
				if (MultiplayerTweaksPlugin.GetOverridePlayerMapPins())
				{
					ZNet.instance.SetPublicReferencePosition(MultiplayerTweaksPlugin.GetForcePlayerMapPinsOn());
				}
			}
		}

		[HarmonyPatch(typeof(Game), "FindSpawnPoint")]
		public static class Patch_Game_FindSpawnPoint
		{
			private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				//IL_0074: Unknown result type (might be due to invalid IL or missing references)
				//IL_007e: Expected O, but got Unknown
				List<CodeInstruction> list = new List<CodeInstruction>(instructions);
				MethodInfo obj = AccessTools.Method(typeof(ZoneSystem), "GetLocationIcon", (Type[])null, (Type[])null);
				for (int i = 0; i < list.Count; i++)
				{
					if (list[i].opcode == OpCodes.Callvirt)
					{
						object operand = list[i].operand;
						if (operand != null && operand.Equals(obj))
						{
							MethodInfo methodInfo = AccessTools.Method(typeof(ArrivalTweaks), "GetCustomSpawnPoint", (Type[])null, (Type[])null);
							list[i] = new CodeInstruction(OpCodes.Callvirt, (object)methodInfo);
							break;
						}
					}
				}
				return list.AsEnumerable();
			}
		}

		[HarmonyPatch(typeof(BaseAI), "Awake")]
		public static class Patch_BaseAI_Awake
		{
			private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				return ReplaceMessageAll(instructions);
			}
		}

		[HarmonyPatch(typeof(BaseAI), "OnDeath")]
		public static class Patch_BaseAI_OnDeath
		{
			private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				return ReplaceMessageAll(instructions);
			}
		}

		[HarmonyPatch(typeof(BaseAI), "SetAlerted")]
		public static class Patch_BaseAI_SetAlerted
		{
			private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions)
			{
				return ReplaceMessageAll(instructions);
			}
		}

		private static void SendArrivalMessage()
		{
			//IL_0008: 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_0035: Unknown result type (might be due to invalid IL or missing references)
			if (MultiplayerTweaksPlugin.GetEnableArrivalMessage())
			{
				Type val = (Type)2;
				if (!MultiplayerTweaksPlugin.GetEnableArrivalMessageShout())
				{
					val = (Type)1;
				}
				string text = MultiplayerTweaksPlugin.GetOverrideArrivalMessage();
				if (Utility.IsNullOrWhiteSpace(text))
				{
					text = Localization.instance.Localize("$text_player_arrived");
				}
				Chat.instance.SendText(val, text);
			}
		}

		private static void SendMessageInRange(BaseAI baseAI, MessageType type, string message)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			Player.MessageAllInRange(((Component)baseAI).transform.position, 100f, type, message, (Sprite)null);
		}

		public bool GetCustomSpawnPoint(string iconname, out Vector3 position)
		{
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			string playerDefaultSpawnPoint = MultiplayerTweaksPlugin.GetPlayerDefaultSpawnPoint();
			if (!Utility.IsNullOrWhiteSpace(playerDefaultSpawnPoint))
			{
				string[] array = playerDefaultSpawnPoint.Split(new char[1] { ',' });
				if (array.Length == 2)
				{
					try
					{
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogWarning((object)"Depreciated use of the x,z config format. Please use the new x,y,z format for best results!");
						float num = float.Parse(array[0]);
						float num2 = float.Parse(array[1]);
						float num3 = default(float);
						if (ZoneSystem.instance.GetGroundHeight(new Vector3(num, 0f, num2), ref num3))
						{
							position = new Vector3(num, num3 + 2f, num2);
							return true;
						}
					}
					catch (Exception ex)
					{
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogError((object)"Error setting the new spawn point. Check your configuration for formatting issues.");
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogError((object)ex);
					}
				}
				else if (array.Length == 3)
				{
					try
					{
						float num4 = float.Parse(array[0]);
						float num5 = float.Parse(array[1]);
						float num6 = float.Parse(array[2]);
						position = new Vector3(num4, num5, num6);
						return true;
					}
					catch (Exception ex2)
					{
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogError((object)"Error setting the new spawn point. Check your configuration for formatting issues.");
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogError((object)ex2);
					}
				}
			}
			return ZoneSystem.instance.GetLocationIcon(iconname, ref position);
		}

		private static IEnumerable<CodeInstruction> ReplaceMessageAll(IEnumerable<CodeInstruction> instructions)
		{
			//IL_0087: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: Expected O, but got Unknown
			List<CodeInstruction> list = new List<CodeInstruction>(instructions);
			MethodInfo obj = AccessTools.Method(typeof(MessageHud), "MessageAll", (Type[])null, (Type[])null);
			for (int i = 4; i < list.Count; i++)
			{
				if (list[i].opcode == OpCodes.Callvirt)
				{
					object operand = list[i].operand;
					if (operand != null && operand.Equals(obj))
					{
						list[i - 4].opcode = OpCodes.Ldarg_0;
						MethodInfo methodInfo = AccessTools.Method(typeof(ArrivalTweaks), "SendMessageInRange", (Type[])null, (Type[])null);
						list[i] = new CodeInstruction(OpCodes.Call, (object)methodInfo);
						break;
					}
				}
			}
			return list.AsEnumerable();
		}
	}
}