Decompiled source of SyncHostUpgrades v1.0.0

SyncHostUpgrades.dll

Decompiled a day ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("SyncHostUpgrades")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+d1169f47f709005def97c8080dffab3bf9994b2a")]
[assembly: AssemblyProduct("SyncHostUpgrades")]
[assembly: AssemblyTitle("SyncHostUpgrades")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

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

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

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace SyncHostUpgrades
{
	[BepInPlugin("SharkLucas.REPO.SyncHostUpgrades", "R.E.P.O. Sync Host Upgrades", "1.0.0")]
	public class SyncHostUpgrades : BaseUnityPlugin
	{
		public ConfigEntry<bool>? SyncHealth;

		public ConfigEntry<bool>? SyncStamina;

		public ConfigEntry<bool>? SyncExtraJump;

		public ConfigEntry<bool>? SyncMapPlayerCount;

		public ConfigEntry<bool>? SyncGrabRange;

		public ConfigEntry<bool>? SyncGrabStrength;

		public ConfigEntry<bool>? SyncGrabThrow;

		public ConfigEntry<bool>? SyncSprintSpeed;

		public ConfigEntry<bool>? SyncTumbleLaunch;

		private static readonly FieldRef<PlayerAvatar, bool> isLocalRef = AccessTools.FieldRefAccess<PlayerAvatar, bool>("isLocal");

		private static readonly FieldRef<PlayerAvatar, string> playerNameRef = AccessTools.FieldRefAccess<PlayerAvatar, string>("playerName");

		private static readonly FieldRef<PlayerAvatar, string> steamIDRef = AccessTools.FieldRefAccess<PlayerAvatar, string>("steamID");

		private static PlayerAvatar? cachedLocalPlayer = null;

		private static float lastCheckTime = 0f;

		public static SyncHostUpgrades? Instance { get; private set; }

		private void Awake()
		{
			//IL_0134: Unknown result type (might be due to invalid IL or missing references)
			Instance = this;
			SyncHealth = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Health", true, "Sync Max Health");
			SyncStamina = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Stamina", true, "Sync Max Stamina");
			SyncExtraJump = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Extra Jump", true, "Sync Extra Jump Count");
			SyncTumbleLaunch = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Tumble Launch", true, "Sync Tumble Launch Count");
			SyncMapPlayerCount = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Map Player Count", true, "Sync Map Player Count");
			SyncSprintSpeed = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Sprint Speed", false, "Sync Sprint Speed");
			SyncGrabStrength = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Grab Strength", true, "Sync Grab Strength");
			SyncGrabRange = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Grab Range", true, "Sync Grab Range");
			SyncGrabThrow = ((BaseUnityPlugin)this).Config.Bind<bool>("Sync", "Grab Throw", true, "Sync Grab Throw");
			new Harmony("REPO.SyncHostUpgrades").PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"SyncHostUpgrades loaded!");
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)4;
		}

		private void Update()
		{
			if (!PhotonNetwork.IsMasterClient)
			{
				return;
			}
			PlayerAvatar localPlayer = GetLocalPlayer();
			if (!((Object)(object)localPlayer != (Object)null))
			{
				return;
			}
			Dictionary<string, int> dictionary = StatsManager.instance.FetchPlayerUpgrades(steamIDRef.Invoke(localPlayer));
			foreach (PlayerAvatar item in SemiFunc.PlayerGetAll())
			{
				if (isLocalRef.Invoke(item))
				{
					continue;
				}
				string text = steamIDRef.Invoke(item);
				Dictionary<string, int> dictionary2 = StatsManager.instance.FetchPlayerUpgrades(text);
				foreach (string key in dictionary.Keys)
				{
					bool flag = false;
					switch (key)
					{
					case "Health":
						flag = SyncHealth?.Value ?? false;
						break;
					case "Stamina":
						flag = SyncStamina?.Value ?? false;
						break;
					case "Extra Jump":
						flag = SyncExtraJump?.Value ?? false;
						break;
					case "Launch":
						flag = SyncTumbleLaunch?.Value ?? false;
						break;
					case "Map Player Count":
						flag = SyncMapPlayerCount?.Value ?? false;
						break;
					case "Speed":
						flag = SyncSprintSpeed?.Value ?? false;
						break;
					case "Strength":
						flag = SyncGrabStrength?.Value ?? false;
						break;
					case "Range":
						flag = SyncGrabRange?.Value ?? false;
						break;
					case "Throw":
						flag = SyncGrabThrow?.Value ?? false;
						break;
					}
					if (!flag || !dictionary.TryGetValue(key, out var value) || value <= dictionary2[key])
					{
						continue;
					}
					int num = value - dictionary2[key];
					for (int i = 0; i < num; i++)
					{
						switch (key)
						{
						case "Health":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerHealth(text);
							}
							break;
						case "Stamina":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerEnergy(text);
							}
							break;
						case "Extra Jump":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerExtraJump(text);
							}
							break;
						case "Launch":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerTumbleLaunch(text);
							}
							break;
						case "Map Player Count":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradeMapPlayerCount(text);
							}
							break;
						case "Speed":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerSprintSpeed(text);
							}
							break;
						case "Strength":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerGrabStrength(text);
							}
							break;
						case "Range":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerGrabRange(text);
							}
							break;
						case "Throw":
							if (PhotonNetwork.IsMasterClient)
							{
								PunManager.instance.UpgradePlayerThrowStrength(text);
							}
							break;
						}
					}
					((BaseUnityPlugin)this).Logger.LogInfo((object)$"为玩家 {playerNameRef.Invoke(item)} 同步升级: {key}, 从 {dictionary2[key]} 到 {value}");
				}
			}
		}

		public static PlayerAvatar? GetLocalPlayer()
		{
			if ((Object)(object)cachedLocalPlayer != (Object)null && Time.time - lastCheckTime < 1f)
			{
				return cachedLocalPlayer;
			}
			lastCheckTime = Time.time;
			foreach (PlayerAvatar item in SemiFunc.PlayerGetAll())
			{
				if (isLocalRef.Invoke(item))
				{
					cachedLocalPlayer = item;
					return item;
				}
			}
			return cachedLocalPlayer;
		}
	}
}