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 DefaultSize; public static ConfigEntry 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("Map", "ZoomSpeed", 1f, new ConfigDescription("Controls the speed that the map is zoomed", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 10f), Array.Empty())); DefaultSize = Plugin.Config.Bind("Map", "DefaultSize", 1f, new ConfigDescription("The starting size of the map", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 10f), Array.Empty())); 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(); } public void Awake() { MapTool = ((Component)this).GetComponent(); if (_activeField == null) { _activeField = Utils.GetField("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(); 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()).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.2.0"; } [BepInPlugin("Ardot.Jettcodey.REPO.MapUpgrade", "Map Upgrade", "1.2.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 MapRequiresUpgrade; public static ConfigEntry MinCost; public static ConfigEntry MaxCost; public static ConfigEntry 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.2.0 loaded successfully."); Logger.LogInfo((object)"Mod originally developed by Ardot66, updated by Jettcodey!"); BundleLoader.LoadBundle(getPath(), (Action)delegate(AssetBundle assetBundle) { string[] array = new string[1] { "Map Upgrade" }; string[] array2 = array; foreach (string text in array2) { try { Item val = assetBundle.LoadAsset(text); if ((Object)(object)val == (Object)null) { Logger.LogError((object)("Failed loading Item asset '" + text + "' from bundle.")); } else { GameObject val2 = assetBundle.LoadAsset(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(); val3.valueMin = MinCost.Value / 4f; val3.valueMax = MaxCost.Value / 4f; val.value = val3; ItemAttributes val4 = val2.GetComponent() ?? val2.AddComponent(); val4.item = val; Upgrader upgrader = val2.GetComponent() ?? val2.AddComponent(); 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)null, (Action)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("Upgrade", "MapRequiresUpgrade", true, "If true, one map upgrade is required before the map can be used"); MinCost = Config.Bind("Upgrade", "MinCost", 7000f, new ConfigDescription("The minimum price of a MapUpgrade in the shop", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 50000f), Array.Empty())); MaxCost = Config.Bind("Upgrade", "MaxCost", 10000f, new ConfigDescription("The maximum price of a MapUpgrade in the shop", (AcceptableValueBase)(object)new AcceptableValueRange(0f, 50000f), Array.Empty())); MapSizeIncrease = Config.Bind("Upgrade", "MapSizeIncrease", 0.5f, new ConfigDescription("The amount that the map increases in size for every map upgrade", (AcceptableValueBase)(object)new AcceptableValueRange(0.1f, 10f), Array.Empty())); } 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(); 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(); _photonView = ((Component)this).GetComponent(); if (!StatsManager.instance.dictionaryOfDictionaries.ContainsKey("playerUpgradeMapUpgrade")) { StatsManager.instance.dictionaryOfDictionaries["playerUpgradeMapUpgrade"] = new Dictionary(); } } public static void UpdateStat(int amount, string steamId, string stat) { if (!StatsManager.instance.dictionaryOfDictionaries.ContainsKey(stat)) { StatsManager.instance.dictionaryOfDictionaries[stat] = new Dictionary(); } Dictionary 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 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(); } Dictionary 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> _fieldCache = new Dictionary>(); public static object Get(this O obj, string field) { return GetField(field).GetValue(obj); } public static T Get(this O obj, string field) { return (T)obj.Get(field); } public static void Set(this T obj, string field, object value) { GetField(field).SetValue(obj, value); } public static FieldInfo GetField(string field) { Type typeFromHandle = typeof(T); if (!_fieldCache.TryGetValue(typeFromHandle, out Dictionary value)) { value = new Dictionary(); _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 action) { Stack stack = new Stack(); 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)); } } } } } }