Decompiled source of FightingLeaderboard v1.0.0

fightMonsters.dll

Decompiled a month ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using GameNetcodeStuff;
using HarmonyLib;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.Controls;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("fightMonsters")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("fightMonsters")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("60fcee24-6c50-43cd-93b0-590b50f924ad")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace fightMonsters;

[BepInPlugin("lengjing.fightMonsters", "fightMonsters", "1.0.0")]
public class fightMonsters : BaseUnityPlugin
{
	private struct PlayerStats
	{
		public string Username;

		public int Hits;

		public int Score;

		public float Total;

		public bool IsDead;
	}

	[HarmonyPatch(typeof(RoundManager))]
	[HarmonyPatch("DespawnPropsAtEndOfRound")]
	public static class StopRankingUpdates
	{
		[HarmonyPrefix]
		private static void Prefix()
		{
			fightMonsters fightMonsters2 = Object.FindObjectOfType<fightMonsters>();
			if ((Object)(object)fightMonsters2 != (Object)null && fightMonsters2.rankingCoroutine != null)
			{
				((MonoBehaviour)fightMonsters2).StopCoroutine(fightMonsters2.rankingCoroutine);
				fightMonsters2.rankingCoroutine = null;
			}
		}
	}

	[HarmonyPatch(typeof(StartOfRound))]
	[HarmonyPatch("gameOverAnimation")]
	public static class GameOverAnimation_Patch
	{
		[HarmonyPostfix]
		private static void Postfix(StartOfRound __instance, bool leavingOnMidnight)
		{
			if (!((NetworkBehaviour)__instance).IsServer || !ConfigMvpEnabled.Value)
			{
				return;
			}
			try
			{
				var list = (from p in Object.FindObjectsOfType<PlayerControllerB>()
					where (Object)(object)p != (Object)null
					select new
					{
						Username = p.playerUsername,
						Score = PlayerScoreTracker.GetScoreFast(p.playerClientId),
						Hits = PlayerHitTracker.GetHitsFast(p.playerClientId),
						Total = (float)(PlayerScoreTracker.GetScoreFast(p.playerClientId) * ConfigScoreWeightX.Value + PlayerHitTracker.GetHitsFast(p.playerClientId) * ConfigScoreWeightY.Value) / 10f
					} into p
					orderby p.Total descending
					select p).ToList();
				if (list.Count > 0 && list[0].Score >= 0)
				{
					var anon = list[0];
					string text = "<color=#FF00FF>[MVP] <color=#00FF00>" + anon.Username + "</color></color> - " + $"<color=#FFFF00>总得分: <color=#FFA500>{anon.Total:F1}</color></color> " + $"<color=#FFFF00>(得分: <color=#FFA500>{anon.Score}</color>, 有效伤害: <color=#FFA500>{anon.Hits}</color>)</color>";
					HUDManager.Instance.AddTextToChatOnServer(text, -1);
				}
			}
			catch
			{
			}
		}
	}

	private float lastSendTime;

	private bool isCoroutineRunning;

	public static ConfigEntry<bool> ConfigEnabled;

	public static ConfigEntry<bool> ConfigMvpEnabled;

	public static ConfigEntry<float> ConfigInterval;

	public static ConfigEntry<int> ConfigTopCount;

	public static ConfigEntry<int> ConfigSandSpiderScore;

	public static ConfigEntry<int> ConfigCaveDwellerScore;

	public static ConfigEntry<int> ConfigCrawlerScore;

	public static ConfigEntry<int> ConfigMaskedPlayerScore;

	public static ConfigEntry<int> ConfigFlowermanScore;

	public static ConfigEntry<int> ConfigHoarderBugScore;

	public static ConfigEntry<int> ConfigNutcrackerScore;

	public static ConfigEntry<int> ConfigButlerScore;

	public static ConfigEntry<int> ConfigForestGiantScore;

	public static ConfigEntry<int> ConfigMouthDogScore;

	public static ConfigEntry<int> ConfigBaboonBirdScore;

	public static ConfigEntry<int> ConfigCentipedeScore;

	public static ConfigEntry<int> ConfigScoreWeightX;

	public static ConfigEntry<int> ConfigScoreWeightY;

	public Coroutine rankingCoroutine;

	private const float UPDATE_INTERVAL = 60f;

	private Harmony _harmony;

	private bool isBHeld;

	private Rect windowRect = new Rect(10f, 10f, 350f, 10f);

	private List<PlayerControllerB> cachedPlayers = new List<PlayerControllerB>();

	private bool needRefresh = true;

	private float lastUpdateTime;

	private GUIStyle cachedTitleStyle;

	private GUIStyle cachedColumnHeaderStyle;

	private GUIStyle cachedHighlightStyle;

	private GUIStyle cachedNormalStyle;

	private static readonly StringBuilder _cachedSb;

	private List<(string, int, int, float)> _cachedRanking = new List<(string, int, int, float)>();

	private const int BASE_WINDOW_HEIGHT = 120;

	private WaitForSecondsRealtime _cachedWait;

	private static readonly List<PlayerControllerB> _tempPlayers;

	private (string, int, int, float)[] _cachedRankingArray = Array.Empty<(string, int, int, float)>();

	private float _lastRankingUpdateTime;

	private const float MIN_RANKING_UPDATE_INTERVAL = 0.5f;

	private bool _windowSizeDirty = true;

	private float _cachedWindowHeight;

	private void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_0010: Expected O, but got Unknown
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a3: Expected O, but got Unknown
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d5: Expected O, but got Unknown
		//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
		//IL_0107: Expected O, but got Unknown
		//IL_012f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0139: Expected O, but got Unknown
		//IL_0161: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Expected O, but got Unknown
		//IL_0193: Unknown result type (might be due to invalid IL or missing references)
		//IL_019d: Expected O, but got Unknown
		//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01cf: Expected O, but got Unknown
		//IL_01f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_0201: Expected O, but got Unknown
		//IL_0229: Unknown result type (might be due to invalid IL or missing references)
		//IL_0233: Expected O, but got Unknown
		//IL_025b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0265: Expected O, but got Unknown
		//IL_028d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0297: Expected O, but got Unknown
		//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c9: Expected O, but got Unknown
		//IL_02f1: Unknown result type (might be due to invalid IL or missing references)
		//IL_02fb: Expected O, but got Unknown
		//IL_0323: Unknown result type (might be due to invalid IL or missing references)
		//IL_032d: Expected O, but got Unknown
		//IL_0355: Unknown result type (might be due to invalid IL or missing references)
		//IL_035f: Expected O, but got Unknown
		//IL_0387: Unknown result type (might be due to invalid IL or missing references)
		//IL_0391: Expected O, but got Unknown
		_harmony = new Harmony("lengjing.fightMonsters");
		_harmony.PatchAll();
		((BaseUnityPlugin)this).Logger.LogInfo((object)"脚本已加载!");
		ConfigEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "是否启用自动排名播报");
		ConfigMvpEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "MvpEnabled", true, "是否启用MVP播报");
		ConfigInterval = ((BaseUnityPlugin)this).Config.Bind<float>("General", "Interval", 10f, new ConfigDescription("播报间隔(秒)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(10f, 300f), Array.Empty<object>()));
		ConfigTopCount = ((BaseUnityPlugin)this).Config.Bind<int>("General", "TopCount", 3, new ConfigDescription("显示前几名", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 10), Array.Empty<object>()));
		ConfigScoreWeightX = ((BaseUnityPlugin)this).Config.Bind<int>("ScoreFormula", "X_Value", 7, new ConfigDescription("得分权重X(需满足X+Y=10)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigScoreWeightY = ((BaseUnityPlugin)this).Config.Bind<int>("ScoreFormula", "Y_Value", 3, new ConfigDescription("有效伤害权重Y(需满足X+Y=10)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigSandSpiderScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "SandSpiderScore", 2, new ConfigDescription("蜘蛛击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigCaveDwellerScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "CaveDwellerScore", 3, new ConfigDescription("食人魔击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigCrawlerScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "CrawlerScore", 2, new ConfigDescription("半身鱼击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigMaskedPlayerScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "MaskedPlayerScore", 1, new ConfigDescription("假人击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigFlowermanScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "FlowermanScore", 3, new ConfigDescription("小黑击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigHoarderBugScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "HoarderBugScore", 1, new ConfigDescription("囤积虫击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigNutcrackerScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "NutcrackerScore", 2, new ConfigDescription("夹子击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigButlerScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "ButlerScore", 2, new ConfigDescription("管家击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigForestGiantScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "ForestGiantScore", 5, new ConfigDescription("巨人击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigMouthDogScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "MouthDogScore", 3, new ConfigDescription("无眼狗击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigBaboonBirdScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "CaveBaboonBirdScore", 1, new ConfigDescription("狒狒鹰击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigCentipedeScore = ((BaseUnityPlugin)this).Config.Bind<int>("MonsterScores", "CaveCentipedeScore", 1, new ConfigDescription("抱脸虫击杀得分", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		((BaseUnityPlugin)this).Config.SettingChanged += OnConfigChanged;
		((BaseUnityPlugin)this).Config.SettingChanged += ValidateWeights;
		UpdateWaitInterval();
	}

	private static void ValidateWeights(object sender, SettingChangedEventArgs e)
	{
		if (!(e.ChangedSetting.Definition.Section != "ScoreFormula") && ConfigScoreWeightX.Value + ConfigScoreWeightY.Value != 10)
		{
			ConfigScoreWeightX.Value = 10 - ConfigScoreWeightY.Value;
		}
	}

	private void OnConfigChanged(object sender, SettingChangedEventArgs e)
	{
		if (e.ChangedSetting.Definition.Key == "Interval")
		{
			UpdateWaitInterval();
		}
	}

	private void UpdateWaitInterval()
	{
		//IL_000b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0015: Expected O, but got Unknown
		_cachedWait = new WaitForSecondsRealtime(ConfigInterval.Value);
	}

	private void Start()
	{
		if (!isCoroutineRunning && ConfigEnabled.Value)
		{
			((MonoBehaviour)this).StartCoroutine(AutoSendRankingUpdate());
			isCoroutineRunning = true;
		}
	}

	private void OnDestroy()
	{
		if (rankingCoroutine != null)
		{
			((MonoBehaviour)this).StopCoroutine(rankingCoroutine);
			isCoroutineRunning = false;
		}
	}

	private void Update()
	{
		isBHeld = ((ButtonControl)Keyboard.current.bKey).isPressed;
		if (Time.realtimeSinceStartup - lastUpdateTime > 0.3f)
		{
			UpdatePlayerCache();
			lastUpdateTime = Time.realtimeSinceStartup;
			needRefresh = true;
		}
	}

	private void UpdatePlayerCache()
	{
		_tempPlayers.Clear();
		PlayerControllerB[] array = Object.FindObjectsOfType<PlayerControllerB>();
		foreach (PlayerControllerB val in array)
		{
			if ((Object)(object)val != (Object)null)
			{
				_tempPlayers.Add(val);
			}
		}
		cachedPlayers = new List<PlayerControllerB>(_tempPlayers);
	}

	private void OnGUI()
	{
		//IL_0067: 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_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Expected O, but got Unknown
		//IL_008a: Unknown result type (might be due to invalid IL or missing references)
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		if (isBHeld && (((NetworkBehaviour)RoundManager.Instance).IsServer || ((NetworkBehaviour)RoundManager.Instance).IsHost))
		{
			if (_windowSizeDirty || needRefresh)
			{
				CalculateWindowSize();
				_windowSizeDirty = false;
				needRefresh = false;
			}
			GUI.color = new Color(0.15f, 0.15f, 0.15f, 0.97f);
			windowRect = GUI.Window(0, windowRect, new WindowFunction(DrawStatsWindow), "");
			if (cachedTitleStyle == null)
			{
				InitStyles();
			}
			GUI.Label(new Rect(((Rect)(ref windowRect)).x, ((Rect)(ref windowRect)).y + 4f, ((Rect)(ref windowRect)).width, 28f), "实时战斗统计 - 按住B显示", cachedTitleStyle);
		}
	}

	private void CalculateWindowSize()
	{
		int num = Mathf.Clamp(cachedPlayers.Count, 3, 15);
		_cachedWindowHeight = 28 + num * 28 + 10;
		((Rect)(ref windowRect)).width = 500f;
		((Rect)(ref windowRect)).height = Mathf.Clamp(_cachedWindowHeight, 120f, (float)Screen.height * 0.75f);
		((Rect)(ref windowRect)).x = Mathf.Clamp(((Rect)(ref windowRect)).x, 10f, (float)Screen.width - ((Rect)(ref windowRect)).width - 10f);
		((Rect)(ref windowRect)).y = Mathf.Clamp(((Rect)(ref windowRect)).y, 10f, (float)Screen.height - ((Rect)(ref windowRect)).height - 10f);
	}

	private void InitStyles()
	{
		//IL_000b: 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_0017: Unknown result type (might be due to invalid IL or missing references)
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0026: Unknown result type (might be due to invalid IL or missing references)
		//IL_002c: Unknown result type (might be due to invalid IL or missing references)
		//IL_003b: Expected O, but got Unknown
		//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_0053: 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_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_006f: Expected O, but got Unknown
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_007f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: 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_0095: Unknown result type (might be due to invalid IL or missing references)
		//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b9: Expected O, but got Unknown
		//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: 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_00fc: Expected O, but got Unknown
		GUIStyle val = new GUIStyle(GUI.skin.label)
		{
			alignment = (TextAnchor)4,
			fontSize = 16,
			fontStyle = (FontStyle)1
		};
		val.normal.textColor = Color.green;
		cachedTitleStyle = val;
		GUIStyle val2 = new GUIStyle(GUI.skin.label)
		{
			fontSize = 14,
			alignment = (TextAnchor)4
		};
		val2.normal.textColor = Color.green;
		cachedColumnHeaderStyle = val2;
		GUIStyle val3 = new GUIStyle(GUI.skin.label)
		{
			fontSize = 15,
			fontStyle = (FontStyle)1,
			alignment = (TextAnchor)4
		};
		val3.normal.textColor = new Color(1f, 0.9f, 0.4f);
		cachedHighlightStyle = val3;
		GUIStyle val4 = new GUIStyle(GUI.skin.label)
		{
			fontSize = 14,
			alignment = (TextAnchor)4
		};
		val4.normal.textColor = new Color(0.8f, 0.8f, 0.8f);
		cachedNormalStyle = val4;
	}

	public IEnumerator AutoSendRankingUpdate()
	{
		while (true)
		{
			yield return _cachedWait;
			if (ShouldSendUpdate())
			{
				string text = BuildOptimizedRankingMessage();
				if (!string.IsNullOrEmpty(text))
				{
					HUDManager.Instance.AddTextToChatOnServer(text, -1);
					lastSendTime = Time.realtimeSinceStartup;
				}
			}
		}
	}

	private bool ShouldSendUpdate()
	{
		if ((Object)(object)StartOfRound.Instance != (Object)null && !StartOfRound.Instance.inShipPhase && (Object)(object)HUDManager.Instance != (Object)null && ConfigEnabled.Value && ((NetworkBehaviour)RoundManager.Instance).IsHost)
		{
			return Time.realtimeSinceStartup - lastSendTime >= ConfigInterval.Value;
		}
		return false;
	}

	private string BuildOptimizedRankingMessage()
	{
		try
		{
			if (Time.realtimeSinceStartup - _lastRankingUpdateTime < 0.5f)
			{
				return null;
			}
			_lastRankingUpdateTime = Time.realtimeSinceStartup;
			Array.Resize(ref _cachedRankingArray, cachedPlayers.Count);
			for (int i = 0; i < cachedPlayers.Count; i++)
			{
				PlayerControllerB val = cachedPlayers[i];
				int scoreFast = PlayerScoreTracker.GetScoreFast(val.playerClientId);
				int hitsFast = PlayerHitTracker.GetHitsFast(val.playerClientId);
				float item = (float)(scoreFast * ConfigScoreWeightX.Value + hitsFast * ConfigScoreWeightY.Value) / 10f;
				_cachedRankingArray[i] = (val.playerUsername, scoreFast, hitsFast, item);
			}
			Array.Sort(_cachedRankingArray, ((string, int, int, float) a, (string, int, int, float) b) => b.Item4.CompareTo(a.Item4));
			StringBuilder cachedSb = _cachedSb;
			cachedSb.Clear();
			int num = Math.Min(ConfigTopCount.Value, _cachedRankingArray.Length);
			for (int j = 0; j < num; j++)
			{
				(string, int, int, float) tuple = _cachedRankingArray[j];
				cachedSb.Append($"\n{j + 1}. <color=#00FF00>{tuple.Item1}</color> - ").Append($"<color=#FFFF00>总得分</color>: <color=#FFA500>{tuple.Item4}</color>");
			}
			cachedPlayers.Count((PlayerControllerB p) => p.isPlayerDead);
			cachedSb.Append($"\n<color=#AAAAAA>({ConfigInterval.Value}秒)</color></color>");
			return cachedSb.ToString();
		}
		catch (Exception)
		{
			return null;
		}
	}

	private void DrawStatsWindow(int windowID)
	{
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_0142: Unknown result type (might be due to invalid IL or missing references)
		//IL_016b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0194: Unknown result type (might be due to invalid IL or missing references)
		//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
		//IL_0293: Unknown result type (might be due to invalid IL or missing references)
		//IL_02c2: Unknown result type (might be due to invalid IL or missing references)
		//IL_02e0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0308: Unknown result type (might be due to invalid IL or missing references)
		//IL_0330: Unknown result type (might be due to invalid IL or missing references)
		if (cachedColumnHeaderStyle == null)
		{
			InitStyles();
		}
		int count = cachedPlayers.Count;
		List<PlayerStats> list = new List<PlayerStats>(count);
		for (int i = 0; i < count; i++)
		{
			PlayerControllerB val = cachedPlayers[i];
			list.Add(new PlayerStats
			{
				Username = val.playerUsername,
				Hits = PlayerHitTracker.GetHitsFast(val.playerClientId),
				Score = PlayerScoreTracker.GetScoreFast(val.playerClientId),
				Total = (float)(PlayerScoreTracker.GetScoreFast(val.playerClientId) * ConfigScoreWeightX.Value + PlayerHitTracker.GetHitsFast(val.playerClientId) * ConfigScoreWeightY.Value) / 10f,
				IsDead = val.isPlayerDead
			});
		}
		list.Sort((PlayerStats a, PlayerStats b) => b.Total.CompareTo(a.Total));
		GUILayout.BeginArea(new Rect(12f, 28f, ((Rect)(ref windowRect)).width - 24f, ((Rect)(ref windowRect)).height - 40f));
		GUI.Label(new Rect(0f, 0f, 50f, 28f), "名次", cachedColumnHeaderStyle);
		GUI.Label(new Rect(50f, 0f, 140f, 28f), "玩家名称", cachedColumnHeaderStyle);
		GUI.Label(new Rect(190f, 0f, 80f, 28f), "有效伤害", cachedColumnHeaderStyle);
		GUI.Label(new Rect(270f, 0f, 80f, 28f), "得分", cachedColumnHeaderStyle);
		GUI.Label(new Rect(350f, 0f, 80f, 28f), "总分", cachedColumnHeaderStyle);
		float num = 28f;
		for (int j = 0; j < list.Count; j++)
		{
			PlayerStats playerStats = list[j];
			bool isDead = playerStats.IsDead;
			bool flag = j == 0 || (j > 0 && playerStats.Total == list[j - 1].Total);
			GUIStyle val2 = (isDead ? cachedNormalStyle : (flag ? cachedHighlightStyle : cachedNormalStyle));
			string text = playerStats.Username + (isDead ? " ☠" : "");
			GUI.Label(new Rect(0f, num, 50f, 28f), $"#{j + 1}", val2);
			GUI.Label(new Rect(50f, num, 140f, 28f), text, val2);
			GUI.Label(new Rect(190f, num, 80f, 28f), playerStats.Hits.ToString(), val2);
			GUI.Label(new Rect(270f, num, 80f, 28f), playerStats.Score.ToString(), val2);
			GUI.Label(new Rect(350f, num, 80f, 28f), playerStats.Total.ToString(), val2);
			num += 28f;
		}
		GUILayout.EndArea();
		GUI.DragWindow();
	}

	static fightMonsters()
	{
		_cachedSb = new StringBuilder(512);
		_tempPlayers = new List<PlayerControllerB>(4);
	}
}
public static class PlayerHitTracker
{
	private static readonly Dictionary<ulong, int> _playerHits = new Dictionary<ulong, int>();

	private static readonly object _lock = new object();

	public static void Increment(ulong playerId, Type enemyType)
	{
		lock (_lock)
		{
			_playerHits[playerId] = ((!_playerHits.TryGetValue(playerId, out var value)) ? 1 : (value + 1));
		}
	}

	public static int GetHits(ulong playerId)
	{
		lock (_lock)
		{
			int value;
			return _playerHits.TryGetValue(playerId, out value) ? value : 0;
		}
	}

	public static void Reset()
	{
		lock (_lock)
		{
			_playerHits.Clear();
		}
	}

	public static int GetHitsFast(ulong playerId)
	{
		int value;
		return _playerHits.TryGetValue(playerId, out value) ? value : 0;
	}
}
public static class PlayerScoreTracker
{
	private static readonly Dictionary<ulong, int> _playerScores = new Dictionary<ulong, int>();

	private static readonly object _lock = new object();

	public static void AddScore(ulong playerId, int score)
	{
		lock (_lock)
		{
			_playerScores[playerId] = (_playerScores.TryGetValue(playerId, out var value) ? (value + score) : score);
		}
	}

	public static int GetScore(ulong playerId)
	{
		lock (_lock)
		{
			int value;
			return _playerScores.TryGetValue(playerId, out value) ? value : 0;
		}
	}

	public static void Reset()
	{
		lock (_lock)
		{
			_playerScores.Clear();
		}
	}

	public static int GetScoreFast(ulong playerId)
	{
		int value;
		return _playerScores.TryGetValue(playerId, out value) ? value : 0;
	}
}
[HarmonyPatch(typeof(SandSpiderAI))]
public static class SandSpiderAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigSandSpiderScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(SandSpiderAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(CaveDwellerAI))]
public static class CaveDwellerAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigCaveDwellerScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(CaveDwellerAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(CrawlerAI))]
public static class CrawlerAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigCrawlerScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(CrawlerAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(MaskedPlayerEnemy))]
public static class MaskedPlayerEnemy_Patch
{
	private static int ScoreValue => fightMonsters.ConfigMaskedPlayerScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(MaskedPlayerEnemy __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(FlowermanAI))]
public static class FlowermanAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigFlowermanScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(FlowermanAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(HoarderBugAI))]
public static class HoarderBugAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigHoarderBugScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(HoarderBugAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(NutcrackerEnemyAI))]
public static class NutcrackerEnemyAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigNutcrackerScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(NutcrackerEnemyAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(ButlerEnemyAI))]
public static class ButlerEnemyAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigButlerScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(ButlerEnemyAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(ForestGiantAI))]
public static class ForestGiantAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigForestGiantScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(ForestGiantAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(MouthDogAI))]
public static class MouthDogAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigMouthDogScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(MouthDogAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(BaboonBirdAI))]
public static class BaboonBirdAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigBaboonBirdScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(BaboonBirdAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(CentipedeAI))]
public static class CentipedeAI_Patch
{
	private static int ScoreValue => fightMonsters.ConfigCentipedeScore.Value;

	[HarmonyPrefix]
	[HarmonyPatch("HitEnemy")]
	private static void HitEnemyPrefix(CentipedeAI __instance, int force, PlayerControllerB playerWhoHit, ref bool ___isEnemyDead, ref int ___enemyHP)
	{
		try
		{
			if (playerWhoHit.isPlayerControlled && !playerWhoHit.isPlayerDead && ___enemyHP > 0)
			{
				PlayerHitTracker.Increment(playerWhoHit?.playerClientId ?? 0, ((object)__instance).GetType());
				if (___enemyHP <= force && ___enemyHP > 0)
				{
					PlayerScoreTracker.AddScore(playerWhoHit?.playerClientId ?? 0, ScoreValue);
				}
				if (___isEnemyDead && ___enemyHP > 0)
				{
					___enemyHP = 0;
				}
			}
		}
		catch (Exception)
		{
		}
	}
}
[HarmonyPatch(typeof(StartOfRound))]
[HarmonyPatch("StartGame")]
public static class StartOfRound_ResetStats
{
	[HarmonyPrefix]
	private static void PrefixStartGame(StartOfRound __instance)
	{
		try
		{
			if (!((NetworkBehaviour)StartOfRound.Instance).IsServer)
			{
				return;
			}
			PlayerHitTracker.Reset();
			PlayerScoreTracker.Reset();
			fightMonsters fightMonsters2 = Object.FindObjectOfType<fightMonsters>();
			if ((Object)(object)fightMonsters2 != (Object)null && fightMonsters.ConfigEnabled.Value)
			{
				if (fightMonsters2.rankingCoroutine != null)
				{
					((MonoBehaviour)fightMonsters2).StopCoroutine(fightMonsters2.rankingCoroutine);
				}
				fightMonsters2.rankingCoroutine = ((MonoBehaviour)fightMonsters2).StartCoroutine(fightMonsters2.AutoSendRankingUpdate());
			}
		}
		catch (Exception)
		{
		}
	}
}