Decompiled source of ZonePermissions v1.0.1

plugins/ZonePermissions.dll

Decompiled 2 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Jotunn;
using Jotunn.Entities;
using Jotunn.Utils;
using Steamworks;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("ZonePermissions")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("ZonePermissions")]
[assembly: AssemblyCopyright("Copyright ©  2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("1815f7f4-1df3-4e82-9365-033f3811675a")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ZonePermissions;

public static class Client
{
	public struct Client_List
	{
		public ZDOID UID;

		public string SteamID;
	}

	public static class Ward
	{
		public static bool Damage;

		public static bool Pickup;

		public static bool Drop;
	}

	public static List<Client_List> CList = new List<Client_List>();

	public static bool IsZoneAdmin = false;

	public static bool EnforceZones = false;

	public static bool PVPEnforced = false;

	public static bool PVPMode = false;

	public static bool PositionEnforce = false;

	public static bool ShowPosition = false;

	public static bool NoItemLoss = false;

	public static float RespawnTimer = 10f;

	public static void _debug()
	{
		Debug.Log((object)"Loaded Client Data: ");
		Debug.Log((object)("  EnforceZones: " + EnforceZones));
		Debug.Log((object)("  PVPEnforced: " + PVPEnforced));
		Debug.Log((object)("  PVPMode: " + PVPMode));
		Debug.Log((object)("  ShowPosition: " + ShowPosition));
		Debug.Log((object)("  PositionEnforce: " + PositionEnforce));
	}

	public static ZPackage Serialize()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		ZPackage val = new ZPackage();
		if (PVPEnforced)
		{
			PVPMode = true;
		}
		else
		{
			PVPMode = false;
		}
		val.Write(EnforceZones);
		val.Write(PVPEnforced);
		val.Write(PVPMode);
		val.Write(PositionEnforce);
		val.Write(ShowPosition);
		val.Write(Ward.Damage);
		val.Write(Ward.Drop);
		val.Write(Ward.Pickup);
		val.Write(NoItemLoss);
		val.Write(RespawnTimer);
		return val;
	}

	public static void Deserialize(ZPackage data)
	{
		EnforceZones = data.ReadBool();
		PVPEnforced = data.ReadBool();
		PVPMode = data.ReadBool();
		PositionEnforce = data.ReadBool();
		ShowPosition = data.ReadBool();
		Ward.Damage = data.ReadBool();
		Ward.Drop = data.ReadBool();
		Ward.Pickup = data.ReadBool();
		NoItemLoss = data.ReadBool();
		RespawnTimer = data.ReadSingle();
	}

	public static void RPC(ZRpc rpc, ZPackage data)
	{
		Debug.Log((object)"S2C Client (RPC Call)");
		Debug.Log((object)"Before");
		_debug();
		Deserialize(data);
		Debug.Log((object)"After");
		_debug();
	}

	public static void RPC(long uid, ZPackage data)
	{
		Debug.Log((object)"S2C Client (RPC Call)");
		Debug.Log((object)"Before");
		_debug();
		Deserialize(data);
		Debug.Log((object)"After");
		_debug();
	}
}
[BepInPlugin("com.valkyrie.zonepermissions", "Zone Permissions", "1.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class ZonePermissions : BaseUnityPlugin
{
	[HarmonyPatch(typeof(FejdStartup), "AwakePlayFab")]
	private static class FejdStartupAwakePlayfabPatch
	{
		private static void Postfix(FejdStartup __instance)
		{
			//IL_000c: 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)
			if (!Util.isServer())
			{
				CSteamID steamID = SteamUser.GetSteamID();
				MySteamID = ((object)(CSteamID)(ref steamID)).ToString();
				Debug.Log((object)("Caching our SteamID as " + MySteamID));
			}
		}
	}

	[HarmonyPatch(typeof(ZNet), "Awake")]
	private static class ZNetAwakePatch
	{
		private static void Postfix(ZNet __instance)
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				Debug.Log((object)"Registering Server RPCs");
				AddServerRPC();
				return;
			}
			CSteamID steamID = SteamUser.GetSteamID();
			MySteamID = ((object)(CSteamID)(ref steamID)).ToString();
			Debug.Log((object)("Caching our SteamID as " + MySteamID));
			Debug.Log((object)"Registering Client RPCs");
			AddClientRPC();
		}
	}

	[HarmonyPatch(typeof(ZNet))]
	public class ZNetPatch
	{
		[HarmonyPrefix]
		[HarmonyPatch("OnNewConnection")]
		private static void ZNet_OnNewConnectionPrefix(ZNet __instance, ZNetPeer peer)
		{
			if (!Util.isServer())
			{
				Debug.Log((object)$"Server Zone Enforced: {Client.EnforceZones}");
				peer.m_rpc.Register<ZPackage>("ZP_ZoneHandler", (Action<ZRpc, ZPackage>)ZoneHandler.RPC);
				peer.m_rpc.Register<ZPackage>("ZP_Client", (Action<ZRpc, ZPackage>)Client.RPC);
				ZoneHandler.CurrentZoneID = -2;
			}
		}

		[HarmonyPrefix]
		[HarmonyPatch("SendPeerInfo")]
		private static void ZNet_SendPeerInfo(ZNet __instance, ZRpc rpc)
		{
			if (Util.isServer())
			{
				Debug.Log((object)"SendPeerInfo");
				Debug.Log((object)"S2C ZoneHandler (SendPeerInfo)");
				ZoneHandler._debug();
				rpc.Invoke("ZP_ZoneHandler", new object[1] { ZoneHandler.Serialize(0L) });
				Debug.Log((object)"S2C ClientState (SendPeerInfo)");
				Client._debug();
				rpc.Invoke("ZP_Client", new object[1] { Client.Serialize() });
				Util.Connections.Add(new Util.ConnectionData
				{
					rpc = rpc
				});
			}
		}
	}

	[HarmonyPatch]
	public static class ZoneEnforcer
	{
		[HarmonyPatch(typeof(InventoryGui), "UpdateCharacterStats")]
		public static class PVP_Patch
		{
			private static void Postfix(InventoryGui __instance)
			{
				((Selectable)__instance.m_pvp).interactable = Client.IsZoneAdmin || !Client.PVPEnforced;
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Game), "Update")]
		private static void Game__Update()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)Player.m_localPlayer))
			{
				return;
			}
			string text = "";
			bool changed;
			ZoneHandler.Zone z;
			ZoneHandler.ZoneTypes zt;
			bool flag = ZoneHandler.Detect(((Component)Player.m_localPlayer).transform.position, out changed, out z, out zt);
			if (changed)
			{
				if (flag)
				{
					Client.IsZoneAdmin = Util.IsZoneAdmin(z.ID);
					string text2 = ((!zt.PVPEnforce) ? NonEnforcedColor.Value : (zt.PVP ? PVPColor.Value : PVEColor.Value));
					string text3 = z.Name.Replace("_", " ");
					text = "<color=" + text2 + ">Now entering <b>" + text3 + "</b>.</color>";
					string text4 = ((!zt.PVPEnforce) ? string.Empty : (zt.PVP ? "PVP Enabled" : "PVP Disabled"));
					((Character)Player.m_localPlayer).Message((MessageType)2, text, 0, (Sprite)null);
					if (Client.EnforceZones && zt.PVPEnforce && zt.PVP != ((Character)Player.m_localPlayer).IsPVPEnabled() && BiomePVPAnnouncement.Value)
					{
						MessageHud.instance.ShowBiomeFoundMsg(text4, true);
					}
				}
				else
				{
					Client.IsZoneAdmin = Util.IsZoneAdmin(-1);
					string text5 = ((!zt.PVPEnforce) ? NonEnforcedColor.Value : (zt.PVP ? PVPColor.Value : PVEColor.Value));
					string text6 = "The Wilderness";
					text = "<color=" + text5 + ">Now entering <b>" + text6 + "</b>.</color>";
					string text7 = ((!zt.PVPEnforce) ? string.Empty : (zt.PVP ? "PVP Enabled" : "PVP Disabled"));
					((Character)Player.m_localPlayer).Message((MessageType)2, text, 0, (Sprite)null);
					if (Client.EnforceZones && zt.PVPEnforce && zt.PVP != ((Character)Player.m_localPlayer).IsPVPEnabled() && BiomePVPAnnouncement.Value)
					{
						MessageHud.instance.ShowBiomeFoundMsg(text7, true);
					}
				}
				if (!Client.IsZoneAdmin && Client.EnforceZones)
				{
					Client.PVPEnforced = zt.PVPEnforce;
					if (zt.PVPEnforce)
					{
						Client.PVPMode = zt.PVP;
					}
					Client.PositionEnforce = zt.PositionEnforce;
					if (zt.PositionEnforce)
					{
						Client.ShowPosition = zt.ShowPosition;
					}
					Player.m_localPlayer.SetPVP(Client.PVPMode);
					InventoryGui.instance.m_pvp.isOn = Client.PVPMode;
					((Selectable)InventoryGui.instance.m_pvp).interactable = !Client.PVPEnforced;
					ZNet.instance.SetPublicReferencePosition(Client.ShowPosition);
					((Character)Player.m_localPlayer).Message((MessageType)2, text, 0, (Sprite)null);
				}
				ZoneHandler._debug(zt);
				Client._debug();
				return;
			}
			if (!Client.IsZoneAdmin && Client.PVPEnforced && ((Character)Player.m_localPlayer).IsPVPEnabled() != Client.PVPMode)
			{
				Player.m_localPlayer.SetPVP(Client.PVPMode);
			}
			if (!Client.IsZoneAdmin && Client.PositionEnforce)
			{
				ZNet instance = ZNet.instance;
				if (((instance != null) ? new bool?(instance.IsReferencePositionPublic()) : null) != Client.ShowPosition)
				{
					ZNet.instance.SetPublicReferencePosition(Client.ShowPosition);
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(Minimap), "Update")]
		public static void Minimap_Start(Toggle ___m_publicPosition)
		{
			((Selectable)___m_publicPosition).interactable = Client.IsZoneAdmin || !Client.PositionEnforce;
		}
	}

	private static string ConfigFileName = "com.valkyrie.zonepermissions.cfg";

	private static string ConfigFileFullPath;

	public static ConfigEntry<string> ZonePath;

	public static ConfigEntry<int> NexusID;

	public static ConfigEntry<bool> BiomePVPAnnouncement;

	public static ConfigEntry<bool> NoItemLoss;

	public static ConfigEntry<float> RespawnTimer;

	public static ConfigEntry<string> PVPColor;

	public static ConfigEntry<string> PVEColor;

	public static ConfigEntry<string> NonEnforcedColor;

	public static ConfigEntry<bool> WardProtectItemDrop;

	public static ConfigEntry<bool> WardProtectItemPickup;

	public static ConfigEntry<bool> WardProtectDamage;

	public static ConfigEntry<bool> ReloadDetection;

	public static readonly WaitForSeconds OneSecondWait;

	public static readonly WaitForSeconds HalfSecondWait;

	public static CustomRPC RPC_ZoneHandler;

	private static readonly ZonePermissions instance;

	public const string PluginGUID = "com.valkyrie.zonepermissions";

	public const string PluginName = "Zone Permissions";

	public const string PluginVersion = "1.0.0";

	public static string ZoneDir;

	public static string DefaultZonePath;

	public const int AreaRange = 100;

	public static int HealTick;

	public static int DamageTick;

	public static int EffectTick;

	public static Harmony harm;

	public static string MySteamID;

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

	private void SetupConfigWatcher()
	{
		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 CreateConfigValues()
	{
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: Unknown result type (might be due to invalid IL or missing references)
		//IL_001c: Expected O, but got Unknown
		((BaseUnityPlugin)this).Config.SaveOnConfigSet = true;
		ConfigurationManagerAttributes val = new ConfigurationManagerAttributes
		{
			IsAdminOnly = true
		};
		if (Util.isServer())
		{
			ReloadDetection = ((BaseUnityPlugin)this).Config.Bind<bool>("Config", "ReloadDetection", false, "SERVER ONLY: Should the server auto reload if the config file is changed? (May cause DeSync)");
			NoItemLoss = ((BaseUnityPlugin)this).Config.Bind<bool>("Death", "NoItemLoss", false, "SERVER ONLY: Should we prevent a user from losing items/skills on death globally?");
			RespawnTimer = ((BaseUnityPlugin)this).Config.Bind<float>("Death", "RespawnTimer", 10f, "SERVER ONLY: How fast should the clients respawn?");
			ZonePath = ((BaseUnityPlugin)this).Config.Bind<string>("WorldofValheimZones", "ZonePath", DefaultZonePath, "SERVER ONLY: The file path to the zone file. If it does not exist, it will be created with a default zone.");
			WardProtectDamage = ((BaseUnityPlugin)this).Config.Bind<bool>("Ward", "Building_ProtectDamage", false, "SERVER ONLY: Protect buildings from being damaged inside Warded Areas?");
			WardProtectItemPickup = ((BaseUnityPlugin)this).Config.Bind<bool>("Ward", "Item_Pickup", false, "SERVER ONLY: Protect Picking up items in Warded Areas?");
			WardProtectItemDrop = ((BaseUnityPlugin)this).Config.Bind<bool>("Ward", "Item_Drop", false, "SERVER ONLY: Protect Dropping items in Warded Areas?");
		}
		else
		{
			Debug.Log((object)"[ZonePermissions - Client Mode]");
			BiomePVPAnnouncement = ((BaseUnityPlugin)this).Config.Bind<bool>("Biome", "BiomePVPAnnouncement", true, "Should we announce changing PVP in a Biome Announcement? true or false");
			PVPColor = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "PVPColor", "Red", "What color should our 'Now Entering' message be if the zone type has PVP on");
			PVEColor = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "PVEColor", "White", "What color should our 'Now Entering' message be if the zone type has PVE off");
			NonEnforcedColor = ((BaseUnityPlugin)this).Config.Bind<string>("Colors", "NonEnforcedColor", "Yellow", "What color should our 'Now Entering' message be if the zone type has No PVP Enforcement");
		}
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(Player), "OnRespawn")]
	private static void Player__OnRespawn(Player __instance)
	{
		if (!ZNet.instance.IsServer())
		{
			ZoneHandler.CurrentZoneID = -2;
		}
	}

	private static IEnumerator SRPC_Null(long sender, ZPackage package)
	{
		yield return null;
	}

	private static IEnumerator CRPC_ZoneHandler(long sender, ZPackage package)
	{
		Debug.Log((object)"CRPC ZoneHandler");
		ZoneHandler.RPC(sender, package);
		yield return null;
	}

	private void Awake()
	{
		CreateConfigValues();
		if (Util.isServer())
		{
			CreateFiles();
			SetupZoneWatcher();
			Client.Ward.Damage = WardProtectDamage.Value;
			Client.Ward.Pickup = WardProtectItemPickup.Value;
			Client.Ward.Drop = WardProtectItemDrop.Value;
			Client.NoItemLoss = NoItemLoss.Value;
			Client.RespawnTimer = RespawnTimer.Value;
			ZoneHandler.LoadZoneData(DefaultZonePath);
		}
		Client.EnforceZones = true;
		harm.PatchAll();
	}

	private void FixedUpdate()
	{
		ZonePatches.FixedUpdate();
	}

	private static void SetupZoneWatcher()
	{
		Debug.Log((object)"Creating file watcher for Zones");
		FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(ZoneDir);
		fileSystemWatcher.Changed += OnZoneConfigChange;
		fileSystemWatcher.Created += OnZoneConfigChange;
		fileSystemWatcher.Renamed += OnZoneConfigChange;
		fileSystemWatcher.IncludeSubdirectories = true;
		fileSystemWatcher.SynchronizingObject = ThreadingHelper.SynchronizingObject;
		fileSystemWatcher.EnableRaisingEvents = true;
	}

	private static void OnZoneConfigChange(object sender, FileSystemEventArgs e)
	{
		Debug.Log((object)"ZONES FILE CHANGED!");
		ZoneHandler.LoadZoneData(DefaultZonePath);
		SendAllUpdate();
	}

	private static void AddServerRPC()
	{
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_AddZone", (Action<long, ZPackage>)AddZone);
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_ReloadZones", (Action<long, ZPackage>)ReloadZones);
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_ZoneHandler", (Action<long, ZPackage>)ZoneHandler.RPC);
	}

	private static void AddClientRPC()
	{
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_AddZone", (Action<long, ZPackage>)AddZone);
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_ReloadZones", (Action<long, ZPackage>)ReloadZones);
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_ZoneHandler", (Action<long, ZPackage>)ZoneHandler.RPC);
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_ChatMessage", (Action<long, ZPackage>)Util.ShowChatMessage);
		ZRoutedRpc.instance.Register<int, string>("ZonePermissions_ShowMessage", (Action<long, int, string>)RPC_ShowMessage);
		ZRoutedRpc.instance.Register<ZPackage>("ZonePermissions_Client", (Action<long, ZPackage>)Client.RPC);
	}

	private void CreateFiles()
	{
		if (!Directory.Exists(ZoneDir))
		{
			Directory.CreateDirectory(ZoneDir);
		}
		if (!File.Exists(DefaultZonePath))
		{
			File.Create(DefaultZonePath);
		}
	}

	public static void ReloadZones(long sender, ZPackage pkg)
	{
		ZNetPeer peer = ZNet.instance.GetPeer(sender);
		if (peer != null)
		{
			string text = "HackShardGaming.WoV-Zones.Reload";
			string text2 = peer.m_uid.ToString();
			if (true)
			{
				ZoneHandler.LoadZoneData(DefaultZonePath);
				Util.Broadcast("Reloading Zone");
				Debug.Log((object)"S2C ZoneHandler (SendPeerInfo)");
				SendAllUpdate();
			}
			else
			{
				Util.RoutedBroadcast(sender, "Sorry! You do not have the permission to use !ReloadZones (Required Permission: " + text + ")");
			}
		}
	}

	public static void SendAllUpdate()
	{
		Debug.Log((object)"SendAllUpdate");
		foreach (ZNetPeer peer in ZNet.instance.GetPeers())
		{
			ZRoutedRpc.instance.InvokeRoutedRPC(peer.m_uid, "ZonePermissions_ZoneHandler", new object[1] { ZoneHandler.Serialize(peer.m_uid) });
			Debug.Log((object)("Sent update to " + peer.m_uid));
		}
		Debug.Log((object)"Broadcast Reloading Zone");
		Util.Broadcast("Reloading Zones");
	}

	public static void RPC_ShowMessage(long uid, int type, string msg)
	{
		Util.ShowMessage(type, msg);
	}

	public static void AddZone(long sender, ZPackage pkg)
	{
		if (pkg == null || pkg.Size() <= 0)
		{
			return;
		}
		ZNetPeer peer = ZNet.instance.GetPeer(sender);
		if (peer == null)
		{
			return;
		}
		string text = "HackShardGaming.WoV-Zones.Add";
		string text2 = peer.m_uid.ToString();
		if (false)
		{
			string text3 = pkg.ReadString();
			string[] array = text3.Split(new char[1] { ' ' });
			string text4 = array[0];
			Debug.Log((object)"C-<S AddZone (RPC Call)");
			string text5 = array[1];
			ZoneHandler.ZoneTypes zoneTypes = ZoneHandler.FindZoneType(array[1]);
			if (zoneTypes.Name != text5)
			{
				text3 = "ERROR: The requested Zone Type " + text5 + " does not exist!";
				Util.RoutedBroadcast(sender, text3);
				return;
			}
			int num = int.Parse(array[2]);
			if (num < 1 || num > 5)
			{
				text3 = $"ERROR: The requested Priority {num} is out of bounds! (Priorities are ranged from 1-5)!";
				Util.RoutedBroadcast(sender, text3);
				return;
			}
			string text6 = array[3];
			if (text6.ToLower() != "circle" && text6.ToLower() != "square")
			{
				text3 = "ERROR: The requested Shape: " + text6 + " is incorrectly formated! (Shapes can either be circle or square only)";
				Util.RoutedBroadcast(sender, text3);
				return;
			}
			float result = 0f;
			string text7 = array[4];
			if (!float.TryParse(text7, out result))
			{
				text3 = "ERROR: The requested X " + text7 + " is incorrectly formated! (Correct Format is 0.0)!";
				Util.RoutedBroadcast(sender, text3);
				return;
			}
			string text8 = array[5];
			if (!float.TryParse(text8, out result))
			{
				text3 = "ERROR: The requested Y " + text8 + " is incorrectly formated! (Correct Format is 0.0)!";
				Util.RoutedBroadcast(sender, text3);
				return;
			}
			string text9 = array[6];
			if (!float.TryParse(text9, out result))
			{
				text3 = "ERROR: The requested Radius " + text9 + " is incorrectly formated! (Correct Format is 0.0)!";
				Util.RoutedBroadcast(sender, text3);
				return;
			}
			string text10 = text4 + " " + text5 + " " + num + " " + text6 + " " + text7 + " " + text8 + " " + text9;
			File.AppendAllText(DefaultZonePath, text10 + Environment.NewLine);
		}
		else
		{
			Util.RoutedBroadcast(sender, "Sorry! You do not have the permission to use !AddZone (Required Permission: " + text + ")");
			Debug.Log((object)("An unauthorized user " + text2 + " attempted to use the AddZone RPC!"));
			string text11 = pkg.ReadString();
			Debug.Log((object)("Here is a log of the attempted AddZone " + text11));
		}
	}

	static ZonePermissions()
	{
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		//IL_003a: Expected O, but got Unknown
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Expected O, but got Unknown
		//IL_0088: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Expected O, but got Unknown
		string configPath = Paths.ConfigPath;
		char directorySeparatorChar = Path.DirectorySeparatorChar;
		ConfigFileFullPath = configPath + directorySeparatorChar + ConfigFileName;
		OneSecondWait = new WaitForSeconds(1f);
		HalfSecondWait = new WaitForSeconds(0.5f);
		ZoneDir = Path.Combine(Paths.ConfigPath, "ZonePermissions");
		DefaultZonePath = Path.Combine(ZoneDir, "Zones.txt");
		HealTick = 0;
		DamageTick = 0;
		EffectTick = 0;
		harm = new Harmony("ZonePermissions");
		MySteamID = "";
	}
}
public class Util
{
	public class ConnectionData
	{
		public ZRpc rpc;
	}

	public static BindingFlags NonPublicFlags = BindingFlags.Instance | BindingFlags.NonPublic;

	public static List<ConnectionData> Connections = new List<ConnectionData>();

	public static IEnumerator ZoneHandler2(ZRpc rpc)
	{
		Debug.Log((object)"ZoneHandler2");
		rpc.Invoke("ZP_ZoneHandler", new object[1] { ZoneHandler.Serialize(0L) });
		yield return (object)new WaitForSeconds(1f);
	}

	public static IEnumerator Client2(ZRpc rpc)
	{
		Debug.Log((object)"Client2");
		rpc.Invoke("ZP_Client", new object[1] { Client.Serialize() });
		yield return (object)new WaitForSeconds(1f);
	}

	public static void InsertChatMessage(string Message)
	{
		((Terminal)Chat.instance).AddString("<color=grey><b>[Zone Permissions]</b></color> " + Message);
	}

	public static float RestrictionCheckFloatReturn(string restriction)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		CSteamID steamID = SteamUser.GetSteamID();
		string text = ((object)(CSteamID)(ref steamID)).ToString();
		Player localPlayer = Player.m_localPlayer;
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)localPlayer).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text2 = "";
		string text3 = "";
		text3 = zoneTypes.Admins;
		text2 = zoneTypes.Configurations;
		if (text3.Contains(ZonePermissions.MySteamID))
		{
			return 1f;
		}
		if (text2.ToLower().Contains(restriction))
		{
			string text4 = text2.ToLower();
			string text5 = restriction + "(";
			int num = text4.IndexOf(text5) + text5.Length;
			string text6 = "";
			for (int i = num; i < num + 20 && text4[i] != ')'; i++)
			{
				text6 += text4[i];
			}
			float num2 = 1f;
			return Convert.ToSingle(text6, new CultureInfo("en-US"));
		}
		return 1f;
	}

	public static float RestrictionCheckFloatReturnCharacter(Character __instance, string restriction)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		ZNet instance = ZNet.instance;
		ZDOID zDOID = __instance.GetZDOID();
		string hostName = instance.GetPeer(((ZDOID)(ref zDOID)).UserID).m_socket.GetHostName();
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)__instance).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text = "";
		string text2 = "";
		text2 = zoneTypes.Admins;
		text = zoneTypes.Configurations;
		if (text2.Contains(hostName))
		{
			return 1f;
		}
		if (text.ToLower().Contains(restriction))
		{
			string text3 = text.ToLower();
			string text4 = restriction + "(";
			int num = text3.IndexOf(text4) + text4.Length;
			string text5 = "";
			for (int i = num; i < num + 20 && text3[i] != ')'; i++)
			{
				text5 += text3[i];
			}
			float num2 = 1f;
			return Convert.ToSingle(text5, new CultureInfo("en-US"));
		}
		return 1f;
	}

	public static float RestrictionCheckFloatReturnNone(Character __instance, string restriction)
	{
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)__instance).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text = "";
		string text2 = "";
		text2 = zoneTypes.Admins;
		text = zoneTypes.Configurations;
		if (text.ToLower().Contains(restriction))
		{
			string text3 = text.ToLower();
			string text4 = restriction + "(";
			int num = text3.IndexOf(text4) + text4.Length;
			string text5 = "";
			for (int i = num; i < num + 20 && text3[i] != ')'; i++)
			{
				text5 += text3[i];
			}
			float num2 = 1f;
			return Convert.ToSingle(text5, new CultureInfo("en-US"));
		}
		return 1f;
	}

	public static bool RestrictionCheckCharacter(Character __instance, string restriction)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		ZNet instance = ZNet.instance;
		ZDOID zDOID = __instance.GetZDOID();
		string hostName = instance.GetPeer(((ZDOID)(ref zDOID)).UserID).m_socket.GetHostName();
		if (ZoneHandler.Zones.Count() == 0)
		{
			return false;
		}
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)__instance).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text = "";
		string text2 = "";
		text2 = zoneTypes.Admins;
		text = zoneTypes.Configurations;
		if (text2.Contains(hostName))
		{
			return false;
		}
		if (text.ToLower().Contains(restriction))
		{
			return true;
		}
		return false;
	}

	public static bool RestrictionCheckTerrain(TerrainComp __instance, string restriction)
	{
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		if (ZoneHandler.Zones.Count() == 0)
		{
			return false;
		}
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)__instance).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text = "";
		string text2 = "";
		text2 = zoneTypes.Admins;
		text = zoneTypes.Configurations;
		if (text.ToLower().Contains(restriction))
		{
			return true;
		}
		return false;
	}

	public static bool RestrictionCheckNone(Character __instance, string restriction)
	{
		//IL_0030: Unknown result type (might be due to invalid IL or missing references)
		if (ZoneHandler.Zones.Count() == 0)
		{
			return false;
		}
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)__instance).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text = "";
		text = zoneTypes.Configurations;
		if (text.ToLower().Contains(restriction))
		{
			return true;
		}
		return false;
	}

	public static bool RestrictionCheck(string restriction)
	{
		//IL_0037: Unknown result type (might be due to invalid IL or missing references)
		Player localPlayer = Player.m_localPlayer;
		if (ZoneHandler.Zones.Count() == 0)
		{
			return false;
		}
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)localPlayer).transform.position);
		zoneTypes = ((list.Count != 0) ? ZoneHandler.FindZoneType(ZoneHandler.TopZone(list).Type) : ZoneHandler.FindZoneType("wilderness"));
		string text = "";
		string text2 = "";
		text2 = zoneTypes.Admins;
		text = zoneTypes.Configurations;
		if (text2.Contains(ZonePermissions.MySteamID))
		{
			return false;
		}
		if (text.ToLower().Contains(restriction))
		{
			return true;
		}
		return false;
	}

	public static void DoPrivateAreaEffect(Vector3 pos)
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: 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)
		GameObject prefab = ZNetScene.instance.GetPrefab("vfx_lootspawn");
		GameObject val = Object.Instantiate<GameObject>(prefab, pos, Quaternion.identity);
		if (!((Object)(object)Player.m_localPlayer == (Object)null))
		{
			ShowChatMessage(Player.m_localPlayer.GetPlayerID(), "Zone Permissions", "PRIVATE AREA", inWorld: true, pos, (Type)1);
		}
	}

	public static void DoWardedAreaEffect(Vector3 pos)
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		//IL_0013: 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)
		GameObject prefab = ZNetScene.instance.GetPrefab("vfx_lootspawn");
		GameObject val = Object.Instantiate<GameObject>(prefab, pos, Quaternion.identity);
		if (!((Object)(object)Player.m_localPlayer == (Object)null))
		{
			ShowChatMessage(Player.m_localPlayer.GetPlayerID(), "Zone Permissions", "WARDED AREA", inWorld: true, pos, (Type)1);
		}
	}

	public static void ShowMessage(int type, string msg)
	{
		((Character)Player.m_localPlayer).Message((MessageType)type, msg, 0, (Sprite)null);
	}

	public static void ShowChatMessage(long uid, ZPackage pkg)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: 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)
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_0027: Expected O, but got Unknown
		//IL_0036: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		UserInfo val = new UserInfo
		{
			Name = pkg.ReadString(),
			Gamertag = null,
			NetworkUserId = uid.ToString()
		};
		string text = pkg.ReadString();
		bool flag = pkg.ReadBool();
		Vector3 val2 = pkg.ReadVector3();
		Type type = ((object)Chat.instance).GetType();
		if (flag)
		{
			type.GetMethod("AddInworldText", NonPublicFlags).Invoke(Chat.instance, new object[6]
			{
				null,
				uid,
				val2,
				(object)(Type)2,
				val,
				text
			});
		}
		type.GetField("m_hideTimer", NonPublicFlags).SetValue(Chat.instance, 0f);
		((Terminal)Chat.instance).AddString("Zone Permissions", text, (Type)2, false);
	}

	public static void ShowChatMessage(long uid, string username, string msg, bool inWorld = false, Vector3 pos = default(Vector3), Type type = 1)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0014: Unknown result type (might be due to invalid IL or missing references)
		//IL_0022: Expected O, but got Unknown
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0062: Unknown result type (might be due to invalid IL or missing references)
		UserInfo val = new UserInfo
		{
			Name = username,
			Gamertag = null,
			NetworkUserId = uid.ToString()
		};
		Type type2 = ((object)Chat.instance).GetType();
		if (inWorld)
		{
			type2.GetMethod("AddInworldText", NonPublicFlags).Invoke(Chat.instance, new object[6] { null, uid, pos, type, val, msg });
		}
		type2.GetField("m_hideTimer", NonPublicFlags).SetValue(Chat.instance, 0f);
		((Terminal)Chat.instance).AddString("Zone Permissions", msg, (Type)2, false);
	}

	public static void Broadcast(string text, string username = "Zone Permissions", bool inWorld = false)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		ZPackage val = new ZPackage();
		val.Write(username);
		val.Write(text);
		val.Write(inWorld);
		val.Write(new Vector3(0f, 100f, 0f));
		ZRoutedRpc.instance.InvokeRoutedRPC(ZRoutedRpc.Everybody, "ZonePermissions_ChatMessage", new object[1] { val });
	}

	public static void RoutedBroadcast(long peer, string text, string username = "Zone Permissions")
	{
		//IL_002f: Unknown result type (might be due to invalid IL or missing references)
		WorldTextInstance val = Chat.instance.FindExistingWorldText(peer);
		ZRoutedRpc.instance.InvokeRoutedRPC(peer, "ChatMessage", new object[6]
		{
			(object)new Vector3(0f, 100f, 0f),
			(object)(Type)2,
			username,
			val.m_userInfo,
			text,
			val.m_userInfo.NetworkUserId
		});
	}

	public static bool isServer()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Invalid comparison between Unknown and I4
		return (int)SystemInfo.graphicsDeviceType == 4;
	}

	public static bool isAdmin(long sender)
	{
		ZNetPeer peer = ZNet.instance.GetPeer(sender);
		string text = sender.ToString();
		if (ZNet.instance.m_adminList != null && ZNet.instance.m_adminList.Contains(text))
		{
			return true;
		}
		return false;
	}

	public static bool IsZoneAdmin(int zoneID)
	{
		ZoneHandler.ZoneTypes zoneTypes;
		if (zoneID < 0)
		{
			zoneTypes = ZoneHandler.FindZoneType("wilderness");
		}
		else
		{
			Debug.Log((object)$"Checking admin for zone id {zoneID}");
			ZoneHandler.Zone zone = ZoneHandler.Zones.Find((ZoneHandler.Zone z) => z.ID == zoneID);
			Debug.Log((object)("Got Zone: " + zone.Name));
			zoneTypes = ZoneHandler.FindZoneType(zone.Type);
		}
		return zoneTypes.Admins.Contains(ZonePermissions.MySteamID);
	}

	public static ConnectionData GetServer()
	{
		return Connections[0];
	}
}
internal class ZonePatches
{
	[HarmonyPatch(typeof(Player), "OnDeath")]
	public static class Death_Patch
	{
		private static bool Prefix(Player __instance)
		{
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: Expected O, but got Unknown
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_007f: Expected O, but got Unknown
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b9: Expected O, but got Unknown
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d6: Expected O, but got Unknown
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0100: Unknown result type (might be due to invalid IL or missing references)
			//IL_0102: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: Unknown result type (might be due to invalid IL or missing references)
			//IL_0159: Expected I4, but got Unknown
			//IL_0338: Unknown result type (might be due to invalid IL or missing references)
			//IL_0404: Unknown result type (might be due to invalid IL or missing references)
			//IL_045f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0464: Unknown result type (might be due to invalid IL or missing references)
			if (Util.RestrictionCheck("noitemloss") || Client.NoItemLoss)
			{
				Type type = ((object)__instance).GetType();
				bool flag = (bool)type.GetMethod("HardDeath", Util.NonPublicFlags).Invoke(__instance, new object[0]);
				ZNetView val = (ZNetView)type.GetField("m_nview", Util.NonPublicFlags).GetValue(__instance);
				HitData val2 = (HitData)type.GetField("m_lastHit", Util.NonPublicFlags).GetValue(__instance);
				List<Food> list = (List<Food>)type.GetField("m_foods", Util.NonPublicFlags).GetValue(__instance);
				Skills val3 = (Skills)type.GetField("m_skills", Util.NonPublicFlags).GetValue(__instance);
				SEMan val4 = (SEMan)type.GetField("m_seman", Util.NonPublicFlags).GetValue(__instance);
				val.GetZDO().Set(ZDOVars.s_dead, true);
				Game.instance.IncrementPlayerStat((PlayerStatType)0, 1f);
				HitType hitType = val2.m_hitType;
				HitType val5 = hitType;
				switch ((int)val5)
				{
				case 0:
					Game.instance.IncrementPlayerStat((PlayerStatType)55, 1f);
					break;
				case 1:
					Game.instance.IncrementPlayerStat((PlayerStatType)56, 1f);
					break;
				case 2:
					Game.instance.IncrementPlayerStat((PlayerStatType)57, 1f);
					break;
				case 3:
					Game.instance.IncrementPlayerStat((PlayerStatType)58, 1f);
					break;
				case 4:
					Game.instance.IncrementPlayerStat((PlayerStatType)59, 1f);
					break;
				case 5:
					Game.instance.IncrementPlayerStat((PlayerStatType)60, 1f);
					break;
				case 6:
					Game.instance.IncrementPlayerStat((PlayerStatType)61, 1f);
					break;
				case 7:
					Game.instance.IncrementPlayerStat((PlayerStatType)62, 1f);
					break;
				case 8:
					Game.instance.IncrementPlayerStat((PlayerStatType)64, 1f);
					break;
				case 9:
					Game.instance.IncrementPlayerStat((PlayerStatType)63, 1f);
					break;
				case 10:
					Game.instance.IncrementPlayerStat((PlayerStatType)65, 1f);
					break;
				case 11:
					Game.instance.IncrementPlayerStat((PlayerStatType)66, 1f);
					break;
				case 12:
					Game.instance.IncrementPlayerStat((PlayerStatType)67, 1f);
					break;
				case 13:
					Game.instance.IncrementPlayerStat((PlayerStatType)68, 1f);
					break;
				case 14:
					Game.instance.IncrementPlayerStat((PlayerStatType)69, 1f);
					break;
				case 15:
					Game.instance.IncrementPlayerStat((PlayerStatType)70, 1f);
					break;
				case 16:
					Game.instance.IncrementPlayerStat((PlayerStatType)71, 1f);
					break;
				case 17:
					Game.instance.IncrementPlayerStat((PlayerStatType)72, 1f);
					break;
				case 18:
					Game.instance.IncrementPlayerStat((PlayerStatType)73, 1f);
					break;
				default:
					ZLog.LogWarning((object)("Not implemented death type " + ((object)(HitType)(ref val2.m_hitType)).ToString()));
					break;
				}
				Game.instance.GetPlayerProfile().SetDeathPoint(((Component)__instance).transform.position);
				type.GetMethod("CreateDeathEffects", Util.NonPublicFlags).Invoke(__instance, new object[0]);
				list.Clear();
				if (ZoneSystem.instance.GetGlobalKey((GlobalKeys)17))
				{
					val3.Clear();
				}
				else if (flag)
				{
					val3.OnDeath();
				}
				val4.RemoveAllStatusEffects(false);
				Game.instance.RequestRespawn(10f, true);
				type.GetField("m_timeSinceDeath", Util.NonPublicFlags).SetValue(__instance, 0f);
				if (!flag)
				{
					Util.ShowMessage(1, "$msg_softdeath");
				}
				((Character)__instance).Message((MessageType)2, "$msg_youdied", 0, (Sprite)null);
				Minimap.instance.AddPin(((Component)__instance).transform.position, (PinType)4, $"$hud_mapday {EnvMan.instance.GetDay(ZNet.instance.GetTimeSeconds())}", true, false, 0L, "");
				if (((Character)__instance).m_onDeath != null)
				{
					((Character)__instance).m_onDeath();
				}
				Biome currentBiome = __instance.GetCurrentBiome();
				string text = "biome:" + ((object)(Biome)(ref currentBiome)).ToString();
				Gogan.LogEvent("Game", "Death", text, 0L);
				return false;
			}
			ZoneHandler.CurrentZoneID = -2;
			return true;
		}
	}

	[HarmonyPatch(typeof(Attack), "SpawnOnHitTerrain")]
	public static class Attack_Patch
	{
		private static bool Prefix(Vector3 hitPoint)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			if (Util.isServer())
			{
				return true;
			}
			if (Util.RestrictionCheck("nopickaxe") || Util.RestrictionCheck("noterrain"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(hitPoint + ((Component)Player.m_localPlayer).transform.forward * 1f);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(TerrainOp), "Awake")]
	public static class TerrainComp_Patch
	{
		private static bool Prefix(TerrainOp __instance)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && Util.RestrictionCheck("noterrain"))
			{
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
				return false;
			}
			return true;
		}
	}

	[HarmonyPatch(typeof(Container), "Interact")]
	public static class Container_Patch
	{
		private static bool Prefix(Container __instance)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			bool flag = false;
			if (Util.isServer())
			{
				return true;
			}
			if (Util.RestrictionCheck("nochest"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(Door), "Interact")]
	public static class Door_Patch
	{
		private static bool Prefix(Door __instance)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Util.RestrictionCheck("nodoors"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(Sign), "Interact")]
	public static class Sign_Patch
	{
		private static bool Prefix(Door __instance)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Util.RestrictionCheck("nosigns"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(Player), "PlacePiece")]
	public static class NoBuild_Patch
	{
		private static bool Prefix(Player __instance)
		{
			//IL_0040: Unknown result type (might be due to invalid IL or missing references)
			//IL_0047: Expected O, but got Unknown
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Util.RestrictionCheck("nobuilding"))
			{
				flag = true;
				Type type = ((object)__instance).GetType();
				GameObject val = (GameObject)type.GetField("m_placementGhost", Util.NonPublicFlags).GetValue(__instance);
				Util.DoPrivateAreaEffect(val.transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(Player), "RemovePiece")]
	public static class NoBuild_Patch2
	{
		private static bool Prefix(Player __instance)
		{
			//IL_0027: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Util.RestrictionCheck("nobuilding"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(WearNTear), "Damage")]
	public static class Building_Wear_N_Tear_Patch
	{
		private static bool Prefix(WearNTear __instance, HitData hit)
		{
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Expected O, but got Unknown
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_026c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0271: Unknown result type (might be due to invalid IL or missing references)
			//IL_027b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0181: Unknown result type (might be due to invalid IL or missing references)
			//IL_022b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f6: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			bool flag2 = false;
			Debug.Log((object)"pre allPrivateAreas");
			List<PrivateArea> list = (List<PrivateArea>)typeof(PrivateArea).GetField("m_allAreas", BindingFlags.Static | BindingFlags.NonPublic).GetValue((object?)new PrivateArea());
			Debug.Log((object)"post allPrivateAreas");
			foreach (PrivateArea item in list)
			{
				Debug.Log((object)"privateArea");
				Type type = ((object)item).GetType();
				Debug.Log((object)"privateArea type");
				bool flag3 = (bool)type.GetMethod("IsEnabled", Util.NonPublicFlags).Invoke(item, new object[0]);
				Debug.Log((object)"privateArea reflection 1");
				bool flag4 = (bool)type.GetMethod("IsInside", Util.NonPublicFlags).Invoke(item, new object[2]
				{
					((Component)__instance).transform.position,
					0
				});
				Debug.Log((object)"privateArea reflection 2");
				if (flag3 && flag4)
				{
					flag = true;
					break;
				}
			}
			Debug.Log((object)"wnt check iswarded");
			if (Client.Ward.Damage && flag)
			{
				ZDOID attacker = hit.m_attacker;
				bool flag5 = false;
				List<Character> list2 = new List<Character>();
				foreach (Character allCharacter in Character.GetAllCharacters())
				{
					if (allCharacter.GetZDOID() == attacker && Object.op_Implicit((Object)(object)((Component)allCharacter).GetComponent<Player>()))
					{
						flag5 = true;
					}
				}
				if (!flag5)
				{
					PrivateArea.CheckAccess(((Component)__instance).transform.position, 0f, true, false);
					flag2 = true;
					return !flag2;
				}
				if (!PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false))
				{
					Util.DoWardedAreaEffect(((Component)__instance).transform.position);
					MessageHud.instance.ShowMessage((MessageType)1, "This is a Warded Area", 0, (Sprite)null);
					flag2 = true;
					return !flag2;
				}
			}
			Debug.Log((object)"wnt check nobuilddamage");
			if (Util.RestrictionCheck("nobuilddamage"))
			{
				flag2 = true;
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position + Vector3.up * 0.5f);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag2;
		}
	}

	[HarmonyPatch(typeof(ItemDrop), "Interact")]
	public static class NoDropInteraction_Patch
	{
		private static bool Prefix(ItemDrop __instance)
		{
			//IL_0024: 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_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Client.Ward.Drop && PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false) && !PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false))
			{
				Util.DoWardedAreaEffect(((Component)__instance).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Warded Area", 0, (Sprite)null);
				flag = true;
				return !flag;
			}
			if (Util.RestrictionCheck("noitempickup"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(((Component)__instance).transform.position + Vector3.up * 0.5f);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(Player), "AutoPickup")]
	public static class NoAutoPickup_Patch
	{
		private static bool Prefix(Player __instance)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			//IL_0055: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			Vector3 position = ((Component)__instance).transform.position;
			if (Client.Ward.Pickup && PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false) && !PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, false, false))
			{
				flag = true;
				return !flag;
			}
			if (Util.RestrictionCheck("noitempickup"))
			{
				flag = true;
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(InventoryGrid), "OnLeftClick")]
	public static class No_Inventory_Ctrl_Left_Click
	{
		private static bool Prefix(InventoryGrid __instance)
		{
			//IL_0059: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_010d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: Unknown result type (might be due to invalid IL or missing references)
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Object.op_Implicit((Object)(object)Player.m_localPlayer) && (Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305)))
			{
				if (Client.Ward.Drop && PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false) && !PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false))
				{
					Util.DoWardedAreaEffect(((Component)Player.m_localPlayer).transform.position);
					MessageHud.instance.ShowMessage((MessageType)1, "This is a Warded Area", 0, (Sprite)null);
					flag = true;
					return !flag;
				}
				if (Util.RestrictionCheck("noitemdrop") && (Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305)))
				{
					flag = true;
					Util.DoPrivateAreaEffect(((Component)Player.m_localPlayer).transform.position + Vector3.up * 0.5f);
					MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
				}
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(InventoryGui), "OnDropOutside")]
	public static class InventoryGui_No_Drop_Patch
	{
		private static bool Prefix(InventoryGui __instance)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: 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)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f1: 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_0098: Unknown result type (might be due to invalid IL or missing references)
			if (Util.isServer())
			{
				return true;
			}
			bool flag = false;
			if (Client.Ward.Drop && PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false) && !PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false))
			{
				bool flag2 = PrivateArea.CheckAccess(((Component)Player.m_localPlayer).transform.position, 0f, true, false);
				long playerID = Player.m_localPlayer.GetPlayerID();
				Util.DoWardedAreaEffect(((Component)Player.m_localPlayer).transform.position);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Warded Area", 0, (Sprite)null);
				flag = true;
				return !flag;
			}
			if (Util.RestrictionCheck("noitemdrop"))
			{
				flag = true;
				Util.DoPrivateAreaEffect(((Component)Player.m_localPlayer).transform.position + Vector3.up * 0.5f);
				MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
			}
			return !flag;
		}
	}

	[HarmonyPatch(typeof(Character), "Damage")]
	public static class Damage_Modifier
	{
		public static void Prefix(Character __instance, HitData hit, ZNetView ___m_nview)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Invalid comparison between Unknown and I4
			//IL_011c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0122: Invalid comparison between Unknown and I4
			//IL_002b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Invalid comparison between Unknown and I4
			if ((int)__instance.m_faction > 0)
			{
				Debug.Log((object)"A monster is being attacked!");
				if (Util.RestrictionCheckNone(__instance, "damagemultipliertomobs") && (int)__instance.m_faction > 0)
				{
					float num = Util.RestrictionCheckFloatReturnNone(__instance, "damagemultipliertomobs");
					Debug.Log((object)$"Multiplier: {num}");
					hit.m_damage.m_damage *= num;
					hit.m_damage.m_blunt *= num;
					hit.m_damage.m_slash *= num;
					hit.m_damage.m_pierce *= num;
					hit.m_damage.m_chop *= num;
					hit.m_damage.m_pickaxe *= num;
					hit.m_damage.m_fire *= num;
					hit.m_damage.m_frost *= num;
					hit.m_damage.m_lightning *= num;
					hit.m_damage.m_poison *= num;
					hit.m_damage.m_spirit *= num;
				}
			}
			else if ((int)__instance.m_faction == 0)
			{
				Debug.Log((object)"A player is being Attacked!");
				if (Util.RestrictionCheckNone(__instance, "damagemultipliertoplayers"))
				{
					float num2 = Util.RestrictionCheckFloatReturnNone(__instance, "damagemultipliertoplayers");
					Debug.Log((object)$"Mutliplier: {num2}");
					hit.m_damage.m_damage *= num2;
					hit.m_damage.m_blunt *= num2;
					hit.m_damage.m_slash *= num2;
					hit.m_damage.m_pierce *= num2;
					hit.m_damage.m_chop *= num2;
					hit.m_damage.m_pickaxe *= num2;
					hit.m_damage.m_fire *= num2;
					hit.m_damage.m_frost *= num2;
					hit.m_damage.m_lightning *= num2;
					hit.m_damage.m_poison *= num2;
					hit.m_damage.m_spirit *= num2;
				}
			}
		}
	}

	[HarmonyPatch(typeof(Destructible), "Damage")]
	public static class Destructible_Modifier
	{
		public static void Prefix(Destructible __instance, HitData hit)
		{
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.isServer())
			{
				if (Util.RestrictionCheck("nodamagetotrees"))
				{
					float num = 0f;
					hit.m_damage.m_damage *= num;
					hit.m_damage.m_blunt *= num;
					hit.m_damage.m_slash *= num;
					hit.m_damage.m_pierce *= num;
					hit.m_damage.m_chop *= num;
					hit.m_damage.m_pickaxe *= num;
					hit.m_damage.m_fire *= num;
					hit.m_damage.m_frost *= num;
					hit.m_damage.m_lightning *= num;
					hit.m_damage.m_poison *= num;
					hit.m_damage.m_spirit *= num;
					Util.DoPrivateAreaEffect(((Component)Player.m_localPlayer).transform.position + Vector3.up * 0.5f);
					MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
				}
				else if (Util.RestrictionCheck("damagemultipliertotrees"))
				{
					float num2 = Util.RestrictionCheckFloatReturn("damagemultipliertotrees");
					hit.m_damage.m_damage *= num2;
					hit.m_damage.m_blunt *= num2;
					hit.m_damage.m_slash *= num2;
					hit.m_damage.m_pierce *= num2;
					hit.m_damage.m_chop *= num2;
					hit.m_damage.m_pickaxe *= num2;
					hit.m_damage.m_fire *= num2;
					hit.m_damage.m_frost *= num2;
					hit.m_damage.m_lightning *= num2;
					hit.m_damage.m_poison *= num2;
					hit.m_damage.m_spirit *= num2;
				}
			}
		}
	}

	[HarmonyPatch(typeof(TreeBase), "Damage")]
	public static class TreeBase_Modifier
	{
		public static void Prefix(TreeBase __instance, HitData hit)
		{
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.isServer())
			{
				if (Util.RestrictionCheck("nodamagetotrees"))
				{
					float num = 0f;
					hit.m_damage.m_damage *= num;
					hit.m_damage.m_blunt *= num;
					hit.m_damage.m_slash *= num;
					hit.m_damage.m_pierce *= num;
					hit.m_damage.m_chop *= num;
					hit.m_damage.m_pickaxe *= num;
					hit.m_damage.m_fire *= num;
					hit.m_damage.m_frost *= num;
					hit.m_damage.m_lightning *= num;
					hit.m_damage.m_poison *= num;
					hit.m_damage.m_spirit *= num;
					Util.DoPrivateAreaEffect(((Component)Player.m_localPlayer).transform.position + Vector3.up * 0.5f);
					MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
				}
				else if (Util.RestrictionCheck("damagemultipliertotrees"))
				{
					float num2 = Util.RestrictionCheckFloatReturn("damagemultipliertotrees");
					hit.m_damage.m_damage *= num2;
					hit.m_damage.m_blunt *= num2;
					hit.m_damage.m_slash *= num2;
					hit.m_damage.m_pierce *= num2;
					hit.m_damage.m_chop *= num2;
					hit.m_damage.m_pickaxe *= num2;
					hit.m_damage.m_fire *= num2;
					hit.m_damage.m_frost *= num2;
					hit.m_damage.m_lightning *= num2;
					hit.m_damage.m_poison *= num2;
					hit.m_damage.m_spirit *= num2;
				}
			}
		}
	}

	[HarmonyPatch(typeof(TreeLog), "Damage")]
	public static class TreeLog_Modifier
	{
		public static void Prefix(TreeLog __instance, HitData hit)
		{
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
			if (!Util.isServer())
			{
				if (Util.RestrictionCheck("nodamagetotrees"))
				{
					float num = 0f;
					hit.m_damage.m_damage *= num;
					hit.m_damage.m_blunt *= num;
					hit.m_damage.m_slash *= num;
					hit.m_damage.m_pierce *= num;
					hit.m_damage.m_chop *= num;
					hit.m_damage.m_pickaxe *= num;
					hit.m_damage.m_fire *= num;
					hit.m_damage.m_frost *= num;
					hit.m_damage.m_lightning *= num;
					hit.m_damage.m_poison *= num;
					hit.m_damage.m_spirit *= num;
					Util.DoPrivateAreaEffect(((Component)Player.m_localPlayer).transform.position + Vector3.up * 0.5f);
					MessageHud.instance.ShowMessage((MessageType)1, "This is a Private Area", 0, (Sprite)null);
				}
				else if (Util.RestrictionCheck("damagemultipliertotrees"))
				{
					float num2 = Util.RestrictionCheckFloatReturn("damagemultipliertotrees");
					hit.m_damage.m_damage *= num2;
					hit.m_damage.m_blunt *= num2;
					hit.m_damage.m_slash *= num2;
					hit.m_damage.m_pierce *= num2;
					hit.m_damage.m_chop *= num2;
					hit.m_damage.m_pickaxe *= num2;
					hit.m_damage.m_fire *= num2;
					hit.m_damage.m_frost *= num2;
					hit.m_damage.m_lightning *= num2;
					hit.m_damage.m_poison *= num2;
					hit.m_damage.m_spirit *= num2;
				}
			}
		}
	}

	public static void FixedUpdate()
	{
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		//IL_0103: Unknown result type (might be due to invalid IL or missing references)
		//IL_0113: Unknown result type (might be due to invalid IL or missing references)
		//IL_011f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0134: Unknown result type (might be due to invalid IL or missing references)
		//IL_013f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0144: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_014b: Unknown result type (might be due to invalid IL or missing references)
		//IL_014f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0159: Unknown result type (might be due to invalid IL or missing references)
		//IL_015e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0163: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0178: Unknown result type (might be due to invalid IL or missing references)
		//IL_0182: Unknown result type (might be due to invalid IL or missing references)
		//IL_0189: Unknown result type (might be due to invalid IL or missing references)
		//IL_0240: Unknown result type (might be due to invalid IL or missing references)
		//IL_0247: Expected O, but got Unknown
		if (ZonePermissions.EffectTick > 0)
		{
			ZonePermissions.EffectTick--;
		}
		if (ZonePermissions.HealTick > 0)
		{
			ZonePermissions.HealTick--;
		}
		if (ZonePermissions.DamageTick > 0)
		{
			ZonePermissions.DamageTick--;
		}
		Player localPlayer = Player.m_localPlayer;
		if (!((Object)(object)localPlayer != (Object)null))
		{
			return;
		}
		ZoneHandler.Zone zone = default(ZoneHandler.Zone);
		ZoneHandler.ZoneTypes zoneTypes = new ZoneHandler.ZoneTypes();
		List<ZoneHandler.Zone> list = ZoneHandler.ListOccupiedZones(((Component)localPlayer).transform.position);
		if (list.Count == 0)
		{
			zoneTypes = ZoneHandler.FindZoneType("wilderness");
		}
		else
		{
			zone = ZoneHandler.TopZone(list);
			zoneTypes = ZoneHandler.FindZoneType(zone.Type);
		}
		string admins = zoneTypes.Admins;
		string configurations = zoneTypes.Configurations;
		if (admins.Contains(ZonePermissions.MySteamID))
		{
			return;
		}
		if (configurations.ToLower().Contains("pushaway"))
		{
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(zone.Position.x, ((Component)localPlayer).transform.position.y, zone.Position.y);
			Vector3 position = ((Component)localPlayer).transform.position;
			Vector3 val2 = ((Component)localPlayer).transform.position - val;
			Vector3 val3 = position + ((Vector3)(ref val2)).normalized * 0.15f;
			((Component)localPlayer).transform.position = new Vector3(val3.x, ((Component)localPlayer).transform.position.y, val3.z);
		}
		if (configurations.ToLower().Contains("periodicdamage") && ZonePermissions.DamageTick <= 0)
		{
			ZonePermissions.DamageTick = 100;
			string text = configurations.ToLower();
			int num = text.IndexOf("periodicdamage(") + "periodicdamage(".Length;
			string text2 = "";
			for (int i = num; i < num + 30 && text[i] != ')'; i++)
			{
				text2 += text[i];
			}
			int result = 0;
			HitData val4 = new HitData();
			string[] array = text2.Split(new char[1] { ',' });
			if (array.Count() == 2)
			{
				int.TryParse(array[1], out result);
				if (array[0].ToLower() == "fire")
				{
					val4.m_damage.m_fire = result;
				}
				else if (array[0].ToLower() == "frost")
				{
					val4.m_damage.m_frost = result;
				}
				else if (array[0].ToLower() == "poison")
				{
					val4.m_damage.m_poison = result;
				}
				else if (array[0].ToLower() == "lightning")
				{
					val4.m_damage.m_lightning = result;
				}
				else if (array[0].ToLower() == "pierce")
				{
					val4.m_damage.m_pierce = result;
				}
				else if (array[0].ToLower() == "blunt")
				{
					val4.m_damage.m_blunt = result;
				}
				else if (array[0].ToLower() == "slash")
				{
					val4.m_damage.m_slash = result;
				}
				else if (array[0].ToLower() == "damage")
				{
					val4.m_damage.m_damage = result;
				}
				else
				{
					val4.m_damage.m_fire = result;
				}
			}
			else
			{
				int.TryParse(text2, out result);
				val4.m_damage.m_fire = result;
			}
			((Character)localPlayer).Damage(val4);
		}
		if (configurations.ToLower().Contains("periodicheal") && ZonePermissions.HealTick <= 0)
		{
			ZonePermissions.HealTick = 50;
			string text3 = configurations.ToLower();
			int num2 = text3.IndexOf("periodicheal(") + "periodicheal(".Length;
			string text4 = "";
			for (int j = num2; j < num2 + 20 && text3[j] != ')'; j++)
			{
				text4 += text3[j];
			}
			int result2 = 0;
			int.TryParse(text4, out result2);
			((Character)localPlayer).Heal((float)result2, true);
		}
	}
}
public static class ZoneHandler
{
	public class ZoneTypes
	{
		public string Name = "Unknown";

		public bool PVP = false;

		public bool PVPEnforce = false;

		public bool ShowPosition = true;

		public bool PositionEnforce = false;

		public string Admins = "null";

		public string Configurations = "none";
	}

	public struct Zone
	{
		public int ID;

		public string Name;

		public string Type;

		public int Priority;

		public string Shape;

		public Vector2 Position;

		public float Radius;

		public Zone(int _ID, string _Name, string _Type, int _Priority, string _Shape, Vector2 _Position, float _Radius)
		{
			//IL_0027: 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)
			ID = _ID;
			Name = _Name;
			Type = _Type;
			Priority = _Priority;
			Shape = _Shape;
			Position = _Position;
			Radius = _Radius;
		}
	}

	public static int CurrentZoneID = -2;

	public static List<Zone> Zones = new List<Zone>();

	public static List<ZoneTypes> ZoneT = new List<ZoneTypes>();

	public static void _debug(Zone z)
	{
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		Debug.Log((object)$"   {z.ID} ({z.Name}, {z.Type}, {z.Priority}, {z.Position}, {z.Radius})");
	}

	public static void _debug(List<Zone> z)
	{
		Debug.Log((object)"Loaded Zone Data: ");
		Debug.Log((object)("  Zone Cnt: " + z.Count));
		foreach (Zone item in z)
		{
			_debug(item);
		}
	}

	public static void _debug(ZoneTypes zt)
	{
		Debug.Log((object)$"  Type: {zt.Name} -> [ {zt.PVP}, {zt.PVPEnforce}, {zt.ShowPosition}, {zt.PositionEnforce}, [{zt.Admins}], [{zt.Configurations}] ]");
	}

	public static void _debug(List<ZoneTypes> zt)
	{
		Debug.Log((object)"Loaded Zone Type Data: ");
		Debug.Log((object)("  Zone Type Cnt: " + zt.Count));
		foreach (ZoneTypes item in zt)
		{
			_debug(item);
		}
	}

	public static void _debug()
	{
		_debug(ZoneT);
		_debug(Zones);
	}

	public static List<Zone> ListOccupiedZones(Vector3 point)
	{
		//IL_0003: Unknown result type (might be due to invalid IL or missing references)
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Unknown result type (might be due to invalid IL or missing references)
		//IL_0066: 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_007c: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c5: 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_0085: Unknown result type (might be due to invalid IL or missing references)
		//IL_0092: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
		Vector2 val = default(Vector2);
		((Vector2)(ref val))..ctor(point.x, point.z);
		List<Zone> list = new List<Zone>();
		foreach (Zone zone in Zones)
		{
			string shape = zone.Shape;
			string text = shape;
			if (text == "square")
			{
				float radius = zone.Radius;
				if (zone.Position.x + radius > val.x && zone.Position.x - radius < val.x && zone.Position.y + radius > val.y && zone.Position.y - radius < val.y)
				{
					list.Add(zone);
				}
			}
			else if (Vector2.Distance(val, zone.Position) <= zone.Radius)
			{
				list.Add(zone);
			}
		}
		return list;
	}

	public static Zone TopZone(List<Zone> z)
	{
		z.Sort((Zone a, Zone b) => a.Priority.CompareTo(b.Priority));
		return z[0];
	}

	public static ZoneTypes FindZoneType(string ztType)
	{
		if (!ZoneT.Any((ZoneTypes b) => b.Name == ztType))
		{
			return new ZoneTypes();
		}
		return ZoneT.Find((ZoneTypes a) => a.Name == ztType) ?? new ZoneTypes();
	}

	public static bool Detect(Vector3 position, out bool changed, out Zone z, out ZoneTypes zt)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		List<Zone> list = ListOccupiedZones(position);
		if (list.Count == 0)
		{
			z = default(Zone);
			zt = new ZoneTypes();
			if (CurrentZoneID != -1)
			{
				CurrentZoneID = -1;
				zt = FindZoneType("wilderness");
				changed = true;
			}
			else
			{
				changed = false;
			}
			return false;
		}
		z = TopZone(list);
		zt = new ZoneTypes();
		if (CurrentZoneID != z.ID)
		{
			zt = FindZoneType(z.Type);
			CurrentZoneID = z.ID;
			changed = true;
		}
		else
		{
			changed = false;
		}
		return true;
	}

	public static ZPackage Serialize(long SteamID = 0L)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_011a: Unknown result type (might be due to invalid IL or missing references)
		//IL_012d: Unknown result type (might be due to invalid IL or missing references)
		ZPackage val = new ZPackage();
		val.Write(ZoneT.Count);
		foreach (ZoneTypes item in ZoneT)
		{
			val.Write(item.Name);
			val.Write(item.PVP);
			val.Write(item.PVPEnforce);
			val.Write(item.ShowPosition);
			val.Write(item.PositionEnforce);
			val.Write(item.Admins);
			val.Write(item.Configurations);
		}
		val.Write(Zones.Count);
		foreach (Zone zone in Zones)
		{
			val.Write(zone.ID);
			val.Write(zone.Name);
			val.Write(zone.Type);
			val.Write(zone.Priority);
			val.Write(zone.Shape);
			val.Write(zone.Position.x);
			val.Write(zone.Position.y);
			val.Write(zone.Radius);
		}
		return val;
	}

	public static void Deserialize(ZPackage package)
	{
		//IL_0100: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		ZoneT.Clear();
		int num = package.ReadInt();
		for (int i = 0; i < num; i++)
		{
			ZoneT.Add(new ZoneTypes
			{
				Name = package.ReadString(),
				PVP = package.ReadBool(),
				PVPEnforce = package.ReadBool(),
				ShowPosition = package.ReadBool(),
				PositionEnforce = package.ReadBool(),
				Admins = package.ReadString(),
				Configurations = package.ReadString()
			});
		}
		Zones.Clear();
		int num2 = package.ReadInt();
		for (int j = 0; j < num2; j++)
		{
			Zones.Add(new Zone
			{
				ID = package.ReadInt(),
				Name = package.ReadString(),
				Type = package.ReadString(),
				Priority = package.ReadInt(),
				Shape = package.ReadString(),
				Position = new Vector2(package.ReadSingle(), package.ReadSingle()),
				Radius = package.ReadSingle()
			});
		}
	}

	public static void RPC(ZRpc rpc, ZPackage data)
	{
		Debug.Log((object)"S2C Zone (RPC Call)");
		Debug.Log((object)"Before");
		_debug();
		Deserialize(data);
		Debug.Log((object)"After");
		_debug();
	}

	public static void RPC(long rpc, ZPackage data)
	{
		Debug.Log((object)"S2C Zone (RPC Call)");
		Debug.Log((object)"Before");
		_debug();
		Deserialize(data);
		Debug.Log((object)"After");
		_debug();
	}

	public static void LoadZoneData(string ZonePath)
	{
		//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
		Debug.Log((object)("Loading zone file: " + ZonePath));
		ZoneT.Clear();
		Zones.Clear();
		int num = 0;
		string[] array = File.ReadAllLines(ZonePath);
		foreach (string text in array)
		{
			if (string.IsNullOrWhiteSpace(text) || text[0] == '#')
			{
				continue;
			}
			string[] array2 = text.Split(new char[1] { ' ' });
			if (array2[0].ToLower() == "type:")
			{
				Debug.Log((object)("Loading Type: " + array2[1]));
				ZoneTypes zoneTypes = new ZoneTypes
				{
					Name = array2[1]
				};
				if (array2.Length >= 3)
				{
					zoneTypes.PVP = bool.Parse(array2[2]);
				}
				if (array2.Length >= 4)
				{
					zoneTypes.PVPEnforce = bool.Parse(array2[3]);
				}
				if (array2.Length >= 5)
				{
					zoneTypes.ShowPosition = bool.Parse(array2[4]);
				}
				if (array2.Length >= 6)
				{
					zoneTypes.PositionEnforce = bool.Parse(array2[5]);
				}
				ZoneT.Add(zoneTypes);
			}
			else if (array2[0].ToLower() == "configuration:")
			{
				string text2 = text.Replace(": ", "|");
				string[] array3 = text2.Replace(" | ", "|").Split(new char[1] { '|' });
				ZoneTypes zoneTypes2 = FindZoneType(array3[1]);
				if (zoneTypes2.Name.ToLower() != array3[1].ToString().ToLower())
				{
					Debug.Log((object)("ERROR: While applying custom configuration for the Zone Type: " + array3[1] + ","));
					Debug.Log((object)("Zone Type: " + array3[1] + " Does not exist in the " + ZonePermissions.DefaultZonePath + " file!"));
					return;
				}
				zoneTypes2.Admins = array3[2];
				zoneTypes2.Configurations = array3[3];
			}
			else if (array2.Length != 7)
			{
				Debug.Log((object)("Zone " + text + " is not correctly formated!"));
			}
			else
			{
				Debug.Log((object)("Loading Zone: " + array2[0]));
				Zone item = default(Zone);
				item.Name = array2[0];
				item.Type = array2[1];
				item.Priority = int.Parse(array2[2]);
				item.Shape = array2[3];
				Vector2 val = Vector2.op_Implicit(default(Vector3));
				CultureInfo provider = new CultureInfo("en-US");
				item.Position = new Vector2(Convert.ToSingle(array2[4], provider), Convert.ToSingle(array2[5], provider));
				item.Radius = Convert.ToSingle(array2[6], provider);
				item.ID = num;
				Zones.Add(item);
				num++;
			}
		}
		_debug();
	}
}