Decompiled source of HardMode v1.0.0

HardMode.dll

Decompiled 2 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using REPOLib.Commands;
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(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: IgnoresAccessChecksTo("")]
[assembly: AssemblyCompany("Teplovozovich")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+cfd8edba681674641f512d11ad7cbdb8316e2e96")]
[assembly: AssemblyProduct("HardMode")]
[assembly: AssemblyTitle("HardMode")]
[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.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;
		}
	}
	[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 HardMode
{
	[BepInPlugin("Teplovozovich.HardMode", "HardMode", "1.0.0")]
	public class HardModePlugin : BaseUnityPlugin
	{
		public static ManualLogSource mls;

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

		private void Awake()
		{
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			ModConfig.BaseMaxHealth = ((BaseUnityPlugin)this).Config.Bind<int>("General", "BaseMaxHealth", 31, "Player starting HP. Only odd numbers work");
			ModConfig.EnemySpawnMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("General", "EnemySpawnMultiplier", 3, "How many enemies spawn per original (gnomes may cause lag)");
			mls = ((BaseUnityPlugin)this).Logger;
			mls.LogInfo((object)"HardMode загружен!");
			Harmony val = new Harmony("Teplovozovich.HardMode");
			val.PatchAll(typeof(PlayerHealthPatch));
			val.PatchAll(typeof(PlayerAvatarPatch));
			val.PatchAll(typeof(LevelGeneratorMonsterMultiplier));
		}
	}
	[HarmonyPatch(typeof(LevelGenerator))]
	public class LevelGeneratorMonsterMultiplier
	{
		private static int MonsterMultiplier = ModConfig.EnemySpawnMultiplier.Value;

		[HarmonyPatch("EnemySpawn")]
		[HarmonyPostfix]
		private static void Postfix(LevelGenerator __instance, EnemySetup enemySetup, Vector3 position)
		{
			//IL_0012: 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)
			//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_0048: Unknown result type (might be due to invalid IL or missing references)
			//IL_0091: 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_007e: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				HardModePlugin.mls.LogInfo((object)$"Оригинальный спавн: {((Object)enemySetup).name} на {position}");
				for (int i = 1; i < MonsterMultiplier; i++)
				{
					Vector3 validSpawnPosition = GetValidSpawnPosition(position);
					HardModePlugin.mls.LogInfo((object)$"Дублирование #{i}: {((Object)enemySetup).name} на {validSpawnPosition}");
					foreach (PrefabRef spawnObject in enemySetup.spawnObjects)
					{
						GameObject enemyObj = (GameManager.Multiplayer() ? PhotonNetwork.InstantiateRoomObject(spawnObject.ResourcePath, validSpawnPosition, Quaternion.identity, (byte)0, (object[])null) : Object.Instantiate<GameObject>(spawnObject.Prefab, validSpawnPosition, Quaternion.identity));
						SetupEnemyComponents(__instance, enemyObj, validSpawnPosition);
					}
				}
			}
			catch (Exception ex)
			{
				HardModePlugin.mls.LogError((object)("Ошибка при дублировании: " + ex.Message));
			}
		}

		private static Vector3 GetValidSpawnPosition(Vector3 originalPosition)
		{
			//IL_0021: 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_0033: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: 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)
			float num = Random.Range(-10f, 10f);
			float num2 = Random.Range(-10f, 10f);
			return originalPosition + new Vector3(num, 0f, num2);
		}

		private static void SetupEnemyComponents(LevelGenerator __instance, GameObject enemyObj, Vector3 position)
		{
			//IL_0030: Unknown result type (might be due to invalid IL or missing references)
			try
			{
				EnemyParent component = enemyObj.GetComponent<EnemyParent>();
				if ((Object)(object)component != (Object)null)
				{
					component.SetupDone = true;
					Enemy componentInChildren = enemyObj.GetComponentInChildren<Enemy>();
					if ((Object)(object)componentInChildren != (Object)null)
					{
						componentInChildren.EnemyTeleported(position);
						__instance.EnemiesSpawnTarget++;
						EnemyDirector.instance.FirstSpawnPointAdd(component);
						HardModePlugin.mls.LogInfo((object)("Дублированный монстр создан: " + ((Object)enemyObj).name));
					}
					else
					{
						HardModePlugin.mls.LogWarning((object)("Не найден компонент Enemy у " + ((Object)enemyObj).name));
					}
				}
				else
				{
					HardModePlugin.mls.LogWarning((object)("Не найден компонент EnemyParent у " + ((Object)enemyObj).name));
				}
			}
			catch (Exception ex)
			{
				HardModePlugin.mls.LogError((object)("Ошибка настройки компонентов: " + ex.Message));
			}
		}
	}
	public static class ModConfig
	{
		public static ConfigEntry<int> BaseMaxHealth { get; set; }

		public static ConfigEntry<int> EnemySpawnMultiplier { get; set; }
	}
	public class PlayerHealthData
	{
		public int CurrentHealth { get; set; }

		public int MaxHealth { get; set; }

		public PlayerHealthData(int currentHealth, int maxHealth)
		{
			CurrentHealth = currentHealth;
			MaxHealth = maxHealth;
		}
	}
	public static class SharedData
	{
		public static string LastCallSource = "unknown";

		public static bool IsApplyingPatch = false;

		public static int NewMaxHealth = ModConfig.BaseMaxHealth.Value;
	}
	[HarmonyPatch(typeof(PlayerAvatar))]
	public class PlayerAvatarPatch
	{
		private static int originalHealAmount;

		[HarmonyPatch("FinalHealRPC")]
		[HarmonyPrefix]
		private static void Prefix(PlayerAvatar __instance)
		{
			HardModePlugin.mls.LogInfo((object)("FinalHealRPCPrefix " + __instance.playerName));
			SharedData.LastCallSource = "FinalHealRPCPrefix";
		}

		[HarmonyPatch("FinalHealRPC")]
		[HarmonyPostfix]
		private static void Postfix(PlayerAvatar __instance)
		{
			HardModePlugin.mls.LogInfo((object)("FinalHealRPCPostfix " + __instance.playerName));
			if (__instance.isLocal && (Object)(object)__instance.playerHealth != (Object)null)
			{
				int health = __instance.playerHealth.health;
				int maxHealth = __instance.playerHealth.maxHealth;
				HardModePlugin.mls.LogInfo((object)$"После лечения грузовиком: {health}/{maxHealth}");
			}
		}
	}
	[HarmonyPatch(typeof(PlayerHealth))]
	public class PlayerHealthPatch
	{
		[CompilerGenerated]
		private sealed class <Postfix>d__4 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public IEnumerator __result;

			public PlayerHealth __instance;

			private int <newMaxHealth>5__1;

			private List<PlayerAvatar> <allPlayers>5__2;

			private List<PlayerAvatar>.Enumerator <>s__3;

			private PlayerAvatar <player>5__4;

			private PlayerHealth <playerHealth>5__5;

			private string <steamId>5__6;

			private int <currentHealth>5__7;

			private int <currenMaxtHealth>5__8;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <Postfix>d__4(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<allPlayers>5__2 = null;
				<>s__3 = default(List<PlayerAvatar>.Enumerator);
				<player>5__4 = null;
				<playerHealth>5__5 = null;
				<steamId>5__6 = null;
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = __result;
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (!PhotonNetwork.IsMasterClient)
					{
						return false;
					}
					<newMaxHealth>5__1 = SharedData.NewMaxHealth;
					<allPlayers>5__2 = SemiFunc.PlayerGetAll();
					SharedData.LastCallSource = "Postfix Fetch";
					<>s__3 = <allPlayers>5__2.GetEnumerator();
					try
					{
						while (<>s__3.MoveNext())
						{
							<player>5__4 = <>s__3.Current;
							if (!((Object)(object)<player>5__4 == (Object)null) && !((Object)(object)<player>5__4.playerHealth == (Object)null))
							{
								<playerHealth>5__5 = <player>5__4.playerHealth;
								<steamId>5__6 = SemiFunc.PlayerGetSteamID(<player>5__4);
								<currentHealth>5__7 = StatsManager.instance.GetPlayerHealth(<steamId>5__6);
								<currenMaxtHealth>5__8 = StatsManager.instance.GetPlayerMaxHealth(<steamId>5__6);
								HardModePlugin.PlayerHealthDatabase[<steamId>5__6] = new PlayerHealthData(<currentHealth>5__7, <currenMaxtHealth>5__8);
								HardModePlugin.mls.LogInfo((object)$"ТЕСТ Postfix FETCH: для {<steamId>5__6} текущее здоровье {<currentHealth>5__7}/{<currentHealth>5__7 + <currenMaxtHealth>5__8}");
								StatsManager.instance.SetPlayerHealth(<steamId>5__6, Mathf.Min(<currentHealth>5__7, <currenMaxtHealth>5__8 + <newMaxHealth>5__1), false);
								if ((Object)(object)<playerHealth>5__5.photonView != (Object)null)
								{
									<playerHealth>5__5.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[3]
									{
										Mathf.Min(<currentHealth>5__7, <currenMaxtHealth>5__8 + <newMaxHealth>5__1),
										<newMaxHealth>5__1 + <currenMaxtHealth>5__8,
										true
									});
									UpdatePlayerHealthData(<steamId>5__6, Mathf.Min(<currentHealth>5__7, <currenMaxtHealth>5__8 + <newMaxHealth>5__1), <newMaxHealth>5__1 + <currenMaxtHealth>5__8);
								}
								<playerHealth>5__5 = null;
								<steamId>5__6 = null;
								<player>5__4 = null;
							}
						}
					}
					finally
					{
						((IDisposable)<>s__3).Dispose();
					}
					<>s__3 = default(List<PlayerAvatar>.Enumerator);
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		private static int newMaxHealth = SharedData.NewMaxHealth;

		private static bool isApplyingPatch = false;

		[HarmonyPatch("Fetch")]
		[HarmonyPrefix]
		private static void Prefix(PlayerHealth __instance)
		{
			HardModePlugin.mls.LogInfo((object)("[Fetch Prefix] BEFORE ваниллы: " + $"health={__instance.health}, max={__instance.maxHealth}"));
		}

		private static void LogAllPlayerHealthData()
		{
			HardModePlugin.mls.LogInfo((object)"=== ВЫВОД ВСЕХ ИГРОКОВ ===");
			if (HardModePlugin.PlayerHealthDatabase.Count == 0)
			{
				HardModePlugin.mls.LogInfo((object)"База данных пуста!");
				return;
			}
			foreach (KeyValuePair<string, PlayerHealthData> item in HardModePlugin.PlayerHealthDatabase)
			{
				string key = item.Key;
				PlayerHealthData value = item.Value;
				HardModePlugin.mls.LogInfo((object)$"  {key}: {value.CurrentHealth}/{value.MaxHealth}");
			}
			HardModePlugin.mls.LogInfo((object)$"Всего игроков: {HardModePlugin.PlayerHealthDatabase.Count}");
		}

		[IteratorStateMachine(typeof(<Postfix>d__4))]
		[HarmonyPatch("Fetch")]
		[HarmonyPostfix]
		private static IEnumerator Postfix(IEnumerator __result, PlayerHealth __instance)
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <Postfix>d__4(0)
			{
				__result = __result,
				__instance = __instance
			};
		}

		public static PlayerHealthData GetPlayerHealthData(string steamId)
		{
			if (HardModePlugin.PlayerHealthDatabase.TryGetValue(steamId, out PlayerHealthData value))
			{
				return value;
			}
			return null;
		}

		public static void UpdatePlayerHealthData(string steamId, int currentHealth, int maxHealth)
		{
			HardModePlugin.mls.LogInfo((object)"До:");
			LogAllPlayerHealthData();
			HardModePlugin.PlayerHealthDatabase[steamId] = new PlayerHealthData(currentHealth, maxHealth);
			HardModePlugin.mls.LogInfo((object)"После:");
			LogAllPlayerHealthData();
		}

		[HarmonyPatch("UpdateHealthRPC")]
		[HarmonyPrefix]
		private static bool PrefixUpdateHealthRPC(PlayerHealth __instance, ref int healthNew, ref int healthMax, bool effect, PhotonMessageInfo _info)
		{
			//IL_006d: Unknown result type (might be due to invalid IL or missing references)
			//IL_030d: 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)
			if (isApplyingPatch)
			{
				int num = 0;
				int num2 = 0;
				string steamID = GetSteamID(__instance);
				num = StatsManager.instance.GetPlayerMaxHealth(steamID);
				num2 = StatsManager.instance.GetPlayerHealth(steamID);
				ManualLogSource mls = HardModePlugin.mls;
				object[] obj = new object[6] { steamID, healthNew, healthMax, num2, num, null };
				Player sender = _info.Sender;
				obj[5] = ((sender != null) ? new int?(sender.ActorNumber) : null);
				mls.LogInfo((object)string.Format("[-0 isApplyingPatch] {0} - Здоровье: {1}/{2} ИЗ GET: {3}/{4} (Отправитель: {5})", obj));
				return false;
			}
			isApplyingPatch = true;
			try
			{
				int num3 = 0;
				int num4 = 0;
				string steamID2 = GetSteamID(__instance);
				num3 = StatsManager.instance.GetPlayerMaxHealth(steamID2);
				num4 = StatsManager.instance.GetPlayerHealth(steamID2);
				int num5 = newMaxHealth + num3 / 2;
				int num6 = healthNew - GetPlayerHealthData(steamID2).CurrentHealth;
				if (SharedData.LastCallSource == "Postfix" && healthNew >= num4)
				{
					SharedData.LastCallSource = "UpdateHealthRPC";
					return false;
				}
				if (SharedData.LastCallSource == "FinalHealRPCPrefix")
				{
					SharedData.LastCallSource = "UpdateHealthRPC";
					ManualLogSource mls2 = HardModePlugin.mls;
					object[] obj2 = new object[6] { steamID2, healthNew, healthMax, num4, num3, null };
					Player sender2 = _info.Sender;
					obj2[5] = ((sender2 != null) ? new int?(sender2.ActorNumber) : null);
					mls2.LogInfo((object)string.Format("[IF FinalHealRPCPrefix] {0} - Здоровье: {1}/{2} ИЗ GET: {3}/{4} (Отправитель: {5})", obj2));
					if (healthNew - num4 >= 1)
					{
						if (healthNew <= 51)
						{
							HardModePlugin.mls.LogInfo((object)"[IF IF if >= 51 FinalHealRPCPrefix]");
							SendHealthRPC(__instance, num4 + 15, num5, effect: true);
							StatsManager.instance.SetPlayerHealth(steamID2, num4 + 15, false);
							healthNew = num4 + 15;
							healthMax = num5;
							return false;
						}
						HardModePlugin.mls.LogInfo((object)"[IF IF >= 1 FinalHealRPCPrefix]");
						SendHealthRPC(__instance, num4 + 15, num5, effect: true);
						StatsManager.instance.SetPlayerHealth(steamID2, num4 + 15, false);
						healthNew = num4 + 15;
						healthMax = num5;
						return false;
					}
					HardModePlugin.mls.LogInfo((object)"[IF  FinalHealRPCPrefix]");
					SendHealthRPC(__instance, num4 + 15, num5, effect: true);
					StatsManager.instance.SetPlayerHealth(steamID2, num4 + 15, false);
					healthNew = num4 + 15;
					healthMax = num5;
					return false;
				}
				HardModePlugin.mls.LogInfo((object)("[lastCallSource] " + SharedData.LastCallSource));
				ManualLogSource mls3 = HardModePlugin.mls;
				object[] obj3 = new object[6] { steamID2, healthNew, healthMax, num4, num3, null };
				Player sender3 = _info.Sender;
				obj3[5] = ((sender3 != null) ? new int?(sender3.ActorNumber) : null);
				mls3.LogInfo((object)string.Format("[1 ТЕСТ PrefixUpdateHealthRPC] {0} - Здоровье: {1}/{2} ИЗ GET: {3}/{4} (Отправитель: {5})", obj3));
				if (healthMax % 2 == 0)
				{
					HardModePlugin.mls.LogInfo((object)$"[2 IF] PrefixUpdateHealthRPC if {steamID2} - Установлено: {Mathf.Min(healthNew, num5)}/{num5}");
					SharedData.LastCallSource = "UpdateHealthRPC";
					SendHealthRPC(__instance, Mathf.Min(healthNew, num5), num5, effect: true);
					StatsManager.instance.SetPlayerHealth(steamID2, Mathf.Min(healthNew, num5), false);
					healthNew = Mathf.Min(healthNew, num5);
					healthMax = num5;
					HardModePlugin.mls.LogInfo((object)"[2.1 IF] А ПОСЛЕ SendHealthRPC ВООБЩЕ СРАБАТЫВАЕТ??");
				}
				else
				{
					HardModePlugin.mls.LogInfo((object)"[3 ELSE] PrefixUpdateHealthRPC");
					if (healthMax != num5)
					{
						SharedData.LastCallSource = "UpdateHealthRPC";
						HardModePlugin.mls.LogInfo((object)"[3.1 ELSE IF] PrefixUpdateHealthRPC");
						SendHealthRPC(__instance, Mathf.Min(healthNew, num5), num5, effect: true);
						StatsManager.instance.SetPlayerHealth(steamID2, Mathf.Min(healthNew, num5), false);
						healthNew = Mathf.Min(healthNew, num5);
						healthMax = num5;
						HardModePlugin.mls.LogInfo((object)"[3.2 ELSE IF] А ПОСЛЕ SendHealthRPC ВООБЩЕ СРАБАТЫВАЕТ??");
					}
				}
				SharedData.LastCallSource = "UpdateHealthRPC";
				return true;
			}
			finally
			{
				isApplyingPatch = false;
			}
		}

		[HarmonyPatch("Heal")]
		[HarmonyPrefix]
		private static bool PrefixHeal(PlayerHealth __instance, ref int healAmount, ref bool effect)
		{
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			string steamID = GetSteamID(__instance);
			num = StatsManager.instance.GetPlayerMaxHealth(steamID);
			num2 = StatsManager.instance.GetPlayerHealth(steamID);
			num3 = StatsManager.instance.GetPlayerHealth(steamID);
			int num4 = newMaxHealth + num / 2;
			HardModePlugin.mls.LogInfo((object)$"[PrefixHeal] {steamID} - Лечение: {healAmount}, Здоровье из __instance: {__instance.health}/{__instance.maxHealth}, Здоровье из Get: {num3}/{num},");
			if (healAmount == 100)
			{
				SharedData.LastCallSource = "PrefixHeal 30";
				SendHealthRPC(__instance, num3 + 30, num, effect);
				return false;
			}
			if (healAmount == 50)
			{
				SharedData.LastCallSource = "PrefixHeal 15";
				SendHealthRPC(__instance, num3 + 15, num, effect);
				return false;
			}
			if (healAmount == 25)
			{
				SharedData.LastCallSource = "PrefixHeal 7";
				SendHealthRPC(__instance, num3 + 7, num, effect);
				return false;
			}
			if (healAmount == 1)
			{
				SharedData.LastCallSource = "PrefixHeal 1";
				SendHealthRPC(__instance, num3 + 10, num, effect);
				return false;
			}
			SharedData.LastCallSource = "PrefixHeal";
			return true;
		}

		[HarmonyPatch("Hurt")]
		[HarmonyPrefix]
		private static bool PrefixHurt(PlayerHealth __instance, ref int damage, bool savingGrace, int enemyIndex = -1)
		{
			string steamID = GetSteamID(__instance);
			SharedData.LastCallSource = "PrefixHurt";
			HardModePlugin.mls.LogInfo((object)$"[PrefixHurt] {steamID} - Урон: {damage}, savingGrace: {savingGrace}, enemyIndex: {enemyIndex}, Здоровье: {__instance.health}/{__instance.maxHealth}");
			return true;
		}

		[HarmonyPatch("HealOtherRPC")]
		[HarmonyPrefix]
		private static bool PrefixHealOtherRPC(PlayerHealth __instance, ref int healAmount, ref bool effect)
		{
			int num = 0;
			int num2 = 0;
			int num3 = 0;
			string steamID = GetSteamID(__instance);
			num = StatsManager.instance.GetPlayerMaxHealth(steamID);
			num2 = StatsManager.instance.GetPlayerHealth(steamID);
			num3 = StatsManager.instance.GetPlayerHealth(steamID);
			int num4 = newMaxHealth + num / 2;
			HardModePlugin.mls.LogInfo((object)$"[PrefixHealOtherRPC] {steamID} - Лечение: {healAmount}, Здоровье из __instance: {__instance.health}/{__instance.maxHealth}, Здоровье из Get: {num3}/{num},");
			if (healAmount == 100)
			{
				SharedData.LastCallSource = "PrefixHealOtherRPC 30";
				SendHealthRPC(__instance, num3 + 30, num, effect);
				return false;
			}
			if (healAmount == 50)
			{
				SharedData.LastCallSource = "PrefixHealOtherRPC 15";
				SendHealthRPC(__instance, num3 + 15, num, effect);
				return false;
			}
			if (healAmount == 25)
			{
				SharedData.LastCallSource = "PrefixHealOtherRPC 7";
				SendHealthRPC(__instance, num3 + 7, num, effect);
				return false;
			}
			SharedData.LastCallSource = "PrefixHealOtherRPC";
			return true;
		}

		[HarmonyPatch("HealOtherRPC")]
		[HarmonyPostfix]
		private static void PostfixHealOtherRPC(PlayerHealth __instance, int healAmount, bool effect)
		{
			SharedData.LastCallSource = "Postfix";
			HardModePlugin.mls.LogInfo((object)"[Postfix HealOtherRPC] СРАБОТАЛ,");
		}

		[HarmonyPatch("Death")]
		[HarmonyPrefix]
		private static bool PrefixDeath(PlayerHealth __instance)
		{
			string steamID = GetSteamID(__instance);
			SharedData.LastCallSource = "PrefixDeath";
			HardModePlugin.mls.LogInfo((object)$"[PrefixDeath] {steamID}, хп: {__instance.health}/{__instance.maxHealth}");
			return true;
		}

		private static string GetSteamID(PlayerHealth playerHealth)
		{
			if ((Object)(object)playerHealth.playerAvatar == (Object)null)
			{
				return "unknown";
			}
			return SemiFunc.PlayerGetSteamID(playerHealth.playerAvatar);
		}

		private static void SendHealthRPC(PlayerHealth playerHealth, int health, int maxHealth, bool effect)
		{
			if (GameManager.Multiplayer() && (Object)(object)playerHealth.photonView != (Object)null)
			{
				playerHealth.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[3] { health, maxHealth, effect });
			}
		}
	}
	public static class YourCommand
	{
		[CommandInitializer]
		public static void Initialize()
		{
		}

		[CommandExecution("Your Command Name", "Description of what the command does and how to use it.", true, false)]
		[CommandAlias("yourcommand")]
		[CommandAlias("yourcmd")]
		public static void Execute(string args)
		{
		}
	}
	[BepInPlugin("You.YourMod", "YourMod", "1.0.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class YourMod : BaseUnityPlugin
	{
	}
	[BepInPlugin("Teplovozovich.HardMode", "HardMode", "1.0")]
	public class HardMode : BaseUnityPlugin
	{
		internal static HardMode Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			Instance = this;
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Patch();
			Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!");
		}

		internal void Patch()
		{
			//IL_001a: 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_0021: Expected O, but got Unknown
			//IL_0026: Expected O, but got Unknown
			if (Harmony == null)
			{
				Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
		}

		internal void Unpatch()
		{
			Harmony? harmony = Harmony;
			if (harmony != null)
			{
				harmony.UnpatchSelf();
			}
		}

		private void Update()
		{
		}
	}
}