Decompiled source of APEX Prisoners v3.0.1

Localia.APEX_Prisoners.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Agents;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using GameData;
using Gear;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Player;
using SNetwork;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("APEX_Prisoners")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("APEX_Prisoners")]
[assembly: AssemblyTitle("APEX_Prisoners")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace APEX_Prisoners
{
	[BepInPlugin("Localia.APEX_Prisoners", "APEX_Prisoners", "3.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class EntryPoint : BasePlugin
	{
		private Harmony m_Harmony;

		public static ConfigEntry<bool> is_allowed_recoil { get; private set; }

		public static ConfigEntry<bool> is_allowed_slide { get; private set; }

		public static ConfigEntry<bool> is_allowed_RunReload { get; private set; }

		public override void Load()
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Expected O, but got Unknown
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			m_Harmony = new Harmony("Localia.APEX_Prisoners");
			m_Harmony.PatchAll();
			ConfigFile val = new ConfigFile(Path.Combine(Paths.ConfigPath, "Localia.APEX_Prisoners.cfg"), true);
			is_allowed_recoil = val.Bind<bool>("APEX: Prisoners", "Allow Recoil Reduce", true, "The recoil of the gun will be lowered when you move the mouse, making it easier for you to fire while moving.");
			is_allowed_slide = val.Bind<bool>("APEX: Prisoners", "Allow Super Slide", true, "You can use sliding for short acceleration, super jumping and fast downhill.");
			is_allowed_RunReload = val.Bind<bool>("APEX: Prisoners", "Allow Run-Reload", true, "You can reload your weapons while running, but there is a little speed penalty.");
			Recoil_Manager.is_allowed = is_allowed_recoil.Value;
			Slide_Manager.is_allowed = is_allowed_slide.Value;
			RunReload_Manager.is_allowed = is_allowed_slide.Value;
			Logs.Info("OK");
		}
	}
	internal static class Logs
	{
		private static readonly ManualLogSource _logger;

		public static bool canChat;

		static Logs()
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Expected O, but got Unknown
			canChat = false;
			_logger = new ManualLogSource("Localia.APEX_Prisoners");
			Logger.Sources.Add((ILogSource)(object)_logger);
		}

		private static string Format(object msg)
		{
			return msg.ToString();
		}

		public static void debugChat(string data)
		{
			if (canChat)
			{
				PlayerChatManager.PostChatMessageLocaly(SNet.LocalPlayer, data, (SNet_Player)null);
			}
		}

		public static void Info(object data)
		{
			_logger.LogMessage((object)Format(data));
		}

		public static void Verbose(object data)
		{
			_logger.LogDebug((object)Format(data));
		}

		public static void Debug(object data)
		{
			_logger.LogDebug((object)Format(data));
		}

		public static void Error(object data)
		{
			_logger.LogError((object)Format(data));
		}
	}
	public static class Recoil_Manager
	{
		public static bool is_aiming = false;

		public static bool is_allowed = false;

		public static float total_pitch = 0f;

		public static float total_yaw = 0f;

		public static float tem_spread = 0f;

		public static float verticalScale_min;

		public static float verticalScale_max;

		public static float horizontalScale_min;

		public static float horizontalScale_max;

		public static float power_min;

		public static float power_max;

		public static float last_yaw;

		public static float last_pitch;

		public static Dictionary<float, float> mouse_pitch = new Dictionary<float, float>();

		public static Dictionary<float, float> mouse_yaw = new Dictionary<float, float>();
	}
	[HarmonyPatch(typeof(LookCameraController), "MouseLookUpdate")]
	internal static class Patch_LookCameraControllerMouseLookUpdate
	{
		[HarmonyWrapSafe]
		public static void Postfix(LookCameraController __instance)
		{
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
			if (Recoil_Manager.mouse_pitch.Count > 0)
			{
				List<float> list = new List<float>(Recoil_Manager.mouse_pitch.Keys);
				for (int i = 0; i < list.Count; i++)
				{
					float num = list[i];
					if (num + 0.1f < Clock.Time)
					{
						Recoil_Manager.mouse_pitch.Remove(num);
						Recoil_Manager.mouse_yaw.Remove(num);
					}
				}
			}
			Recoil_Manager.mouse_pitch[Clock.Time] = Math.Abs(__instance.m_lookInputMouse.y);
			Recoil_Manager.mouse_yaw[Clock.Time] = Math.Abs(__instance.m_lookInputMouse.x);
			Recoil_Manager.last_pitch = __instance.m_lookInputMouse.y;
			Recoil_Manager.last_yaw = __instance.m_lookInputMouse.x;
		}
	}
	[HarmonyPatch(typeof(BulletWeapon), "Fire")]
	internal static class Patch_BulletWeaponFire
	{
		[HarmonyWrapSafe]
		public static void Prefix(BulletWeapon __instance)
		{
			if (!Recoil_Manager.is_allowed || !((ItemEquippable)__instance).FPItemHolder.ItemAimTrigger || !((Agent)((Item)__instance).Owner).IsLocallyOwned)
			{
				return;
			}
			Recoil_Manager.is_aiming = true;
			Recoil_Manager.total_yaw = 0f;
			Recoil_Manager.total_pitch = 0f;
			foreach (float key in Recoil_Manager.mouse_pitch.Keys)
			{
				if (key >= Clock.Time - 0.07f)
				{
					Recoil_Manager.total_yaw += Recoil_Manager.mouse_yaw[key];
					Recoil_Manager.total_pitch += Recoil_Manager.mouse_pitch[key];
				}
			}
			Recoil_Manager.mouse_pitch.Clear();
			Recoil_Manager.mouse_yaw.Clear();
		}
	}
	[HarmonyPatch(typeof(FPS_RecoilSystem))]
	internal static class Patch_FPS_RecoilSystem
	{
		[HarmonyPatch("ApplyRecoil")]
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		public static bool ApplyRecoil_prefix(FPS_RecoilSystem __instance, Vector2 __result, bool resetSimilarity, RecoilDataBlock recoilData)
		{
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0312: Unknown result type (might be due to invalid IL or missing references)
			//IL_0325: Unknown result type (might be due to invalid IL or missing references)
			//IL_0145: Unknown result type (might be due to invalid IL or missing references)
			//IL_0225: Unknown result type (might be due to invalid IL or missing references)
			//IL_019d: Unknown result type (might be due to invalid IL or missing references)
			//IL_027d: Unknown result type (might be due to invalid IL or missing references)
			if (Recoil_Manager.is_allowed)
			{
				Recoil_Manager.horizontalScale_min = recoilData.horizontalScale.Min;
				Recoil_Manager.horizontalScale_max = recoilData.horizontalScale.Max;
				Recoil_Manager.verticalScale_min = recoilData.verticalScale.Min;
				Recoil_Manager.verticalScale_max = recoilData.verticalScale.Max;
				Recoil_Manager.power_min = recoilData.power.Min;
				Recoil_Manager.power_max = recoilData.power.Max;
				if (Recoil_Manager.is_aiming)
				{
					Vector2 val = default(Vector2);
					((Vector2)(ref val))..ctor(recoilData.verticalScale.GetRandom(), recoilData.horizontalScale.GetRandom());
					float random = recoilData.power.GetRandom();
					Vector2 val2 = val;
					((Vector2)(ref val2)).Normalize();
					val2 *= random;
					Logs.debugChat($"V:{val2.x}, H:{val2.y} ");
					float num = 1f;
					float num2 = 1f;
					if (Recoil_Manager.total_pitch > 0.0001f)
					{
						if (Math.Abs(Recoil_Manager.last_pitch) > 0.001f)
						{
							num = 0.5f;
						}
						if (Recoil_Manager.total_pitch > 0.26f)
						{
							num2 = 1f - Recoil_Manager.total_pitch / (Math.Abs(val2.y) * 4f);
							if (num2 <= 0.3f)
							{
								num2 = 0.3f;
							}
							Logs.debugChat($"pitch:[{Recoil_Manager.last_pitch}]{Recoil_Manager.total_pitch} => H:{val2.y}, multi:{num2} ");
						}
					}
					float num3 = 1f;
					float num4 = 1f;
					if (Recoil_Manager.total_yaw > 0.001f)
					{
						if (Math.Abs(Recoil_Manager.last_yaw) > 0.0001f)
						{
							num3 = 0.5f;
						}
						if (Recoil_Manager.total_yaw > 0.26f)
						{
							num4 = 1f - Recoil_Manager.total_yaw / (Math.Abs(val2.x) * 1f);
							if (num4 <= 0.2f)
							{
								num4 = 0.2f;
							}
							Logs.debugChat($"YAW:[{Recoil_Manager.last_yaw}]{Recoil_Manager.total_yaw} => V:{val2.x}, multi:{num4}");
						}
					}
					val2.x *= num * num4;
					val2.y *= num2 * num3;
					float magnitude = ((Vector2)(ref val2)).magnitude;
					recoilData.power.Min = magnitude;
					recoilData.power.Max = magnitude;
					recoilData.horizontalScale.Min = val2.y;
					recoilData.horizontalScale.Max = val2.y;
					recoilData.verticalScale.Min = val2.x;
					recoilData.verticalScale.Max = val2.x;
				}
				Recoil_Manager.is_aiming = false;
			}
			return true;
		}

		[HarmonyPatch("ApplyRecoil")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void ApplyRecoil_postfix(FPS_RecoilSystem __instance, Vector2 __result, bool resetSimilarity, RecoilDataBlock recoilData)
		{
			if (Recoil_Manager.is_allowed)
			{
				recoilData.horizontalScale.Min = Recoil_Manager.horizontalScale_min;
				recoilData.horizontalScale.Max = Recoil_Manager.horizontalScale_max;
				recoilData.verticalScale.Min = Recoil_Manager.verticalScale_min;
				recoilData.verticalScale.Max = Recoil_Manager.verticalScale_max;
				recoilData.power.Min = Recoil_Manager.power_min;
				recoilData.power.Max = Recoil_Manager.power_max;
			}
		}
	}
	public static class Slide_Manager
	{
		public static bool can_slide_boost = false;

		public static bool is_allowed = false;

		public static bool is_gliding = false;

		public static bool is_boost_gliding = false;

		public static Vector3 jump_end_hvec;

		public static bool stand_exit_check = false;

		public static bool can_glide = false;

		public static bool can_slide_jump = false;

		public static bool can_slide_jump_boost = false;

		public static float start_slide_time = 0f;

		public static float start_slow_time = 0f;

		public static float glide_speedMulti = 1f;

		public static float last_slide_jump_speed = 1f;

		public static bool jump_speed_lock = false;

		public static float getSpeedMulti(PlayerAgent client)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			Vector3 horizontalVelocity = client.Locomotion.HorizontalVelocity;
			float magnitude = ((Vector3)(ref horizontalVelocity)).magnitude;
			float num = 1f;
			if (can_slide_boost)
			{
				can_slide_boost = false;
				is_boost_gliding = true;
				start_slow_time = Clock.Time;
				float num2 = 1.52f;
				float num3 = -0.14f;
				float num4 = num2 - client.PlayerData.runMoveSpeed * num3;
				num = magnitude * num3 + num4;
				if (num < 1f)
				{
					num = 1f;
				}
			}
			else
			{
				float num5 = Clock.Time - start_slow_time;
				num = 0f - (float)Math.Pow(num5 * 0.36f, 3.200000047683716) + 0.97f;
				if (num < 0.9f)
				{
					num = 0.9f;
				}
			}
			glide_speedMulti = num;
			return num;
		}

		public static Vector3 GetExtraSpeedFromGround(PlayerAgent client)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: 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_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: 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)
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: 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_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			//IL_012f: 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_0200: 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_0168: Unknown result type (might be due to invalid IL or missing references)
			//IL_016a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f8: Unknown result type (might be due to invalid IL or missing references)
			Vector3 result = default(Vector3);
			((Vector3)(ref result))..ctor(0f, 0f, 0f);
			Vector3 val = ((Component)client).transform.position + Vector3.up * 0.2f;
			RaycastHit val2 = default(RaycastHit);
			bool flag = Physics.Raycast(val, Vector3.down, ref val2, 0.8f, LayerManager.MASK_DEFAULT);
			if (!flag)
			{
				val += ((Component)client).transform.right * 0.2f;
				flag = Physics.Raycast(val, Vector3.down, ref val2, 0.5f, LayerManager.MASK_DEFAULT);
			}
			if (!flag)
			{
				val += ((Component)client).transform.right * -0.4f;
				flag = Physics.Raycast(val, Vector3.down, ref val2, 0.5f, LayerManager.MASK_DEFAULT);
			}
			if (flag)
			{
				Vector3 val3 = ((RaycastHit)(ref val2)).normal;
				float num = Mathf.Acos(Vector3.Dot(val3, Vector3.up)) * 57.29578f;
				Vector3 val4 = client.PlayerCharacterController.m_lastActualFixedMove;
				Vector3 val5 = default(Vector3);
				((Vector3)(ref val5))..ctor(0f, ((Vector3)(ref val4))[1], 0f);
				float magnitude = ((Vector3)(ref val5)).magnitude;
				val4 = client.PlayerCharacterController.m_lastActualFixedMove;
				float num2 = magnitude / ((Vector3)(ref val4)).magnitude * 100f;
				if (num == 0f && num2 > 17f)
				{
					val3 = GetGroundNormalFromTriangle(client);
					num = Mathf.Acos(Vector3.Dot(val3, Vector3.up)) * 57.29578f;
				}
				float val6 = num / 60f;
				float val7 = num2 / 1.7f / 60f;
				float value = Math.Max(val6, val7);
				value = Math.Clamp(value, 0.05f, 0.8f);
				if (num > 10f || num2 > 17f)
				{
					val4 = VecCast(val3, Vector3.up);
					Vector3 normalized = ((Vector3)(ref val4)).normalized;
					result = normalized * value;
					return result;
				}
			}
			return result;
		}

		public static Vector3 GetGroundNormalFromTriangle(PlayerAgent client)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: 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_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			//IL_004b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0132: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: 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)
			//IL_007b: Unknown result type (might be due to invalid IL or missing references)
			//IL_007d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: 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)
			//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_013b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_011a: 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_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(0f, 1f, 0f);
			Vector3 val2 = ((Component)client).transform.position + Vector3.up * 0.4f + ((Component)client).transform.forward * 0.2f;
			RaycastHit val3 = default(RaycastHit);
			if (Physics.Raycast(val2, Vector3.down, ref val3, 1.4f, LayerManager.MASK_DEFAULT))
			{
				Vector3 point = ((RaycastHit)(ref val3)).point;
				val2 = val2 + ((Component)client).transform.right * 0.3f - ((Component)client).transform.forward * 0.4f;
				if (Physics.Raycast(val2, Vector3.down, ref val3, 1.4f, LayerManager.MASK_DEFAULT))
				{
					Vector3 point2 = ((RaycastHit)(ref val3)).point;
					val2 -= ((Component)client).transform.right * 0.6f;
					if (Physics.Raycast(val2, Vector3.down, ref val3, 1.4f, LayerManager.MASK_DEFAULT))
					{
						Vector3 point3 = ((RaycastHit)(ref val3)).point;
						val = Cal_Normal_3D(point, point2, point3);
					}
				}
			}
			return ((Vector3)(ref val)).normalized;
		}

		public static Vector3 Cal_Normal_3D(Vector3 v1, Vector3 v2, Vector3 v3)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: 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)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: 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: 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)
			//IL_005b: 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)
			//IL_0068: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: 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_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			double num = (v2.y - v1.y) * (v3.z - v1.z) - (v2.z - v1.z) * (v3.y - v1.y);
			double num2 = (v2.z - v1.z) * (v3.x - v1.x) - (v2.x - v1.x) * (v3.z - v1.z);
			double num3 = (v2.x - v1.x) * (v3.y - v1.y) - (v2.y - v1.y) * (v3.x - v1.x);
			return new Vector3((float)num, (float)num2, (float)num3);
		}

		public static Vector3 VecCast(Vector3 vector, Vector3 PlaneNorm)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0003: Unknown result type (might be due to invalid IL or missing references)
			//IL_0004: 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)
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			return vector + PlaneNorm * (Vector3.Dot(vector, PlaneNorm) * -1f);
		}
	}
	[HarmonyPatch(typeof(PLOC_Run))]
	internal static class Patch_PLOC_Run
	{
		[HarmonyPatch("CommonEnter")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void CommonEnter(PLOC_Run __instance)
		{
			if (Slide_Manager.is_allowed)
			{
				__instance.m_enterTime -= 0.2f;
			}
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Update(PLOC_Run __instance)
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001c: Invalid comparison between Unknown and I4
			if (Slide_Manager.is_allowed && (int)((PLOC_Base)__instance).m_owner.Locomotion.m_currentStateEnum == 1)
			{
				if (Clock.Time - __instance.m_enterTime > 0.5f)
				{
					Slide_Manager.can_slide_boost = true;
					Slide_Manager.can_slide_jump_boost = true;
				}
				else
				{
					Slide_Manager.can_slide_boost = false;
					Slide_Manager.can_slide_jump_boost = false;
				}
			}
		}
	}
	[HarmonyPatch(typeof(PLOC_Jump))]
	internal static class Patch_PLOC_Jump
	{
		[HarmonyPatch("Enter")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Enter(PLOC_Jump __instance)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Invalid comparison between Unknown and I4
			//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_01be: Unknown result type (might be due to invalid IL or missing references)
			//IL_0139: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_007e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
			//IL_0101: Unknown result type (might be due to invalid IL or missing references)
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			if (!Slide_Manager.is_allowed)
			{
				return;
			}
			Logs.debugChat($"Jump from {((PLOC_Base)__instance).m_owner.Locomotion.m_lastStateEnum}");
			if ((int)((PLOC_Base)__instance).m_owner.Locomotion.m_lastStateEnum == 1)
			{
				Vector3 horizontalVelocity;
				if (Slide_Manager.can_slide_jump)
				{
					if (Slide_Manager.can_slide_jump_boost)
					{
						PlayerLocomotion locomotion = ((PLOC_Base)__instance).m_owner.Locomotion;
						locomotion.VerticalVelocity *= 0.8f;
						PlayerLocomotion locomotion2 = ((PLOC_Base)__instance).m_owner.Locomotion;
						locomotion2.HorizontalVelocity *= 1.3f;
						horizontalVelocity = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
						if (((Vector3)(ref horizontalVelocity)).magnitude < ((PLOC_Base)__instance).m_owner.PlayerData.runMoveSpeed * 1.3f)
						{
							PlayerLocomotion locomotion3 = ((PLOC_Base)__instance).m_owner.Locomotion;
							horizontalVelocity = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
							locomotion3.HorizontalVelocity = ((Vector3)(ref horizontalVelocity)).normalized * ((PLOC_Base)__instance).m_owner.PlayerData.runMoveSpeed * 1.3f;
						}
					}
					horizontalVelocity = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
					((PLOC_Fall)__instance).m_maxHorizontalVelocity = Mathf.Clamp(((Vector3)(ref horizontalVelocity)).magnitude, ((PLOC_Base)__instance).m_owner.PlayerData.airMoveSpeed, ((PLOC_Base)__instance).m_owner.PlayerData.runMoveSpeed * 1.6f);
					Slide_Manager.last_slide_jump_speed = ((PLOC_Fall)__instance).m_maxHorizontalVelocity;
					Logs.debugChat($"Slide Jump!");
				}
				else if (!Slide_Manager.jump_speed_lock)
				{
					horizontalVelocity = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
					float magnitude = ((Vector3)(ref horizontalVelocity)).magnitude;
					if (magnitude < Slide_Manager.last_slide_jump_speed)
					{
						Slide_Manager.last_slide_jump_speed = magnitude;
					}
					if (((PLOC_Fall)__instance).m_maxHorizontalVelocity < Slide_Manager.last_slide_jump_speed * 0.97f)
					{
						Slide_Manager.last_slide_jump_speed = Mathf.Clamp(Slide_Manager.last_slide_jump_speed, ((PLOC_Fall)__instance).m_maxHorizontalVelocity, Slide_Manager.last_slide_jump_speed * 0.97f);
						((PLOC_Fall)__instance).m_maxHorizontalVelocity = Slide_Manager.last_slide_jump_speed;
					}
				}
			}
			else
			{
				Slide_Manager.can_slide_boost = true;
			}
			Slide_Manager.can_slide_jump = false;
			Slide_Manager.can_slide_jump_boost = false;
			Slide_Manager.jump_speed_lock = false;
		}
	}
	[HarmonyPatch(typeof(PLOC_Fall))]
	internal static class Patch_PLOC_Fall
	{
		[HarmonyPatch("Enter")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Enter(PLOC_Fall __instance)
		{
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Invalid comparison between Unknown and I4
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Invalid comparison between Unknown and I4
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			if (Slide_Manager.is_allowed)
			{
				Logs.debugChat($"Fall from {((PLOC_Base)__instance).m_owner.Locomotion.m_currentStateEnum}");
				if ((int)((PLOC_Base)__instance).m_owner.Locomotion.m_lastStateEnum == 1 && (int)((PLOC_Base)__instance).m_owner.Locomotion.m_currentStateEnum == 4)
				{
					Vector3 horizontalVelocity = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
					__instance.m_maxHorizontalVelocity = Mathf.Clamp(((Vector3)(ref horizontalVelocity)).magnitude, ((PLOC_Base)__instance).m_owner.PlayerData.airMoveSpeed, ((PLOC_Base)__instance).m_owner.PlayerData.runMoveSpeed * 2f);
					Slide_Manager.last_slide_jump_speed = __instance.m_maxHorizontalVelocity;
				}
			}
		}
	}
	[HarmonyPatch(typeof(PLOC_Crouch))]
	internal static class Patch_PLOC_Crouch
	{
		[HarmonyPatch("Enter")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Enter(PLOC_Crouch __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)
			if (Slide_Manager.is_allowed)
			{
				Vector3 horizontalVelocity = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
				float magnitude = ((Vector3)(ref horizontalVelocity)).magnitude;
				if (Slide_Manager.can_slide_boost || magnitude >= ((PLOC_Base)__instance).m_owner.PlayerData.walkMoveSpeed * 1.1f)
				{
					Slide_Manager.is_gliding = true;
					Slide_Manager.start_slide_time = Clock.Time;
					Slide_Manager.start_slow_time = Clock.Time;
				}
				Slide_Manager.can_slide_jump = false;
				Slide_Manager.can_slide_jump_boost = false;
				Logs.debugChat($"start Crouch {Clock.Time},rig vec{magnitude}");
			}
		}

		[HarmonyPatch("Exit")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Exit(PLOC_Crouch __instance)
		{
			if (!Slide_Manager.is_allowed)
			{
				return;
			}
			if (Slide_Manager.is_gliding)
			{
				Slide_Manager.can_slide_jump = false;
				Slide_Manager.jump_speed_lock = false;
				float num = Clock.Time - Slide_Manager.start_slide_time;
				if (num > 0.25f)
				{
					Slide_Manager.can_slide_jump = true;
				}
				else if (Slide_Manager.can_slide_jump_boost)
				{
					Slide_Manager.jump_speed_lock = true;
				}
				if (!Slide_Manager.is_boost_gliding)
				{
					Slide_Manager.can_slide_jump_boost = false;
				}
			}
			Slide_Manager.is_gliding = false;
			Slide_Manager.is_boost_gliding = false;
			Slide_Manager.can_slide_boost = false;
			Logs.debugChat($"end Crouch {Clock.Time}");
		}

		[HarmonyPatch("FixedUpdate")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void FixedUpdate(PLOC_Crouch __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_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_005d: 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)
			//IL_0067: Unknown result type (might be due to invalid IL or missing references)
			if (Slide_Manager.is_allowed)
			{
				Vector3 val = ((PLOC_Base)__instance).m_owner.Locomotion.VerticalVelocity;
				float magnitude = ((Vector3)(ref val)).magnitude;
				val = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
				float magnitude2 = ((Vector3)(ref val)).magnitude;
				val = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity + ((PLOC_Base)__instance).m_owner.Locomotion.VerticalVelocity;
				float magnitude3 = ((Vector3)(ref val)).magnitude;
				float num = Clock.Time - Slide_Manager.start_slide_time;
				Logs.debugChat(string.Format("crouch {4}s {0} V: {1}, H:{2} M:{3}", magnitude3, magnitude, magnitude2, Slide_Manager.glide_speedMulti, num));
			}
		}
	}
	[HarmonyPatch(typeof(PLOC_Base))]
	internal static class Patch_PLOC_Base
	{
		[HarmonyPatch("UpdateHorizontalVelocityOnGround")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void UpdateHorizontalVelocityOnGround(PLOC_Base __instance, float moveSpeed)
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Invalid comparison between Unknown and I4
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0048: Invalid comparison between Unknown and I4
			if (Slide_Manager.is_allowed && Slide_Manager.stand_exit_check && (int)__instance.m_owner.Locomotion.m_currentStateEnum == 0 && ((int)__instance.m_owner.Locomotion.m_lastStateEnum == 4 || (int)__instance.m_owner.Locomotion.m_lastStateEnum == 3))
			{
				__instance.m_owner.Locomotion.HorizontalVelocity = Slide_Manager.jump_end_hvec;
			}
		}

		[HarmonyPatch("GetHorizontalVelocityFromInput")]
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		public static bool GetHorizontalVelocityFromInput(PLOC_Base __instance, out Vector3 __result, float moveSpeed)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: 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)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_008e: 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_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_005a: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0060: 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)
			//IL_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_0125: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			//IL_014e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0153: Unknown result type (might be due to invalid IL or missing references)
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_0176: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: 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_018d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			__result = PLOC_Base.m_horVelInputCurrent;
			if (Slide_Manager.is_allowed && Slide_Manager.is_gliding)
			{
				Vector3 extraSpeedFromGround = Slide_Manager.GetExtraSpeedFromGround(__instance.m_owner);
				if (((Vector3)(ref extraSpeedFromGround)).magnitude > 0f)
				{
					Slide_Manager.start_slow_time = Clock.Time;
					PlayerLocomotion locomotion = __instance.m_owner.Locomotion;
					locomotion.HorizontalVelocity += extraSpeedFromGround;
				}
				float speedMulti = Slide_Manager.getSpeedMulti(__instance.m_owner);
				Vector3 val = __instance.m_owner.Locomotion.HorizontalVelocity * speedMulti;
				float magnitude = ((Vector3)(ref val)).magnitude;
				Vector3 lastActualFixedMove = __instance.m_owner.PlayerCharacterController.m_lastActualFixedMove;
				float num = ((Vector3)(ref lastActualFixedMove)).magnitude * 30f;
				float crouchMoveSpeed = __instance.m_owner.PlayerData.crouchMoveSpeed;
				if (magnitude > crouchMoveSpeed && num > crouchMoveSpeed)
				{
					float moveSpeedModifier = __instance.m_owner.EnemyCollision.MoveSpeedModifier;
					float num2 = Mathf.Clamp(magnitude, __instance.m_owner.PlayerData.crouchMoveSpeed, magnitude * moveSpeedModifier);
					val = __instance.m_owner.Locomotion.HorizontalVelocity;
					PLOC_Base.m_horVelInputCurrent = ((Vector3)(ref val)).normalized * num2;
					((Vector3)(ref lastActualFixedMove))[1] = 0f;
					Vector3 normalized = ((Vector3)(ref lastActualFixedMove)).normalized;
					PLOC_Base.m_horVelInputCurrent += normalized * num2 * 0.1f;
					val = PLOC_Base.m_horVelInputCurrent;
					PLOC_Base.m_horVelInputCurrent = ((Vector3)(ref val)).normalized * num2;
					__result = PLOC_Base.m_horVelInputCurrent;
					return false;
				}
				Slide_Manager.is_gliding = false;
				Slide_Manager.is_boost_gliding = false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(PLOC_Stand))]
	internal static class Patch_PLOC_Stand_Slide
	{
		[HarmonyPatch("Enter")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Enter(PLOC_Stand __instance)
		{
			//IL_0012: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Unknown result type (might be due to invalid IL or missing references)
			Slide_Manager.stand_exit_check = true;
			Slide_Manager.jump_end_hvec = ((PLOC_Base)__instance).m_owner.Locomotion.HorizontalVelocity;
		}

		[HarmonyPatch("Exit")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Exit(PLOC_Run __instance)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			if (Slide_Manager.is_allowed && !Slide_Manager.stand_exit_check)
			{
				Slide_Manager.can_slide_boost = false;
			}
			Logs.debugChat($"Stand Exit to {((PLOC_Base)__instance).m_owner.Locomotion.m_currentStateEnum}");
		}
	}
	[HarmonyPatch(typeof(PlayerLocomotion), "ChangeState")]
	internal static class Patch_PlayerLocomotionChangeState
	{
		[HarmonyWrapSafe]
		public static void Prefix(PlayerLocomotion __instance, PLOC_State state)
		{
			//IL_0007: 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)
			Logs.debugChat($"{__instance.m_lastStateEnum} => {state}");
		}
	}
	public static class RunReload_Manager
	{
		public static bool can_slide_boost = false;

		public static bool is_allowed = false;

		public static float last_speedScale = 1f;

		public static bool last_reloadState = false;
	}
	[HarmonyPatch(typeof(PlayerInventoryBase))]
	internal static class Patch_PlayerInventoryBase
	{
		[HarmonyPatch("CanReloadCurrent")]
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		public static void CanReloadCurrent_prefix(PlayerInventoryBase __instance)
		{
			if (RunReload_Manager.is_allowed && ((Agent)__instance.Owner).IsLocallyOwned)
			{
				__instance.Owner.Locomotion.IsRunning = false;
			}
		}

		[HarmonyPatch("CanReloadCurrent")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void CanReloadCurrent_postfix(PlayerInventoryBase __instance)
		{
			if (RunReload_Manager.is_allowed && ((Agent)__instance.Owner).IsLocallyOwned && (Object)(object)__instance.Owner.FPItemHolder != (Object)null)
			{
				__instance.Owner.Locomotion.IsRunning = __instance.Owner.FPItemHolder.IsRunning;
			}
		}
	}
	[HarmonyPatch(typeof(PLOC_Run))]
	internal static class Patch_PLOC_Run_FixedUpdate
	{
		[HarmonyPatch("FixedUpdate")]
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		public static void FixedUpdate_prefix(PLOC_Run __instance)
		{
			RunReload_Manager.last_speedScale = __instance.m_speedScale;
			if (RunReload_Manager.is_allowed && (Object)(object)((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem != (Object)null && ((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem.IsReloading)
			{
				__instance.m_speedScale *= 0.75f;
			}
		}

		[HarmonyPatch("FixedUpdate")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void FixedUpdate_postfix(PLOC_Run __instance)
		{
			if (RunReload_Manager.is_allowed && (Object)(object)((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem != (Object)null && ((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem.IsReloading)
			{
				__instance.m_speedScale = RunReload_Manager.last_speedScale;
			}
		}
	}
	[HarmonyPatch(typeof(PLOC_Stand))]
	internal static class Patch_PLOC_Stand_RunReload
	{
		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		[HarmonyWrapSafe]
		public static void Update_prefix(PLOC_Run __instance)
		{
			if (RunReload_Manager.is_allowed && (Object)(object)((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem != (Object)null)
			{
				RunReload_Manager.last_reloadState = ((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem.IsReloading;
				((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem.IsReloading = false;
			}
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		[HarmonyWrapSafe]
		public static void Update_postfix(PLOC_Run __instance)
		{
			if (RunReload_Manager.is_allowed && (Object)(object)((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem != (Object)null)
			{
				((PLOC_Base)__instance).m_owner.FPItemHolder.WieldedItem.IsReloading = RunReload_Manager.last_reloadState;
			}
			Slide_Manager.stand_exit_check = false;
		}
	}
}

LocaliaCore.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.IO.Compression;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using HarmonyLib;
using Il2CppInterop.Runtime.Injection;
using LevelGeneration;
using Player;
using SNetwork;
using SemanticVersioning;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("LocaliaCore")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("LocaliaCore")]
[assembly: AssemblyTitle("LocaliaCore")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace LocaliaCore;

[BepInPlugin("Localia.LocaliaCore", "LocaliaCore", "3.0.0")]
public class EntryPoint : BasePlugin
{
	private Harmony m_Harmony;

	private const string Version = "3.0.0";

	public const string ver = "3.0.0";

	public override void Load()
	{
		//IL_000d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0017: Expected O, but got Unknown
		ClassInjector.RegisterTypeInIl2Cpp<LocaliaCore_Moniter>();
		m_Harmony = new Harmony("Localia.LocaliaCore");
		m_Harmony.PatchAll();
		Logs.Info($"OK");
	}
}
internal static class Logs
{
	private static readonly ManualLogSource _logger;

	public static bool canDebug;

	static Logs()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Expected O, but got Unknown
		canDebug = false;
		_logger = new ManualLogSource("LocaliaCore");
		Logger.Sources.Add((ILogSource)(object)_logger);
	}

	private static string Format(object msg)
	{
		return msg.ToString();
	}

	public static void Info(object data)
	{
		_logger.LogMessage((object)Format(data));
	}

	public static void debugChat(string data)
	{
		if (canDebug)
		{
			PlayerChatManager.PostChatMessageLocaly(SNet.LocalPlayer, data, (SNet_Player)null);
		}
	}

	public static void debugInfo(object data)
	{
		if (canDebug)
		{
			_logger.LogDebug((object)Format(data));
		}
	}

	public static void Verbose(object data)
	{
		_logger.LogDebug((object)Format(data));
	}

	public static void Debug(object data)
	{
		_logger.LogDebug((object)Format(data));
	}

	public static void Error(object data)
	{
		_logger.LogError((object)Format(data));
	}
}
[HarmonyPatch(typeof(StartMainGame), "Start")]
internal static class Patch_StartMainGame
{
	public static void Postfix()
	{
		//IL_0019: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Expected O, but got Unknown
		if (!LocaliaCore_Moniter.m_setuped)
		{
			LocaliaCore_Moniter.m_setuped = true;
			GameObject val = new GameObject("LocaliaCore");
			Object.DontDestroyOnLoad((Object)(object)val);
			LocaliaCore_Moniter.current = val.AddComponent<LocaliaCore_Moniter>();
		}
	}
}
[HarmonyPatch(typeof(GameStateManager), "DoChangeState")]
internal static class Patch_DoChangeState
{
	[HarmonyWrapSafe]
	public static void Postfix(GameStateManager __instance, eGameStateName nextState)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Invalid comparison between Unknown and I4
		//IL_0022: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Invalid comparison between Unknown and I4
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_0029: Invalid comparison between Unknown and I4
		//IL_003f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0041: Invalid comparison between Unknown and I4
		if ((int)nextState == 4)
		{
			LocaliaCore_Moniter.m_canUpdate = false;
			LocaliaCore_Moniter.clearCount();
			Network_Manager.outLobbyClear();
		}
		else if ((int)nextState == 5 || (int)nextState == 10)
		{
			LocaliaCore_Moniter.m_canUpdate = true;
		}
		else
		{
			if ((int)nextState != 1)
			{
				return;
			}
			StringBuilder stringBuilder = new StringBuilder();
			string text = null;
			foreach (KeyValuePair<string, PluginInfo> plugin in ((BaseChainloader<BasePlugin>)(object)IL2CPPChainloader.Instance).Plugins)
			{
				text = plugin.Key.Replace(";", " ");
				Network_Manager.myModList.Add(text);
				stringBuilder.Append(text + ";");
			}
			text = stringBuilder.ToString();
			text = text.Substring(0, text.Length - 1);
			Network_Manager.myModListBuffer_raw = Network_Manager.ChangtoDicBuffer(Network_Manager.MakeHeader(Network_Manager.dataType.MODLIST_DATA), text, 50);
			text = Cmp.GZipCompressString(text);
			Network_Manager.myModListBuffer = Network_Manager.ChangtoDicBuffer(Network_Manager.MakeHeader(Network_Manager.dataType.MODLIST_DATA), text, 50);
			API.onLoadedModList();
		}
	}
}
[HarmonyPatch(typeof(SNet_PlayerSlotManager), "AddToPlayersInGame")]
internal static class Patch_AddToPlayersInGame
{
	[HarmonyWrapSafe]
	public static void Postfix(SNet_PlayerSlotManager __instance, bool __result, SNet_Player player)
	{
		if ((__result && Network_Manager.slot_lookup[player.PlayerSlotIndex()] == 0L) || Network_Manager.slot_lookup[player.PlayerSlotIndex()] != player.Lookup)
		{
			Logs.debugChat($"[{player.PlayerSlotIndex()}]{player.NickName} {player.Lookup} joined");
			Network_Manager.clearSlot(player.PlayerSlotIndex());
			Network_Manager.addSlotLookup(player);
		}
	}
}
[HarmonyPatch(typeof(SNet_PlayerSlotManager), "RemoveFromPlayersInGame")]
internal static class Patch_RemoveFromPlayersInGame
{
	[HarmonyWrapSafe]
	public static void Postfix(SNet_PlayerSlotManager __instance, bool __result, SNet_Player player)
	{
		if (__result && Network_Manager.slot_lookup[player.PlayerSlotIndex()] != 0)
		{
			Logs.debugChat($"<#F00>Remove Player [{player.PlayerSlotIndex()}]{player.NickName} {player.Lookup}");
			Network_Manager.clearSlot(player.PlayerSlotIndex());
		}
	}
}
[HarmonyPatch(typeof(SNet_SessionHub), "RemovePlayerFromSession")]
internal static class Patch_RemovePlayerFromSession
{
	[HarmonyWrapSafe]
	public static void Prefix(SNet_SessionHub __instance, SNet_Player player, bool broadcastIfMaster = true)
	{
		if ((Object)(object)player != (Object)null && __instance.PlayersInSession.Contains(player) && Network_Manager.slot_lookup[player.PlayerSlotIndex()] != 0)
		{
			Logs.debugChat($"<#F00>Remove Player Hub [{player.PlayerSlotIndex()}]{player.NickName} {player.Lookup}");
			Network_Manager.clearSlot(player.PlayerSlotIndex());
		}
	}
}
[HarmonyPatch(typeof(PlayerSync), "IncomingMapInteraction")]
internal static class Patch_IncomingMapInteraction
{
	[HarmonyWrapSafe]
	public static bool Prefix(PlayerSync __instance, pPlayerMapInteraction data)
	{
		//IL_0018: 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_002a: Unknown result type (might be due to invalid IL or missing references)
		//IL_002b: Unknown result type (might be due to invalid IL or missing references)
		if (__instance.m_agent.IsBeingDespawned)
		{
			return false;
		}
		if (data.position.x == 114.514f && data.position.y == 233.666f)
		{
			int num = __instance.m_agent.Owner.PlayerSlotIndex();
			ulong lookup = __instance.m_agent.Owner.Lookup;
			if (Network_Manager.slot_lookup[num] != 0L && Network_Manager.slot_lookup[num] == lookup)
			{
				if (Network_Manager.slot_avaliable[num] != lookup)
				{
					Logs.debugChat($"<#0F0>Get Available Info [{__instance.m_agent.Owner.PlayerSlotIndex()}]{__instance.m_agent.PlayerName} {__instance.m_agent.Owner.Lookup}");
				}
			}
			else
			{
				Logs.debugChat($"<#0F0>Get Quick Available Info [{__instance.m_agent.Owner.PlayerSlotIndex()}]{__instance.m_agent.PlayerName} {__instance.m_agent.Owner.Lookup}");
				Network_Manager.clearSlot(num);
				Network_Manager.addSlotLookup(__instance.m_agent.Owner);
			}
			Network_Manager.slot_avaliable[num] = lookup;
			if (Network_Manager.slot_ChalNum[num] == 0)
			{
				Network_Manager.a2s_back_times[num]++;
				if (Network_Manager.a2s_back_times[num] < 30)
				{
					Network_Manager.sendA2s_Info(__instance.m_agent.Owner);
				}
				Logs.debugInfo($"[{num}]a2s_back_times {Network_Manager.a2s_back_times[num]}");
			}
			Network_Manager.sendCoreInfo(num);
			return false;
		}
		return true;
	}
}
[HarmonyPatch(typeof(LG_ComputerTerminalManager), "DoSendTerminalString")]
internal static class Patch_DoSendTerminalString
{
	[HarmonyWrapSafe]
	public static bool Prefix(LG_ComputerTerminalManager __instance, pTerminalString data)
	{
		return Network_Manager.processTerminalData(data);
	}
}
[HarmonyPatch(typeof(LG_ComputerTerminalManager), "DoSendTerminalStringValidation")]
internal static class Patch_DoSendTerminalStringValidation
{
	[HarmonyWrapSafe]
	public static bool Prefix(LG_ComputerTerminalManager __instance, pTerminalString data)
	{
		return Network_Manager.processTerminalData(data);
	}
}
internal class Network_Manager
{
	public enum dataType
	{
		NONE,
		CORE_INFO,
		GET_MODLIST,
		MODLIST_DATA,
		USE_MODLIST_RAW,
		HEARTBEAT_PACK,
		HEARTBEAT_PACK_BACK
	}

	public static ulong[] slot_lookup = new ulong[4];

	public static SNet_Player[] slot_SNet = (SNet_Player[])(object)new SNet_Player[4];

	public static ulong[] slot_avaliable = new ulong[4];

	public static Version[] slot_coreVer = (Version[])(object)new Version[4];

	public static bool[] gotModList = new bool[4];

	public static bool[] gettingModList = new bool[4];

	public static float[] last_try_get_time = new float[4];

	public static int[] try_times = new int[4];

	public static int[] a2s_back_times = new int[4];

	public static int[] slot_ChalNum = new int[4];

	public static uint[] modListBufferLength = new uint[4];

	public static float[] lastHeartBeatTime = new float[4];

	public static Dictionary<uint, float> heartBeatBuffer = new Dictionary<uint, float>();

	public static int[] slot_ping = new int[4];

	public static Dictionary<uint, string>[] modListBuffer = new Dictionary<uint, string>[4];

	public static List<string>[] modList = new List<string>[4];

	public static Dictionary<uint, string> myModListBuffer = new Dictionary<uint, string>();

	public static Dictionary<uint, string> myModListBuffer_raw = new Dictionary<uint, string>();

	public static List<string> myModList = new List<string>();

	public static bool USE_BUFFER_RAW = false;

	public static uint maxAllowedIndex = 100000u;

	public static int myChalNum = 0;

	public static void addSlotLookup(SNet_Player player)
	{
		if (player.PlayerSlotIndex() != -1)
		{
			slot_lookup[player.PlayerSlotIndex()] = player.Lookup;
			slot_SNet[player.PlayerSlotIndex()] = player;
			if (player.IsLocal)
			{
				addLocalToSlot(player);
				LocaliaCore_Moniter.boardcastAvaliable = 5;
			}
			else
			{
				sendA2s_Info(player);
			}
		}
	}

	public static void clearSlot(int slot)
	{
		//IL_002e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0034: Expected O, but got Unknown
		if (slot != -1)
		{
			slot_lookup[slot] = 0uL;
			slot_avaliable[slot] = 0uL;
			slot_coreVer[slot] = new Version("0.0.0", false);
			try_times[slot] = 0;
			a2s_back_times[slot] = 0;
			last_try_get_time[slot] = 0f;
			modListBufferLength[slot] = 0u;
			lastHeartBeatTime[slot] = 0f;
			slot_ChalNum[slot] = 0;
			slot_ping[slot] = -1;
			slot_SNet[slot] = null;
			gotModList[slot] = false;
			gettingModList[slot] = false;
			if (modListBuffer[slot] != null)
			{
				modListBuffer[slot].Clear();
			}
			if (modList[slot] != null)
			{
				modList[slot].Clear();
			}
			modListBuffer[slot] = new Dictionary<uint, string>();
			modList[slot] = new List<string>();
		}
	}

	public static void outLobbyClear()
	{
		Random random = new Random();
		myChalNum = random.Next(10000, 99999);
		for (int i = 0; i < 4; i++)
		{
			clearSlot(i);
		}
		heartBeatBuffer.Clear();
	}

	public static void addLocalToSlot(SNet_Player player)
	{
		int num = player.PlayerSlotIndex();
		slot_avaliable[num] = player.Lookup;
		gotModList[num] = true;
		modList[num] = new List<string>(myModList);
		API.onGotModList(num, modList[num]);
	}

	public static bool processTerminalData(pTerminalString data)
	{
		if (data.ID >= 2330000000u)
		{
			try
			{
				string text = data.ID.ToString(CultureInfo.InvariantCulture);
				if (text.StartsWith("233"))
				{
					string s = text[3].ToString(CultureInfo.InvariantCulture);
					int num = int.Parse(s, CultureInfo.InvariantCulture.NumberFormat);
					if (isValidSlot(num))
					{
						uint num2 = data.ID - (uint)(-1964967296 + num * 1000000);
						string data2 = data.inputString.data;
						string[] array = data2.Split('@');
						string[] array2 = array[0].Split(';');
						dataType dataType = (dataType)int.Parse(array2[0], CultureInfo.InvariantCulture.NumberFormat);
						Logs.debugInfo($"[{num}] => Me, {dataType}({num2}): {data2}");
						switch (dataType)
						{
						case dataType.CORE_INFO:
							onRecv_CoreInfo(num, num2, array[1]);
							break;
						case dataType.MODLIST_DATA:
							onRecv_ModListData(num, num2, array[1]);
							break;
						case dataType.GET_MODLIST:
							onRecv_GetModList(num, num2, array[1]);
							break;
						case dataType.USE_MODLIST_RAW:
							onRecv_UseModlistRaw(num, num2, array[1]);
							break;
						case dataType.HEARTBEAT_PACK:
							onRecv_HeartBeat(num, num2, array[1]);
							break;
						case dataType.HEARTBEAT_PACK_BACK:
							onRecv_HeartBeatBack(num, num2, array[1]);
							break;
						}
						bool flag = Convert.ToBoolean(Convert.ToInt32(array2[1]));
						bool flag2 = Convert.ToBoolean(Convert.ToInt32(array2[2]));
					}
				}
			}
			catch (Exception ex)
			{
				Logs.Error(ex.Message);
			}
			return false;
		}
		return true;
	}

	public static void onRecv_CoreInfo(int slot, uint index, string body)
	{
		string[] array = body.Split(";");
		int num = int.Parse(array[0], CultureInfo.InvariantCulture.NumberFormat);
		uint num2 = uint.Parse(array[1], CultureInfo.InvariantCulture.NumberFormat);
		Version val = Version.Parse(array[2], false);
		if (num2 == 0)
		{
			Logs.Error($"[{slot}]Mod list length is {num2}?");
		}
		else if (num <= 10000)
		{
			Logs.Error($"[{slot}]ChalNumber is {num}?");
		}
		else if (!gotModList[slot] && !gettingModList[slot] && try_times[slot] < 5)
		{
			gettingModList[slot] = true;
			modListBufferLength[slot] = num2;
			slot_ChalNum[slot] = num;
			slot_coreVer[slot] = val;
			Logs.debugChat($"<#FF0>[{slot}] Got CoreInfo. ML Len: {num2}, Ver: {val}");
			sendGetModList(slot);
		}
	}

	public static void onRecv_GetModList(int slot, uint index, string body)
	{
		string[] array = body.Split(";");
		int num = int.Parse(array[0], CultureInfo.InvariantCulture.NumberFormat);
		if (num == myChalNum)
		{
			string[] array2 = array[1].Split(",");
			int[] array3 = new int[array2.Length];
			for (int i = 0; i < array2.Length; i++)
			{
				array3[i] = int.Parse(array2[i], CultureInfo.InvariantCulture.NumberFormat);
			}
			sendModListData(slot, array3);
		}
	}

	public static void onRecv_HeartBeat(int slot, uint index, string body)
	{
		string[] array = body.Split(";");
		int num = int.Parse(array[0], CultureInfo.InvariantCulture.NumberFormat);
		if (num == myChalNum)
		{
			sendHeartBeatBacK(slot, index, (array.Length > 1) ? array[1] : "");
		}
	}

	public static void onRecv_HeartBeatBack(int slot, uint index, string timestamp)
	{
		if (timestamp.Length > 1)
		{
			lastHeartBeatTime[slot] = 0f;
			int num = (int)((Clock.Time - float.Parse(timestamp, CultureInfo.InvariantCulture.NumberFormat)) * 1000f);
			if (num > 999)
			{
				num = 999;
			}
			slot_ping[slot] = num;
		}
		else if (heartBeatBuffer.ContainsKey(index))
		{
			lastHeartBeatTime[slot] = 0f;
			int num2 = (int)((Clock.Time - heartBeatBuffer[index]) * 1000f);
			if (num2 > 999)
			{
				num2 = 999;
			}
			slot_ping[slot] = num2;
			heartBeatBuffer.Remove(index);
		}
	}

	public static void onRecv_UseModlistRaw(int slot, uint index, string body)
	{
		int num = int.Parse(body, CultureInfo.InvariantCulture.NumberFormat);
		if (num == myChalNum)
		{
			USE_BUFFER_RAW = true;
			sendCoreInfo(slot);
		}
	}

	public static void onRecv_ModListData(int slot, uint index, string body)
	{
		if (gotModList[slot] || !gettingModList[slot])
		{
			return;
		}
		uint num = modListBufferLength[slot];
		if (num == 0 && index >= num)
		{
			return;
		}
		modListBuffer[slot][index] = body;
		if (modListBuffer[slot].Count == num)
		{
			modListBufferLength[slot] = 0u;
			try_times[slot]++;
			gettingModList[slot] = false;
			Logs.debugChat($"<#FF0>[{slot}] Mod List Compeleted");
			string text = DicMerge(modListBuffer[slot]);
			string text2 = null;
			modListBuffer[slot].Clear();
			modList[slot].Clear();
			try
			{
				text2 = Cmp.GZipDecompressString(text);
			}
			catch (Exception ex)
			{
				Logs.Error(ex.Message);
				text2 = null;
			}
			if (text2 == null)
			{
				text2 = text;
				sendUseModlistRaw(slot);
			}
			Logs.debugInfo($"[{slot}] Mod List Compeleted: {text2}");
			modList[slot] = stringToList(text2);
			gotModList[slot] = true;
			sendCoreInfo(slot);
			API.onGotModList(slot, modList[slot]);
		}
	}

	public static void sendGetModList(int slot, int get_1 = 0, int get_2 = 0, int get_3 = 0)
	{
		if (!isValidSlot(slot))
		{
			Logs.Error($"try to sendGetModList to invalid slot [{slot}]");
			return;
		}
		last_try_get_time[slot] = Clock.Time;
		string text = string.Format(CultureInfo.InvariantCulture, "{0}{1};{2},{3},{4}", MakeHeader(dataType.GET_MODLIST), slot_ChalNum[slot], get_1, get_2, get_3);
		Send(slot_SNet[slot], dataType.GET_MODLIST, text);
	}

	public static void sendUseModlistRaw(int slot)
	{
		if (!isValidSlot(slot))
		{
			Logs.Error($"try to sendUseModlistRaw to invalid slot [{slot}]");
			return;
		}
		string text = string.Format(CultureInfo.InvariantCulture, "{0}{1}", MakeHeader(dataType.USE_MODLIST_RAW), slot_ChalNum[slot]);
		Send(slot_SNet[slot], dataType.USE_MODLIST_RAW, text);
	}

	public static void sendHeartBeat(int slot, uint index)
	{
		if (!isValidSlot(slot))
		{
			Logs.Error($"try to sendHeartBeat to invalid slot [{slot}]");
			return;
		}
		string text = string.Format(CultureInfo.InvariantCulture, "{0}{1};{2}", MakeHeader(dataType.HEARTBEAT_PACK), slot_ChalNum[slot], Clock.Time.ToString(CultureInfo.InvariantCulture.NumberFormat));
		Send(slot_SNet[slot], dataType.HEARTBEAT_PACK, text, index, DebugChat: false);
	}

	public static void sendHeartBeatBacK(int slot, uint index, string timestamp)
	{
		if (!isValidSlot(slot))
		{
			Logs.Error($"try to sendHeartBeatBacK to invalid slot [{slot}]");
			return;
		}
		string text = string.Format(CultureInfo.InvariantCulture, "{0}{1}", MakeHeader(dataType.HEARTBEAT_PACK_BACK), timestamp);
		Send(slot_SNet[slot], dataType.HEARTBEAT_PACK, text, index, DebugChat: false);
	}

	public static void sendModListData(int slot, int[] send_list)
	{
		if (!isValidSlot(slot))
		{
			Logs.Error($"try to sendModListData to invalid slot [{slot}]");
			return;
		}
		bool flag = false;
		uint num = 0u;
		for (int i = 0; i < send_list.Length; i++)
		{
			if (send_list[i] > 0)
			{
				flag = true;
				num = (uint)send_list[i];
				Send(slot_SNet[slot], dataType.MODLIST_DATA, USE_BUFFER_RAW ? myModListBuffer_raw[num] : myModListBuffer[num], num, DebugChat: false);
			}
		}
		if (!flag)
		{
			int num2 = (USE_BUFFER_RAW ? myModListBuffer_raw.Count : myModListBuffer.Count);
			for (int j = 0; j < num2; j++)
			{
				Send(slot_SNet[slot], dataType.MODLIST_DATA, USE_BUFFER_RAW ? myModListBuffer_raw[(uint)j] : myModListBuffer[(uint)j], (uint)j, DebugChat: false);
			}
		}
	}

	public static void sendCoreInfo(int slot)
	{
		if (!isValidSlot(slot))
		{
			Logs.Error($"try to sendCoreInfo to invalid slot [{slot}]");
			return;
		}
		string text = string.Format(CultureInfo.InvariantCulture, "{0}{1};{2};{3}", MakeHeader(dataType.CORE_INFO), myChalNum, USE_BUFFER_RAW ? myModListBuffer_raw.Count : myModListBuffer.Count, API.Core_VersionString());
		Send(slot_SNet[slot], dataType.CORE_INFO, text);
	}

	public static string MakeHeader(dataType type, bool mustConfirm = false, bool masterBoardCast = false)
	{
		return string.Format(CultureInfo.InvariantCulture, "{0};{1};{2}@", (int)type, Convert.ToInt32(mustConfirm), Convert.ToInt32(masterBoardCast));
	}

	public static Dictionary<uint, string> ChangtoDicBuffer(string header, string content, int maxlength)
	{
		Dictionary<uint, string> dictionary = new Dictionary<uint, string>();
		string text = null;
		int num = 0;
		int num2 = maxlength - header.Length - 1;
		int num3 = content.Length;
		uint num4 = 0u;
		while (num3 > 0)
		{
			if (num2 > num3)
			{
				num2 = num3;
			}
			text = content.Substring(num, num2);
			dictionary[num4] = header + text;
			num += num2;
			num3 -= num2;
			num4++;
		}
		return dictionary;
	}

	public static void Send(SNet_Player client, dataType type, string text, uint index = 0u, bool DebugChat = true)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0007: Expected O, but got Unknown
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0042: Expected O, but got Unknown
		pTerminalString val = new pTerminalString();
		int num = SNet.LocalPlayer.PlayerSlotIndex();
		if (num >= 0 && num < 10)
		{
			val.ID = (uint)(-1964967296 + num * 1000000) + index;
			pString50 val2 = new pString50();
			val2.m_data = text;
			val.inputString = val2;
			((SNet_SyncedAction<pTerminalString>)(object)LG_ComputerTerminalManager.Current.m_sendTerminalString).m_packet.Send(val, (SNet_ChannelType)2, client);
			Logs.debugInfo($"Me => [{client.PlayerSlotIndex()}], {type}({index}): {val2.m_data}");
			if (DebugChat)
			{
				Logs.debugChat($"<#05F>Send {type} to {client.NickName}");
			}
		}
	}

	public static bool sendA2s_Info(SNet_Player client = null)
	{
		//IL_0029: 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_0032: Unknown result type (might be due to invalid IL or missing references)
		//IL_0058: Unknown result type (might be due to invalid IL or missing references)
		//IL_0093: Unknown result type (might be due to invalid IL or missing references)
		PlayerAgent localPlayerAgent = PlayerManager.GetLocalPlayerAgent();
		if ((Object)(object)localPlayerAgent != (Object)null)
		{
			Vector2 position = default(Vector2);
			((Vector2)(ref position))..ctor(114.514f, 233.666f);
			pPlayerMapInteraction val = default(pPlayerMapInteraction);
			val.position = position;
			val.interaction = false;
			if ((Object)(object)client == (Object)null)
			{
				localPlayerAgent.Sync.m_mapInteractionPacket.Send(val, (SNet_ChannelType)2);
				Logs.debugChat($"<#05F>Send Available to all");
			}
			else if (!client.IsBot)
			{
				localPlayerAgent.Sync.m_mapInteractionPacket.Send(val, (SNet_ChannelType)2, client);
				Logs.debugChat($"<#05F>Send Available to {client.NickName}");
			}
			return true;
		}
		return false;
	}

	public static string DicMerge(Dictionary<uint, string> dic)
	{
		StringBuilder stringBuilder = new StringBuilder();
		uint count = (uint)dic.Count;
		for (uint num = 0u; num < count; num++)
		{
			stringBuilder.Append(dic[num]);
		}
		return stringBuilder.ToString();
	}

	public static List<string> stringToList(string data)
	{
		List<string> list = new List<string>();
		string[] array = data.Split(';');
		for (int i = 0; i < array.Length; i++)
		{
			list.Add(array[i]);
			Logs.debugInfo(string.Format(CultureInfo.InvariantCulture, "{0}", list[i]));
		}
		return list;
	}

	public static string Encrypt(string content, string secretKey)
	{
		byte[] bytes = Encoding.Unicode.GetBytes(content);
		byte[] bytes2 = Encoding.Unicode.GetBytes(secretKey);
		byte[] array = new byte[bytes.Length];
		for (int i = 0; i < bytes.Length; i++)
		{
			array[i] = (byte)(bytes[i] ^ bytes2[i % bytes2.Length]);
		}
		return Encoding.Unicode.GetString(array);
	}

	public static bool isValidSlot(int slot)
	{
		if (slot < 0 || slot_lookup[slot] == 0L || slot_avaliable[slot] == 0L || (Object)(object)slot_SNet[slot] == (Object)null || slot_SNet[slot].IsBot || slot_SNet[slot].IsLocal)
		{
			return false;
		}
		return true;
	}
}
internal class Cmp
{
	public static string GZipCompressString(string rawString)
	{
		if (string.IsNullOrEmpty(rawString) || rawString.Length == 0)
		{
			return "";
		}
		byte[] bytes = Encoding.UTF8.GetBytes(rawString.ToString(CultureInfo.InvariantCulture));
		byte[] inArray = Compress(bytes);
		return Convert.ToBase64String(inArray);
	}

	private static byte[] Compress(byte[] rawData)
	{
		MemoryStream memoryStream = new MemoryStream();
		GZipStream gZipStream = new GZipStream(memoryStream, CompressionMode.Compress, leaveOpen: true);
		gZipStream.Write(rawData, 0, rawData.Length);
		gZipStream.Close();
		return memoryStream.ToArray();
	}

	public static string GetStringByString(string Value)
	{
		return GZipDecompressString(Value);
	}

	public static string GZipDecompressString(string zippedString)
	{
		if (string.IsNullOrEmpty(zippedString) || zippedString.Length == 0)
		{
			return "";
		}
		byte[] zippedData = Convert.FromBase64String(zippedString.ToString(CultureInfo.InvariantCulture));
		return Encoding.UTF8.GetString(Decompress(zippedData));
	}

	public static byte[] Decompress(byte[] zippedData)
	{
		MemoryStream stream = new MemoryStream(zippedData);
		GZipStream gZipStream = new GZipStream(stream, CompressionMode.Decompress);
		MemoryStream memoryStream = new MemoryStream();
		byte[] array = new byte[1024];
		while (true)
		{
			int num = gZipStream.Read(array, 0, array.Length);
			if (num <= 0)
			{
				break;
			}
			memoryStream.Write(array, 0, num);
		}
		gZipStream.Close();
		return memoryStream.ToArray();
	}
}
public class API
{
	public static Version Core_Version()
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Expected O, but got Unknown
		return new Version("3.0.0", false);
	}

	public static string Core_VersionString()
	{
		return "3.0.0";
	}

	public static bool is_Core_VersionSatisfy(string minVer, string maxVer = "9999.999.99")
	{
		//IL_0007: Unknown result type (might be due to invalid IL or missing references)
		//IL_000d: Expected O, but got Unknown
		//IL_000f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Expected O, but got Unknown
		//IL_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001d: Expected O, but got Unknown
		Version val = new Version("3.0.0", false);
		Version val2 = new Version(minVer, false);
		Version val3 = new Version(maxVer, false);
		if (val >= val2 && val <= val3)
		{
			return true;
		}
		return false;
	}

	public static void PingEverywhereDeluxe_NewPoint()
	{
	}

	public static void APEX_SLIDE_START()
	{
	}

	public static void APEX_SLIDE_END()
	{
	}

	public static void TeamSharedVision_Lookat()
	{
	}

	public static void TeamSharedVision_Enemy_Focusing()
	{
	}

	public static void TeamSharedVision_Box_Focusing()
	{
	}

	public static void TeamSharedVision_XRAY_State_Changed()
	{
	}

	public static void BodyGlowStick_Create()
	{
	}

	public static void RC_MINE_Create()
	{
	}

	public static void RC_MINE_State_Changed()
	{
	}

	public static int HumanCount()
	{
		return LocaliaCore_Moniter.player_Count;
	}

	public static int AvailableHumanCount()
	{
		return LocaliaCore_Moniter.available_Count;
	}

	public static int ModListHumanCount()
	{
		return LocaliaCore_Moniter.completed_Count;
	}

	public static bool is_Valid_Human(int slot)
	{
		if (slot >= 0 && slot < 4 && Network_Manager.slot_lookup[slot] != 0 && (Object)(object)Network_Manager.slot_SNet[slot] != (Object)null && !Network_Manager.slot_SNet[slot].IsBot)
		{
			return true;
		}
		return false;
	}

	public static bool has_got_modlist(int slot)
	{
		if (slot >= 0 && slot < 4)
		{
			return Network_Manager.gotModList[slot];
		}
		return false;
	}

	public static int Get_ModList_Count(int slot)
	{
		if (has_got_modlist(slot))
		{
			return Network_Manager.modList[slot].Count;
		}
		return -1;
	}

	public static List<string> Get_ModList(int slot)
	{
		if (has_got_modlist(slot))
		{
			return Network_Manager.modList[slot];
		}
		return null;
	}

	public static int Get_Slot_Ping(int slot)
	{
		if (has_Install_Core(slot))
		{
			return Network_Manager.slot_ping[slot];
		}
		return -1;
	}

	public static bool has_Install_Core(int slot)
	{
		if (is_Valid_Human(slot) && Network_Manager.slot_avaliable[slot] != 0)
		{
			return true;
		}
		return false;
	}

	public static bool has_Everyone_Install_Core()
	{
		if (LocaliaCore_Moniter.available_Count == LocaliaCore_Moniter.player_Count)
		{
			return true;
		}
		return false;
	}

	public static bool has_Everyone_Got_Modlist()
	{
		if (LocaliaCore_Moniter.available_Count == LocaliaCore_Moniter.completed_Count)
		{
			return true;
		}
		return false;
	}

	public static bool has_Install_Plugin(int slot, string PLUGIN_GUID, string minVer = null, string maxVer = null)
	{
		if (has_got_modlist(slot) && Network_Manager.modList[slot].Count > 0 && Network_Manager.modList[slot].Contains(PLUGIN_GUID.Replace(";", " ")))
		{
			return true;
		}
		return false;
	}

	public static bool has_Everyone_Install_Plugin(string PLUGIN_GUID, string minVer, string maxVer)
	{
		for (int i = 0; i < 4; i++)
		{
			if (is_Valid_Human(i) && !has_Install_Plugin(i, PLUGIN_GUID))
			{
				return false;
			}
		}
		return true;
	}

	public static void onLoadedModList()
	{
	}

	public static void onGotModList(int slot, List<string> ModList)
	{
		for (int i = 0; i < ModList.Count; i++)
		{
			Logs.debugInfo($"{ModList[i]}");
		}
	}

	public static void onHumanCountChanged(int oldCount, int newCount)
	{
		LocaliaCore_Moniter.player_Count = newCount;
	}

	public static void onAvailableHumanCountChanged(int oldCount, int newCount)
	{
		LocaliaCore_Moniter.available_Count = newCount;
	}

	public static void onModListHumanCountChanged(int oldCount, int newCount)
	{
		LocaliaCore_Moniter.completed_Count = newCount;
	}
}
public class LocaliaCore_Moniter : MonoBehaviour
{
	public static bool m_setuped = false;

	public static bool m_canUpdate = false;

	public static int available_Count;

	public static int player_Count;

	public static int boardcastAvaliable = 0;

	public static int completed_Count;

	public static uint heartBeatIndex = 0u;

	public static float next_heartbeat_time = 0f;

	public static float next_boardcastAvaliable_time = 0f;

	public static Version heartBeatV2 = new Version("1.1.2", false);

	public static LocaliaCore_Moniter current;

	public static void clearCount()
	{
		API.onHumanCountChanged(player_Count, 0);
		API.onAvailableHumanCountChanged(available_Count, 0);
		API.onModListHumanCountChanged(available_Count, 0);
	}

	public static void checkHeartbeat(int slot, bool canSend)
	{
		if (Network_Manager.slot_SNet[slot].IsLocal || Network_Manager.slot_ChalNum[slot] <= 0)
		{
			return;
		}
		if (canSend)
		{
			if (Network_Manager.slot_coreVer[slot] < heartBeatV2)
			{
				heartBeatIndex++;
				if (heartBeatIndex == Network_Manager.maxAllowedIndex)
				{
					heartBeatIndex = 0u;
				}
				Network_Manager.heartBeatBuffer[heartBeatIndex] = Clock.Time;
				if (Network_Manager.lastHeartBeatTime[slot] == 0f)
				{
					Network_Manager.lastHeartBeatTime[slot] = Network_Manager.heartBeatBuffer[heartBeatIndex];
				}
				Network_Manager.sendHeartBeat(slot, heartBeatIndex);
			}
			else
			{
				if (Network_Manager.lastHeartBeatTime[slot] == 0f)
				{
					Network_Manager.lastHeartBeatTime[slot] = Clock.Time;
				}
				Network_Manager.sendHeartBeat(slot, 0u);
			}
		}
		if (Network_Manager.lastHeartBeatTime[slot] > 0f)
		{
			int num = (int)((Clock.Time - Network_Manager.lastHeartBeatTime[slot]) * 1000f);
			if (num > 999)
			{
				num = 999;
			}
			if (num > Network_Manager.slot_ping[slot])
			{
				Network_Manager.slot_ping[slot] = num;
			}
		}
	}

	public static void checkModListGetting(int slot)
	{
		if (Network_Manager.gettingModList[slot] && Clock.Time - Network_Manager.last_try_get_time[slot] > 5f)
		{
			Network_Manager.gettingModList[slot] = false;
			if (Network_Manager.modListBuffer[slot] != null)
			{
				Network_Manager.modListBuffer[slot].Clear();
			}
			Network_Manager.modListBuffer[slot] = new Dictionary<uint, string>();
			Network_Manager.try_times[slot]++;
			if (Network_Manager.try_times[slot] < 5)
			{
				SNet_Player client = Network_Manager.slot_SNet[slot];
				Network_Manager.sendA2s_Info(client);
			}
		}
	}

	public void FixedUpdate()
	{
		try
		{
			if (!m_canUpdate)
			{
				return;
			}
			if (boardcastAvaliable > 0 && Clock.Time > next_boardcastAvaliable_time && Network_Manager.sendA2s_Info())
			{
				boardcastAvaliable--;
				next_boardcastAvaliable_time = Clock.Time + 2f * (float)(5 - boardcastAvaliable) + 1f;
			}
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			bool canSend = false;
			if (Clock.Time > next_heartbeat_time)
			{
				next_heartbeat_time = Clock.Time + 0.5f;
				canSend = true;
			}
			for (int i = 0; i < 4; i++)
			{
				if (Network_Manager.slot_lookup[i] == 0 || !((Object)(object)Network_Manager.slot_SNet[i] != (Object)null) || Network_Manager.slot_SNet[i].IsBot)
				{
					continue;
				}
				num++;
				if (Network_Manager.slot_avaliable[i] != 0)
				{
					num2++;
					if (Network_Manager.gotModList[i])
					{
						num3++;
					}
					else
					{
						checkModListGetting(i);
					}
					checkHeartbeat(i, canSend);
				}
			}
			bool flag = false;
			if (player_Count != num)
			{
				flag = true;
				API.onHumanCountChanged(player_Count, num);
			}
			if (available_Count != num2)
			{
				flag = true;
				API.onAvailableHumanCountChanged(available_Count, num2);
			}
			if (completed_Count != num3)
			{
				flag = true;
				API.onModListHumanCountChanged(available_Count, num3);
			}
			if (flag)
			{
				Logs.Verbose($"human available: {available_Count}/{player_Count}, credited: {completed_Count}");
			}
		}
		catch (Exception ex)
		{
			Logs.Error(ex.Message);
		}
	}
}

ModList.dll

Decompiled 6 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Logging;
using BepInEx.Unity.IL2CPP;
using CellMenu;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSystem;
using Il2CppSystem.Collections.Generic;
using LocaliaCore;
using SNetwork;
using TMPro;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = "")]
[assembly: AssemblyCompany("ModList")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ModList")]
[assembly: AssemblyTitle("ModList")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
namespace ModList;

[BepInPlugin("Localia.ModList", "ModList", "3.0.0")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class EntryPoint : BasePlugin
{
	private Harmony m_Harmony;

	public override void Load()
	{
		//IL_001b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0025: Expected O, but got Unknown
		if (API.is_Core_VersionSatisfy("3.0.0", "9999.999.99"))
		{
			m_Harmony = new Harmony("Localia.ModList");
			m_Harmony.PatchAll();
			Logs.Info($"OK");
		}
		else
		{
			Logs.Error($"The LocaliaCore version is lower than the need version, please update.");
			((BasePlugin)this).Unload();
		}
	}
}
internal static class Logs
{
	private static readonly ManualLogSource _logger;

	public static bool canDebug;

	static Logs()
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0016: Expected O, but got Unknown
		canDebug = false;
		_logger = new ManualLogSource("ModList");
		Logger.Sources.Add((ILogSource)(object)_logger);
	}

	private static string Format(object msg)
	{
		return msg.ToString();
	}

	public static void Info(object data)
	{
		_logger.LogMessage((object)Format(data));
	}

	public static void debugChat(string data)
	{
		if (canDebug)
		{
			PlayerChatManager.PostChatMessageLocaly(SNet.LocalPlayer, data, (SNet_Player)null);
		}
	}

	public static void debugInfo(object data)
	{
		if (canDebug)
		{
			_logger.LogDebug((object)Format(data));
		}
	}

	public static void Verbose(object data)
	{
		_logger.LogDebug((object)Format(data));
	}

	public static void Debug(object data)
	{
		_logger.LogDebug((object)Format(data));
	}

	public static void Error(object data)
	{
		_logger.LogError((object)Format(data));
	}
}
[HarmonyPatch(typeof(GameStateManager), "DoChangeState")]
internal static class Patch_DoChangeState
{
	[HarmonyWrapSafe]
	public static void Postfix(GameStateManager __instance, eGameStateName nextState)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Invalid comparison between Unknown and I4
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007a: Invalid comparison between Unknown and I4
		if ((int)nextState == 1)
		{
			foreach (KeyValuePair<string, PluginInfo> plugin in ((BaseChainloader<BasePlugin>)(object)IL2CPPChainloader.Instance).Plugins)
			{
				string key = plugin.Key.Replace(";", " ");
				ModList_Manager.myModDic[key] = plugin.Value.Metadata.Name;
			}
			return;
		}
		if ((int)nextState == 4)
		{
			ModList_Manager.ClearButtonText();
		}
	}
}
[HarmonyPatch(typeof(CM_PageLoadout))]
internal static class Patch_CM_PageLoadout
{
	[HarmonyPatch("SetPageActive")]
	[HarmonyPostfix]
	[HarmonyWrapSafe]
	public static void SetPageActive(CM_PageLoadout __instance, bool active)
	{
		if (active)
		{
			ModList_Manager.GenerateLobbyButtons();
		}
	}

	[HarmonyPatch("SetPopupVisible")]
	[HarmonyPostfix]
	[HarmonyWrapSafe]
	public static void SetPopupVisible(CM_PageLoadout __instance, bool visible)
	{
		if ((Object)(object)ModList_Manager.PageLoadout != (Object)null && !visible)
		{
			((RectTransformComp)ModList_Manager.ModListWindow).SetVisible(visible);
		}
	}

	[HarmonyPatch("UpdatePlayerBars")]
	[HarmonyPostfix]
	[HarmonyWrapSafe]
	public static void Postfix()
	{
		ModList_Manager.checkSlotState();
	}
}
internal class ModList_Manager
{
	public static CM_PageLoadout PageLoadout;

	public static CM_ScrollWindow ModListWindow;

	public static Dictionary<string, string> myModDic = new Dictionary<string, string>();

	public static CM_PlayerLobbyBar[] PlayerLobbyBars;

	public static CM_Item[] UI_ModButtons = (CM_Item[])(object)new CM_Item[4];

	public static void ShowListWindow(int ori_slot)
	{
		//IL_0253: 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_027b: Unknown result type (might be due to invalid IL or missing references)
		//IL_029c: Unknown result type (might be due to invalid IL or missing references)
		//IL_018e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0198: Unknown result type (might be due to invalid IL or missing references)
		int num = PlayerLobbyBars[ori_slot].m_player.PlayerSlotIndex();
		if (!API.has_got_modlist(num))
		{
			return;
		}
		List<string> list = API.Get_ModList(num);
		List<iScrollWindowContent> val = new List<iScrollWindowContent>();
		for (int i = 0; i < list.Count; i++)
		{
			iScrollWindowContent val2 = GOUtil.SpawnChildAndGetComp<iScrollWindowContent>(PageLoadout.m_inviteWindowContentPrefab);
			if (myModDic.Keys.Contains(list[i]))
			{
				val2.SetText("<#0f4f94>" + list[i]);
			}
			else
			{
				val2.SetText("<#b3b3b3>" + list[i]);
			}
			val.Add(val2);
			CM_TimedButton component = ((Component)val2.transform).GetComponent<CM_TimedButton>();
			if ((Object)(object)component != (Object)null)
			{
				((CM_Item)component).TextMeshRoot = ((Component)PageLoadout).transform;
				component.m_holdButtonDuration = 0f;
				((RectTransformComp)component).ForcePopupLayer(true, (GameObject)null);
			}
			GameObject gameObject = ((Component)val2.transform.FindChild("Arrow")).gameObject;
			if ((Object)(object)gameObject != (Object)null)
			{
				gameObject.SetActive(false);
			}
			GameObject gameObject2 = ((Component)val2.transform.FindChild("MainText")).gameObject;
			if ((Object)(object)gameObject2 != (Object)null)
			{
				TextMeshPro component2 = ((Component)gameObject2.transform).GetComponent<TextMeshPro>();
				((TMP_Text)component2).fontStyle = (FontStyles)0;
				((TMP_Text)component2).m_fontStyle = (FontStyles)0;
				((TMP_Text)component2).m_FontStyleInternal = (FontStyles)0;
				RectTransform component3 = ((Component)gameObject2.transform).GetComponent<RectTransform>();
				component3.offsetMax = new Vector2(700f, component3.offsetMax.y);
			}
		}
		float num2 = (float)val.Count * 60f;
		if (num2 < 300f)
		{
			num2 = 300f;
		}
		else if (num2 > 1000f)
		{
			num2 = 1000f;
		}
		if (PlayerLobbyBars[ori_slot].m_player.IsLocal)
		{
			((Component)ModListWindow).transform.localScale = new Vector3(1f, 1f, 1f);
		}
		else
		{
			((Component)ModListWindow).transform.localScale = new Vector3(1.2f, 1.2f, 1.2f);
		}
		ModListWindow.SetContentItems(val, 10f);
		((RectTransformComp)ModListWindow).SetSize(new Vector2(600f, num2));
		((Component)ModListWindow).transform.position = ((Component)UI_ModButtons[ori_slot]).transform.position;
		((RectTransformComp)ModListWindow).SetVisible(true);
	}

	public static void checkSlotState()
	{
		if (!Object.op_Implicit((Object)(object)PageLoadout))
		{
			return;
		}
		for (int i = 0; i < 4; i++)
		{
			if (PlayerLobbyBars[i].HasPlayer())
			{
				int num = PlayerLobbyBars[i].m_player.PlayerSlotIndex();
				if (num >= 0 && API.has_Install_Core(num))
				{
					if (API.has_got_modlist(num))
					{
						int num2 = API.Get_ModList_Count(num);
						if (num2 > 0)
						{
							int num3 = API.Get_Slot_Ping(i);
							if (num3 != -1)
							{
								UI_ModButtons[i].SetText($"<#6ecc72>MOD: SYNCED  {num3}ms");
							}
							else
							{
								UI_ModButtons[i].SetText("<#6ecc72>MOD: SYNCED");
							}
							continue;
						}
					}
					UI_ModButtons[i].SetText("<#FFF>MOD: GETTING...");
					continue;
				}
			}
			UI_ModButtons[i].SetText("<#FFF>MOD: UNKNOWN");
		}
	}

	public static void ClearButtonText()
	{
		if (Object.op_Implicit((Object)(object)PageLoadout))
		{
			for (int i = 0; i < 4; i++)
			{
				UI_ModButtons[i].SetText("<#FFF>MOD: UNKNOWN");
			}
		}
	}

	public static void GenerateLobbyButtons()
	{
		//IL_0078: 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_0102: Unknown result type (might be due to invalid IL or missing references)
		//IL_013e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0164: Unknown result type (might be due to invalid IL or missing references)
		//IL_0250: Unknown result type (might be due to invalid IL or missing references)
		//IL_025a: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)PageLoadout))
		{
			return;
		}
		PageLoadout = GuiManager.MainMenuLayer.PageLoadout;
		PlayerLobbyBars = Il2CppArrayBase<CM_PlayerLobbyBar>.op_Implicit((Il2CppArrayBase<CM_PlayerLobbyBar>)(object)GuiManager.MainMenuLayer.PageLoadout.m_playerLobbyBars);
		ModListWindow = GOUtil.SpawnChildAndGetComp<CM_ScrollWindow>(PageLoadout.m_inviteWindowPrefab, (Transform)(object)((CM_PageBase)PageLoadout).m_movingContentHolder);
		((RectTransformComp)ModListWindow).Setup();
		((RectTransformComp)ModListWindow).SetAnchor((GuiAnchor)1, true);
		((RectTransformComp)ModListWindow).SetPosition(Vector2.zero);
		((RectTransformComp)ModListWindow).SetSize(new Vector2(600f, 900f));
		((RectTransformComp)ModListWindow).SetVisible(false);
		((CM_PopupOverlay)ModListWindow).SetupFromButton(((Component)PageLoadout).GetComponentInParent<iCellMenuPopupController>(), ((Component)PageLoadout).GetComponentInParent<CM_PageBase>());
		ModListWindow.SetText("Mod List");
		for (int i = 0; i < 4; i++)
		{
			UI_ModButtons[i] = ((Il2CppObjectBase)((GuiLayer)((CM_PageBase)PageLoadout).m_guiLayer).AddRectComp(((Component)PlayerLobbyBars[i].m_inviteButton).gameObject, (GuiAnchor)4, Vector2.zero, PlayerLobbyBars[i].m_hasPlayerRoot.transform)).Cast<CM_Item>();
			((Component)UI_ModButtons[i]).transform.localPosition = new Vector3(-35f, 490f, 0f);
			((Component)UI_ModButtons[i]).transform.localScale = new Vector3(0.75f, 0.75f, 0.75f);
			UI_ModButtons[i].SetText("<#FFF>Mod: UNKOWN");
			UI_ModButtons[i].ID = i + 23366674;
			UI_ModButtons[i].OnBtnPressCallback += Action<int>.op_Implicit((Action<int>)delegate(int id)
			{
				ShowListWindow(id - 23366674);
			});
			((Object)UI_ModButtons[i]).name = $"UI_ModListButton_{i}";
			((Component)UI_ModButtons[i]).gameObject.SetActive(true);
			TextMeshPro component = ((Component)((Component)UI_ModButtons[i]).transform).GetComponent<TextMeshPro>();
			((TMP_Text)component).fontStyle = (FontStyles)0;
			((TMP_Text)component).m_fontStyle = (FontStyles)0;
			((TMP_Text)component).m_FontStyleInternal = (FontStyles)0;
			RectTransform component2 = ((Component)((Component)UI_ModButtons[i]).transform).GetComponent<RectTransform>();
			component2.offsetMax = new Vector2(500f, component2.offsetMax.y);
		}
	}
}