Decompiled source of Venture Multiplayer Tweaks v0.11.4

Plugins/VentureValheim.MultiplayerTweaks.dll

Decompiled 2 months 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.4")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.11.4.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.4")]
	public class MultiplayerTweaksPlugin : BaseUnityPlugin
	{
		private const string ModName = "MultiplayerTweaks";

		private const string ModVersion = "0.11.4";

		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_EnableBogWitchMapPin;

		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 GetEnableBogWitchMapPin()
		{
			if (GetAdminBypass() && SynchronizationManager.Instance.PlayerIsAdmin)
			{
				return true;
			}
			return CE_EnableBogWitchMapPin.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("EnableBogWitchMapPin", "Map", "False to hide Bog Witch map pin on Minimap (boolean).", synced: true, value: true, ref CE_EnableBogWitchMapPin);
			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_EnableBogWitchMapPin = null;
			CE_OverridePlayerMapPins = null;
			CE_ForcePlayerMapPinsOn = null;
			CE_AllowMapPings = null;
			CE_AllowShoutPings = null;
		}
	}
	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(Game), "Start")]
		public static class Patch_Game_Start
		{
			private static void Postfix(Game __instance)
			{
				if (!MultiplayerTweaksPlugin.GetEnableValkrie())
				{
					__instance.m_queuedIntro = false;
				}
			}
		}

		[HarmonyPatch(typeof(Player), "OnSpawned")]
		public static class Patch_Player_OnSpawned
		{
			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_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: 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 >= 3)
				{
					try
					{
						float num = float.Parse(array[0]);
						float num2 = float.Parse(array[1]);
						float num3 = float.Parse(array[2]);
						position = new Vector3(num, num2, num3);
						return true;
					}
					catch (Exception ex)
					{
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogError((object)"Error setting the new spawn point. Check your configuration for formatting issues.");
						MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogWarning((object)ex);
					}
				}
				else
				{
					MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogError((object)"Error setting the new spawn point. Check your configuration for formatting issues.");
				}
			}
			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();
		}
	}
	public static class ResetCommands
	{
		[HarmonyPatch(typeof(Terminal), "InitTerminal")]
		private static class Patch_Terminal_InitTerminal
		{
			[Serializable]
			[CompilerGenerated]
			private sealed class <>c
			{
				public static readonly <>c <>9 = new <>c();

				public static ConsoleEvent <>9__1_0;

				internal void <Postfix>b__1_0(ConsoleEventArgs args)
				{
					//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_0044: Unknown result type (might be due to invalid IL or missing references)
					//IL_0047: Unknown result type (might be due to invalid IL or missing references)
					//IL_004d: Expected O, but got Unknown
					args.Context.AddString("The Gods Accept Your Sacrifice.");
					if (!((Object)(object)Player.m_localPlayer == (Object)null) && Game.instance.m_playerProfile != null)
					{
						GeneralTweaks.OverrideRespawn();
						HitData val = new HitData
						{
							m_damage = 
							{
								m_damage = 99999f
							},
							m_hitType = (HitType)14
						};
						((Character)Player.m_localPlayer).Damage(val);
					}
				}
			}

			[HarmonyPriority(800)]
			private static void Prefix(out bool __state)
			{
				__state = Terminal.m_terminalInitialized;
			}

			private static void Postfix(bool __state)
			{
				//IL_0045: Unknown result type (might be due to invalid IL or missing references)
				//IL_0031: Unknown result type (might be due to invalid IL or missing references)
				//IL_0036: Unknown result type (might be due to invalid IL or missing references)
				//IL_003c: Expected O, but got Unknown
				if (__state)
				{
					return;
				}
				MultiplayerTweaksPlugin.MultiplayerTweaksLogger.LogInfo((object)"Adding Terminal Commands.");
				object obj = <>c.<>9__1_0;
				if (obj == null)
				{
					ConsoleEvent val = delegate(ConsoleEventArgs args)
					{
						//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_0044: Unknown result type (might be due to invalid IL or missing references)
						//IL_0047: Unknown result type (might be due to invalid IL or missing references)
						//IL_004d: Expected O, but got Unknown
						args.Context.AddString("The Gods Accept Your Sacrifice.");
						if (!((Object)(object)Player.m_localPlayer == (Object)null) && Game.instance.m_playerProfile != null)
						{
							GeneralTweaks.OverrideRespawn();
							HitData val2 = new HitData
							{
								m_damage = 
								{
									m_damage = 99999f
								},
								m_hitType = (HitType)14
							};
							((Character)Player.m_localPlayer).Damage(val2);
						}
					};
					<>c.<>9__1_0 = val;
					obj = (object)val;
				}
				new ConsoleCommand("surrender", "", (ConsoleEvent)obj, false, false, false, false, false, (ConsoleOptionsFetcher)null, false, false, false);
			}
		}
	}
	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_0024: Unknown result type (might be due to invalid IL or missing references)
				if (_overrideRespawn)
				{
					_overrideRespawn = false;
				}
				else 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(Minimap), "AddPin")]
		public static class Patch_Minimap_AddPin
		{
			private static void Prefix(PinType type, ref string name)
			{
				//IL_0000: Unknown result type (might be due to invalid IL or missing references)
				//IL_0002: Invalid comparison between Unknown and I4
				if ((int)type == 4)
				{
					name = $"$hud_mapday {EnvMan.instance.GetCurrentDay()}";
				}
			}
		}

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

		private static bool _overrideRespawn;

		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 static void OverrideRespawn()
		{
			Game.instance.m_playerProfile.ClearLoguoutPoint();
			_overrideRespawn = true;
		}
	}
	public class MapTweaks
	{
		[HarmonyPatch(typeof(ZoneSystem), "GetLocationIcons")]
		public static class Patch_ZoneSystem_GetLocationIcons
		{
			private static void Postfix(ref Dictionary<Vector3, string> icons)
			{
				//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
				//IL_00b6: 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_0114: Unknown result type (might be due to invalid IL or missing references)
				//IL_0119: Unknown result type (might be due to invalid IL or missing references)
				//IL_011d: Unknown result type (might be due to invalid IL or missing references)
				//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
				bool flag = !MultiplayerTweaksPlugin.GetEnableTempleMapPin() && Utility.IsNullOrWhiteSpace(MultiplayerTweaksPlugin.GetPlayerDefaultSpawnPoint());
				if (!flag && MultiplayerTweaksPlugin.GetEnableTempleMapPin() && MultiplayerTweaksPlugin.GetEnableHaldorMapPin() && MultiplayerTweaksPlugin.GetEnableHildirMapPin() && MultiplayerTweaksPlugin.GetEnableBogWitchMapPin())
				{
					return;
				}
				List<Vector3> list = new List<Vector3>();
				foreach (KeyValuePair<Vector3, string> icon in icons)
				{
					switch (icon.Value)
					{
					case "StartTemple":
						if (!MultiplayerTweaksPlugin.GetEnableTempleMapPin() && !flag)
						{
							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;
					case "BogWitch_Camp":
						if (!MultiplayerTweaksPlugin.GetEnableBogWitchMapPin())
						{
							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;
			}
		}
	}
}