Decompiled source of Map Upgrade Updated v1.1.0

MapUpgrade.dll

Decompiled 2 days ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using REPOLib;
using REPOLib.Modules;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MapUpgrade")]
[assembly: AssemblyDescription("R.E.P.O. Map Upgrade Mod! Originally developed by Ardot66, updated by Jettcodey.")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Ardot66, Jettcodey")]
[assembly: AssemblyProduct("MapUpgrade")]
[assembly: AssemblyCopyright("")]
[assembly: ComVisible(false)]
[assembly: Guid("0bb70cc2-9b49-4a31-8adc-e4218f4f39b5")]
[assembly: AssemblyFileVersion("1.1.0")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.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 Ardot.Jettcodey.REPO.MapUpgrade
{
	public class MapToolChanges : MonoBehaviour
	{
		public record struct BackgroundObject(Transform Object, Vector3 OriginalScale)
		{
			[CompilerGenerated]
			private readonly bool PrintMembers(StringBuilder builder)
			{
				//IL_0027: 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)
				builder.Append("Object = ");
				builder.Append(Object);
				builder.Append(", OriginalScale = ");
				Vector3 originalScale = OriginalScale;
				builder.Append(((object)(Vector3)(ref originalScale)).ToString());
				return true;
			}
		}

		public static MapToolChanges Instance;

		public static ConfigEntry<float> DefaultSize;

		public static ConfigEntry<float> ZoomRate;

		public MapToolController MapTool;

		public Camera MapCamera;

		public BackgroundObject[] BackgroundObjects = new BackgroundObject[3];

		public const float ZoomScale = 2f;

		public float MaxZoom = 1f;

		public bool MapEnabled = true;

		private static FieldInfo _activeField;

		private float _lastZoom = -1f;

		public static void Init()
		{
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0038: Expected O, but got Unknown
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0074: Expected O, but got Unknown
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b2: Expected O, but got Unknown
			ZoomRate = Plugin.Config.Bind<float>("Map", "ZoomSpeed", 1f, new ConfigDescription("Controls the speed that the map is zoomed", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>()));
			DefaultSize = Plugin.Config.Bind<float>("Map", "DefaultSize", 1f, new ConfigDescription("The starting size of the map", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>()));
			Plugin.Harmony.Patch((MethodBase)AccessTools.Method(typeof(PlayerAvatar), "Awake", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(MapToolChanges), "PlayerAwakePostfix", (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
		}

		public static void PlayerAwakePostfix(PlayerAvatar __instance)
		{
			((Component)__instance.mapToolController).gameObject.AddComponent<MapToolChanges>();
		}

		public void Awake()
		{
			MapTool = ((Component)this).GetComponent<MapToolController>();
			if (_activeField == null)
			{
				_activeField = Utils.GetField<MapToolController>("Active");
			}
			int backgroundObjectIndex = 0;
			Utils.ForObjectsInTree(((Component)Map.Instance).transform.parent, delegate(Transform transform)
			{
				//IL_0072: Unknown result type (might be due to invalid IL or missing references)
				Camera component = ((Component)transform).GetComponent<Camera>();
				if ((Object)(object)component != (Object)null)
				{
					MapCamera = component;
				}
				switch (((Object)transform).name)
				{
				case "Fog":
				case "Scanlines":
				case "Background":
					BackgroundObjects[backgroundObjectIndex] = new BackgroundObject(transform, transform.localScale);
					backgroundObjectIndex++;
					break;
				case "Completed":
					return false;
				}
				return true;
			});
			SetZoom(DefaultSize.Value);
		}

		public void Start()
		{
			if ((Object)(object)PlayerAvatar.instance != (Object)null)
			{
				Plugin.UpdatePlayerMapTool(PlayerAvatar.instance);
			}
		}

		public void Update()
		{
			if (MapEnabled && (bool)_activeField.GetValue(MapTool))
			{
				float axisRaw = Input.GetAxisRaw("Mouse ScrollWheel");
				if (Mathf.Abs(axisRaw) > 0.0001f)
				{
					float zoom = Mathf.Clamp(MapCamera.orthographicSize / 2f - axisRaw * ZoomRate.Value, 0.5f, MaxZoom);
					SetZoom(zoom);
				}
			}
		}

		public void SetMapEnabled(bool enabled)
		{
			((Renderer)MapTool.DisplayMesh).enabled = enabled;
			((Behaviour)((Component)((Component)MapTool.DisplayMesh).transform.parent).GetComponentInChildren<Light>()).enabled = enabled;
			MapEnabled = enabled;
		}

		public void SetMaxZoom(float zoom)
		{
			if (Mathf.Abs(zoom - MaxZoom) > 0.1f)
			{
				SetZoom(zoom);
			}
			MaxZoom = zoom;
		}

		public void SetZoom(float zoom)
		{
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_004e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Unknown result type (might be due to invalid IL or missing references)
			if (!(Mathf.Abs(zoom - _lastZoom) < 0.001f))
			{
				_lastZoom = zoom;
				MapCamera.orthographicSize = zoom * 2f;
				for (int i = 0; i < BackgroundObjects.Length; i++)
				{
					BackgroundObject backgroundObject = BackgroundObjects[i];
					Vector3 originalScale = backgroundObject.OriginalScale;
					backgroundObject.Object.localScale = new Vector3(originalScale.x * zoom, originalScale.y, originalScale.z * zoom);
				}
			}
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "Ardot.Jettcodey.REPO.MapUpgrade";

		public const string PLUGIN_NAME = "Map Upgrade";

		public const string PLUGIN_VERSION = "1.1.0";
	}
	[BepInPlugin("Ardot.Jettcodey.REPO.MapUpgrade", "Map Upgrade", "1.1.0")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : BaseUnityPlugin
	{
		public static ConfigFile Config;

		public static Harmony Harmony;

		internal static ManualLogSource Logger;

		public static ConfigEntry<bool> MapRequiresUpgrade;

		public static ConfigEntry<float> MinCost;

		public static ConfigEntry<float> MaxCost;

		public static ConfigEntry<float> MapSizeIncrease;

		public static string getPath()
		{
			return Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "mapupgrade.file");
		}

		private void Awake()
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Expected O, but got Unknown
			Logger = ((BaseUnityPlugin)this).Logger;
			Config = ((BaseUnityPlugin)this).Config;
			Harmony = new Harmony("Ardot.Jettcodey.REPO.MapUpgrade");
			InitConfig();
			MapToolChanges.Init();
			Logger.LogInfo((object)"Plugin Map Upgrade v1.1.0 loaded successfully.");
			Logger.LogInfo((object)"Mod originally developed by Ardot66, updated by Jettcodey!");
			BundleLoader.LoadBundle(getPath(), (Action<AssetBundle>)delegate(AssetBundle assetBundle)
			{
				string[] array = new string[1] { "Map Upgrade" };
				string[] array2 = array;
				foreach (string text in array2)
				{
					try
					{
						Item val = assetBundle.LoadAsset<Item>(text);
						if ((Object)(object)val == (Object)null)
						{
							Logger.LogError((object)("Failed loading Item asset '" + text + "' from bundle."));
						}
						else
						{
							GameObject val2 = assetBundle.LoadAsset<GameObject>(text);
							if ((Object)(object)val2 == (Object)null)
							{
								Logger.LogError((object)("Failed loading prefab for upgrade '" + text + "'. Make sure the prefab is included in the bundle."));
							}
							else
							{
								string name = (((Object)val2).name = text ?? "");
								((Object)val).name = name;
								val.itemName = text ?? "";
								Value val3 = ScriptableObject.CreateInstance<Value>();
								val3.valueMin = MinCost.Value / 4f;
								val3.valueMax = MaxCost.Value / 4f;
								val.value = val3;
								ItemAttributes val4 = val2.GetComponent<ItemAttributes>() ?? val2.AddComponent<ItemAttributes>();
								val4.item = val;
								Upgrader upgrader = val2.GetComponent<Upgrader>() ?? val2.AddComponent<Upgrader>();
								PrefabRef val5 = Items.RegisterItem(val4);
								if (val5 == null)
								{
									Logger.LogWarning((object)("Items.RegisterItem returned null for '" + text + "'. It may already be registered or there was an error."));
								}
								else
								{
									Logger.LogInfo((object)("Registered upgrade item '" + text + "'."));
								}
								Upgrades.RegisterUpgrade(text, val, (Action<PlayerAvatar, int>)null, (Action<PlayerAvatar, int>)null);
							}
						}
					}
					catch (Exception arg)
					{
						Logger.LogError((object)$"Exception while registering upgrade '{text}': {arg}");
					}
				}
			}, false);
			Config.SettingChanged += OnConfigChanged;
		}

		private void InitConfig()
		{
			//IL_004d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Expected O, but got Unknown
			//IL_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Expected O, but got Unknown
			//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cf: Expected O, but got Unknown
			MapRequiresUpgrade = Config.Bind<bool>("Upgrade", "MapRequiresUpgrade", true, "If true, one map upgrade is required before the map can be used");
			MinCost = Config.Bind<float>("Upgrade", "MinCost", 7000f, new ConfigDescription("The minimum price of a MapUpgrade in the shop", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 50000f), Array.Empty<object>()));
			MaxCost = Config.Bind<float>("Upgrade", "MaxCost", 10000f, new ConfigDescription("The maximum price of a MapUpgrade in the shop", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 50000f), Array.Empty<object>()));
			MapSizeIncrease = Config.Bind<float>("Upgrade", "MapSizeIncrease", 0.5f, new ConfigDescription("The amount that the map increases in size for every map upgrade", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.1f, 10f), Array.Empty<object>()));
		}

		private void OnConfigChanged(object sender, SettingChangedEventArgs e)
		{
			if ((e.ChangedSetting == MapSizeIncrease || e.ChangedSetting == MapRequiresUpgrade) && (Object)(object)PlayerAvatar.instance != (Object)null)
			{
				Update_MapUpgrade();
			}
		}

		public static void Update_MapUpgrade()
		{
			if (LevelGenerator.Instance.Generated && !SemiFunc.MenuLevel() && (Object)(object)PlayerAvatar.instance != (Object)null)
			{
				UpdateAllPlayersMapTool();
			}
		}

		public static void UpdateAllPlayersMapTool()
		{
			if (!((Object)(object)GameDirector.instance == (Object)null) && GameDirector.instance.PlayerList != null)
			{
				for (int i = 0; i < GameDirector.instance.PlayerList.Count; i++)
				{
					PlayerAvatar player = GameDirector.instance.PlayerList[i];
					UpdatePlayerMapTool(player);
				}
			}
		}

		public static void UpdatePlayerMapTool(PlayerAvatar player)
		{
			if ((Object)(object)player == (Object)null || (Object)(object)player.mapToolController == (Object)null)
			{
				return;
			}
			MapToolChanges component = ((Component)player.mapToolController).GetComponent<MapToolChanges>();
			if (!((Object)(object)component == (Object)null))
			{
				int stat = Upgrader.GetStat(player.steamID, "playerUpgradeMapUpgrade");
				int num = stat;
				if (!MapRequiresUpgrade.Value && num == 0)
				{
					num = 1;
				}
				component.SetMapEnabled(num > 0);
				component.SetMaxZoom(MapToolChanges.DefaultSize.Value + (float)(num - 1) * MapSizeIncrease.Value);
			}
		}
	}
	public class Upgrader : MonoBehaviourPunCallbacks
	{
		public ItemToggle _itemToggle;

		private PhotonView _photonView;

		private void Start()
		{
			_itemToggle = ((Component)this).GetComponent<ItemToggle>();
			_photonView = ((Component)this).GetComponent<PhotonView>();
			if (!StatsManager.instance.dictionaryOfDictionaries.ContainsKey("playerUpgradeMapUpgrade"))
			{
				StatsManager.instance.dictionaryOfDictionaries["playerUpgradeMapUpgrade"] = new Dictionary<string, int>();
			}
		}

		public static void UpdateStat(int amount, string steamId, string stat)
		{
			if (!StatsManager.instance.dictionaryOfDictionaries.ContainsKey(stat))
			{
				StatsManager.instance.dictionaryOfDictionaries[stat] = new Dictionary<string, int>();
			}
			Dictionary<string, int> dictionary = StatsManager.instance.dictionaryOfDictionaries[stat];
			if (!dictionary.ContainsKey(steamId))
			{
				dictionary[steamId] = 0;
			}
			dictionary[steamId] += amount;
			Plugin.Update_MapUpgrade();
		}

		public static int GetStat(string steamId, string upgradeName)
		{
			if (!StatsManager.instance.dictionaryOfDictionaries.ContainsKey(upgradeName))
			{
				return 0;
			}
			Dictionary<string, int> dictionary = StatsManager.instance.dictionaryOfDictionaries[upgradeName];
			int value;
			return dictionary.TryGetValue(steamId, out value) ? value : 0;
		}

		public void UpgradeMapUpgrade()
		{
			PlayerAvatar val = SemiFunc.PlayerAvatarGetFromPhotonID(_itemToggle.playerTogglePhotonID);
			if (!((Object)(object)val == (Object)null))
			{
				string text = SemiFunc.PlayerGetSteamID(val);
				Plugin.Logger.LogInfo((object)string.Format("Your Map Upgrade level before: {0}", GetStat(text, "playerUpgradeMapUpgrade")));
				UpdateStat(1, text, "playerUpgradeMapUpgrade");
				if (SemiFunc.IsMultiplayer() && Utils.IsHost() && (Object)(object)_photonView != (Object)null)
				{
					_photonView.RPC("SyncUpgradeRPC", (RpcTarget)1, new object[2] { text, 1 });
				}
				Plugin.Logger.LogInfo((object)string.Format("Your Map Upgrade level after: {0}", GetStat(text, "playerUpgradeMapUpgrade")));
			}
		}

		[PunRPC]
		private void SyncUpgradeRPC(string steamId, int amount)
		{
			if (!StatsManager.instance.dictionaryOfDictionaries.ContainsKey("playerUpgradeMapUpgrade"))
			{
				StatsManager.instance.dictionaryOfDictionaries["playerUpgradeMapUpgrade"] = new Dictionary<string, int>();
			}
			Dictionary<string, int> dictionary = StatsManager.instance.dictionaryOfDictionaries["playerUpgradeMapUpgrade"];
			if (!dictionary.ContainsKey(steamId))
			{
				dictionary[steamId] = 0;
			}
			dictionary[steamId] += amount;
			Plugin.Update_MapUpgrade();
		}
	}
	public static class Utils
	{
		private static readonly Dictionary<Type, Dictionary<string, FieldInfo>> _fieldCache = new Dictionary<Type, Dictionary<string, FieldInfo>>();

		public static object Get<O>(this O obj, string field)
		{
			return GetField<O>(field).GetValue(obj);
		}

		public static T Get<T, O>(this O obj, string field)
		{
			return (T)obj.Get(field);
		}

		public static void Set<T>(this T obj, string field, object value)
		{
			GetField<T>(field).SetValue(obj, value);
		}

		public static FieldInfo GetField<T>(string field)
		{
			Type typeFromHandle = typeof(T);
			if (!_fieldCache.TryGetValue(typeFromHandle, out Dictionary<string, FieldInfo> value))
			{
				value = new Dictionary<string, FieldInfo>();
				_fieldCache[typeFromHandle] = value;
			}
			if (!value.TryGetValue(field, out var value2))
			{
				value2 = (value[field] = AccessTools.Field(typeFromHandle, field));
			}
			return value2;
		}

		public static bool IsHost()
		{
			return SemiFunc.IsMasterClientOrSingleplayer();
		}

		public static void ForObjectsInTree(Transform root, Predicate<Transform> action)
		{
			Stack<Transform> stack = new Stack<Transform>();
			stack.Push(root);
			while (stack.Count > 0)
			{
				Transform val = stack.Pop();
				if (action(val))
				{
					for (int num = val.childCount - 1; num >= 0; num--)
					{
						stack.Push(val.GetChild(num));
					}
				}
			}
		}
	}
}