Decompiled source of MapStation v0.17.1
MapStation.API.dll
Decompiled 3 months agousing System; using System.Collections.ObjectModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Microsoft.CodeAnalysis; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")] [assembly: AssemblyCompany("MapStation.API")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+2a9f5e71dc280b5c7d4e74f2e1ad0f6a1ac841a2")] [assembly: AssemblyProduct("MapStation.API")] [assembly: AssemblyTitle("MapStation.API")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MapStation.API { public static class APIManager { public static IMapStationAPI API; public static bool Initialized; public static event Action OnInitialized; public static void Initialize(IMapStationAPI api) { API = api; Initialized = true; APIManager.OnInitialized?.Invoke(); } } public interface ICustomStage { string DisplayName { get; } string InternalName { get; } string AuthorName { get; } int StageID { get; } } public interface IMapStationAPI { ReadOnlyCollection<ICustomStage> CustomStages { get; } ICustomStage GetCustomStageByID(int stageID); int GetStageID(string stageInternalName); } }
MapStation.Common.dll
Decompiled 3 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx.Logging; using MapStation.Common.Runtime; using MapStation.Common.Serialization; using Microsoft.CodeAnalysis; using Microsoft.Win32; using Reptile; using UnityEngine; using UnityEngine.Audio; using UnityEngine.Playables; using UnityEngine.Rendering.PostProcessing; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("MapStation.Common")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+2a9f5e71dc280b5c7d4e74f2e1ad0f6a1ac841a2")] [assembly: AssemblyProduct("MapStation.Common")] [assembly: AssemblyTitle("MapStation.Common")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } [AttributeUsage(AttributeTargets.Field, Inherited = true)] public class UidAttribute : PropertyAttribute { } namespace cspotcode.UnityGUI { public static class GUIUtil { private class EndScrollViewDisposable : IDisposable { public void Dispose() { GUILayout.EndScrollView(); } } private class EndVerticalDisposable : IDisposable { public void Dispose() { GUILayout.EndVertical(); } } private class EndHorizontalDisposable : IDisposable { public void Dispose() { GUILayout.EndHorizontal(); } } private class EndDisabledDisposable : IDisposable { private readonly bool stateBefore; internal EndDisabledDisposable(bool stateBefore) { this.stateBefore = stateBefore; } public void Dispose() { GUI.enabled = stateBefore; } } private class IndentDisposable : IDisposable { private readonly int increment; internal IndentDisposable(int increment) { this.increment = increment; } public void Dispose() { indentLevel -= increment; } } private class ApplyIndentDisposable : IDisposable { public void Dispose() { GUILayout.EndVertical(); GUILayout.EndHorizontal(); } } public const char UpTriangle = '▲'; public const char DownTriangle = '▼'; public const char RightTriangle = '▶'; public static readonly IDisposable EndScrollView = new EndScrollViewDisposable(); public static readonly IDisposable EndHorizontal = new EndHorizontalDisposable(); private const int PixelsPerIndentLevel = 15; public static readonly IDisposable EndApplyIndent = new ApplyIndentDisposable(); public static int indentLevel { get; set; } public static IDisposable ScrollView(ref Vector2 position) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) ScrollViewScope val = new ScrollViewScope(position, Array.Empty<GUILayoutOption>()); position = val.scrollPosition; return (IDisposable)val; } public static IDisposable Horizontal() { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); return EndHorizontal; } public static IDisposable Disabled(bool disabled = true) { EndDisabledDisposable result = new EndDisabledDisposable(GUI.enabled); GUI.enabled = !disabled; return result; } public static IDisposable Indent(int increment = 1, bool apply = false) { indentLevel += increment; IndentDisposable indentDisposable = new IndentDisposable(increment); if (apply) { IDisposable disposable = ApplyIndent(); return new CompositeDisposable(disposable, indentDisposable); } return indentDisposable; } public static IDisposable ApplyIndent() { GUILayout.BeginHorizontal(Array.Empty<GUILayoutOption>()); GUILayout.Label("", (GUILayoutOption[])(object)new GUILayoutOption[2] { GUILayout.Width((float)(15 * indentLevel)), GUILayout.ExpandWidth(false) }); GUILayout.BeginVertical((GUILayoutOption[])(object)new GUILayoutOption[1] { GUILayout.ExpandWidth(false) }); return EndApplyIndent; } } public static class Extensions { } public class CompositeDisposable : IDisposable { private readonly IDisposable[] disposables; public CompositeDisposable(params IDisposable[] disposables) { this.disposables = disposables; } public void Dispose() { IDisposable[] array = disposables; for (int i = 0; i < array.Length; i++) { array[i].Dispose(); } } } } namespace MapStation.Common { public abstract class AGameMapStationPlugin { public virtual void OnAddMapToDatabase(ZipArchive archive, string path, string mapName) { } public virtual void OnReload() { } } public class NoOpDynamicPickup : MonoBehaviour { private void Awake() { Object.Destroy((Object)(object)((Component)this).gameObject); } } public class PathConstants { public const string MapFileExtension = ".brcmap"; public const string ConfigDirectory = "MapStation"; public const string TestMapsDirectory = "TestMaps"; public static string AbsoluteTestMapsDirectoryFromBepInExProfile(string BepInExProfileDirectory) { return Path.Combine(BepInExProfileDirectory, "Config", "MapStation", "TestMaps"); } } public class AssetNames { public const string MapDirectory = "Maps"; public const string SceneBasenamePrefix = "Scene."; public const string PropertiesBasename = "Properties"; public const string BundlePrefix = "maps/"; public const string SceneBundleBasename = "scene"; public const string SceneBundleSuffix = "/scene"; public const string AssetsBundleBasename = "assets"; public const string AssetsBundleSuffix = "/assets"; public const string BundleVariant = ""; public static string GetMiniMapPathForMap(string name) { return "Assets/Maps/" + name + "/MiniMap.prefab"; } public static string GetAssetDirectoryForMap(string name) { return "Assets/Maps/" + name; } public static string GetScenePathForMap(string name) { return "Assets/Maps/" + name + "/Scene." + name + ".unity"; } public static string GetPropertiesPathForMap(string name) { return "Assets/Maps/" + name + "/Properties.asset"; } public static string GetReadmePathForMap(string name) { return "Assets/Maps/" + name + "/README.md"; } public static string GetIconPathForMap(string name) { return "Assets/Maps/" + name + "/icon.png"; } public static string GetChangelogPathForMap(string name) { return "Assets/Maps/" + name + "/CHANGELOG.md"; } public static string GetSceneBundleNameForMap(string name) { return "maps/" + name.ToLower() + "/scene"; } public static string GetAssetBundleNameForMap(string name) { return "maps/" + name.ToLower() + "/assets"; } } public static class EnumeratePairsExtensions { public static IEnumerable<KeyValuePair<int, T>> Pairs<T>(this T[] array) { for (int i = 0; i < array.Length; i++) { yield return new KeyValuePair<int, T>(i, array[i]); } } public static IEnumerable<KeyValuePair<int, T>> Pairs<T>(this List<T> list) { for (int i = 0; i < list.Count; i++) { yield return new KeyValuePair<int, T>(i, list[i]); } } } public static class DeconstructPairsExtensions { public static void Deconstruct<T, U>(this KeyValuePair<T, U> pair, out T key, out U value) { key = pair.Key; value = pair.Value; } } public static class EnumeratorExtensions { public static T TakeNext<T>(this IEnumerator<T> enumerator) { enumerator.MoveNext(); return enumerator.Current; } } public static class Log { public static ManualLogSource Logger; public static void Info(string message) { Logger.LogInfo((object)message); } public static void Error(string message) { Logger.LogError((object)message); } public static void Warning(string message) { Logger.LogWarning((object)message); } public static void Debug(string message) { Logger.LogDebug((object)message); } } public class BaseMapDatabaseEntry { public string Name; public string ScenePath; public string SceneBundleName => AssetNames.GetSceneBundleNameForMap(Name); public string AssetsBundleName => AssetNames.GetAssetBundleNameForMap(Name); } [Serializable] public class MapProperties { public int format = 1; public string internalName; public string version = "0.0.0"; public string displayName = ""; public string authorName = ""; public bool showInFastTravelMenus = true; public bool disableCops; [Tooltip("Override the shadow distance for your map. Can be used to avoid shadows fading out too close.")] public bool overrideShadowDistance = true; [Range(0f, 500f)] public float shadowDistance = 150f; } public class MapZip : IDisposable { public const string propertiesFilename = "properties.json"; public const string sceneBundleFilename = "scene"; public const string assetsBundleFilename = "assets"; private string path; private ZipArchive zip; public MapZip(string path) { this.path = path; } public ZipArchive WriteZip(string propertiesContents, string sceneBundlePath, string assetsBundlePath, bool compressed = true) { CompressionLevel compressionLevel = ((!compressed) ? CompressionLevel.NoCompression : CompressionLevel.Optimal); zip = ZipFile.Open(path, ZipArchiveMode.Create); zip.CreateEntryFromFile(sceneBundlePath, "scene", compressionLevel); zip.CreateEntryFromFile(assetsBundlePath, "assets", compressionLevel); using (Stream stream = zip.CreateEntry("properties.json", compressionLevel).Open()) { using StreamWriter streamWriter = new StreamWriter(stream); streamWriter.Write(propertiesContents); } return zip; } private void openForReading() { if (zip == null) { zip = ZipFile.Open(path, ZipArchiveMode.Read); } } public void DoPluginOnAddMapToDatabase(string mapName) { openForReading(); GamePluginManager.OnAddMapToDatabase(zip, path, mapName); } public string GetPropertiesText() { openForReading(); using Stream stream = zip.GetEntry("properties.json").Open(); using StreamReader streamReader = new StreamReader(stream); return streamReader.ReadToEnd(); } public Stream GetSceneBundleStream() { openForReading(); return zip.GetEntry("scene").Open(); } public Stream GetAssetsBundleStream() { openForReading(); return zip.GetEntry("assets").Open(); } public void Dispose() { zip?.Dispose(); } } public class MiniMapProperties : MonoBehaviour { [Header("Material that will change colors in phone and pause menu.")] public Material MapMaterial; } public class PathDetection { public const string RegistryKey = "HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation"; public const string RegistryValueBepInExProfile = "BepInExProfile"; public const string RegistryValueBRCPath = "BRCPath"; public const string RegistryValueUnityEditorDataDir = "UnityEditorDataDir"; public static string GetBepInExProfileInRegistry() { return Registry.GetValue("HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation", "BepInExProfile", "") as string; } public static void SetBepInExProfileInRegistry(string path) { Registry.SetValue("HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation", "BepInExProfile", path); } public static string GetBRCPathInRegistry() { return Registry.GetValue("HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation", "BRCPath", "") as string; } public static void SetBRCPathInRegistry(string path) { Registry.SetValue("HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation", "BRCPath", path); } public static string GetUnityEditorDataDirInRegistry() { return Registry.GetValue("HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation", "UnityEditorDataDir", "") as string; } public static void SetUnityEditorDataDirInRegistry(string path) { Registry.SetValue("HKEY_CURRENT_USER\\Software\\BRCMapStation\\MapStation", "UnityEditorDataDir", path); } } public class StageObject : MonoBehaviour { [Header("Name of the chunk GameObject. Leave this empty to automatically find a chunk.")] [SerializeField] private string chunkName = ""; public void PutInChunk() { //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)((Component)this).GetComponentInParent<StageChunk>(true) != (Object)null) { return; } StageObject componentInParent = ((Component)this).GetComponentInParent<StageObject>(true); if ((Object)(object)componentInParent != (Object)(object)this && (Object)(object)componentInParent != (Object)null) { componentInParent.PutInChunk(); return; } StageChunk[] array = Object.FindObjectsOfType<StageChunk>(true); StageChunk val = null; float num = 0f; StageChunk[] array2 = array; foreach (StageChunk val2 in array2) { if ((Object)(object)val2 == (Object)null || ((Object)((Component)val2).gameObject).name.StartsWith("!")) { continue; } if (!string.IsNullOrEmpty(chunkName)) { if (((Object)((Component)val2).gameObject).name == chunkName) { ((Component)this).transform.SetParent(((Component)val2).transform); return; } continue; } BoxCollider[] componentsInChildren = ((Component)val2).GetComponentsInChildren<BoxCollider>(true); bool flag = false; BoxCollider[] array3 = componentsInChildren; foreach (BoxCollider val3 in array3) { if (!((Object)(object)val3 == (Object)null) && StageChunk.PointInOBB(((Component)this).transform.position, val3)) { flag = true; break; } } if (flag) { float num2 = Vector3.Distance(((Component)this).transform.position, ((Component)val2).transform.position); if ((Object)(object)val == (Object)null) { val = val2; num = num2; } else if (num2 < num) { val = val2; num = num2; } } } if ((Object)(object)val != (Object)null) { ((Component)this).transform.SetParent(((Component)val).transform); } } } public static class StagePrefabHijacker { public class StagePrefabs { public GameObject Parent; public List<GameObject> Toilets = new List<GameObject>(); public GameObject GetToilet() { GameObject result = Toilets[0]; Toilets.RemoveAt(0); return result; } } public const Stage StageToHijackPrefabsFrom = 5; public static string[] ProtectedAssetBundles = new string[16] { "characters", "graffiti", "common_assets", "enemies", "enemy_animation", "character_animation", "in_game_assets", "mocap_animation_two", "mocap_animation", "finalboss_assets", "playeranimation", "finalboss_animation", "storyanimation", "minimap", "common_game_shaders", "city_assets" }; public static Stage ActualTargetStage = (Stage)(-1); public static bool Loaded = false; public static bool Active = false; public static StagePrefabs Prefabs; private const int PublicToiletPool = 100; public static void Log(string text) { MapStation.Common.Log.Info("[StagePrefabHijacker] " + text); } private static void CleanUp() { if (Prefabs != null && !((Object)(object)Prefabs.Parent == (Object)null)) { Object.Destroy((Object)(object)Prefabs.Parent); } } public static void RunOnHijackStage() { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0079: 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) CleanUp(); Prefabs = new StagePrefabs(); Prefabs.Parent = new GameObject("Custom Stage Prefabs"); Object.DontDestroyOnLoad((Object)(object)Prefabs.Parent); Prefabs.Parent.SetActive(false); PublicToilet val = Object.FindObjectOfType<PublicToilet>(); for (int i = 0; i < 100; i++) { GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject); val2.transform.SetParent(Prefabs.Parent.transform, false); val2.transform.SetPositionAndRotation(Vector3.zero, Quaternion.identity); Prefabs.Toilets.Add(val2); } } public static void RunOnCustomStage() { } } public class DebugShapeUtility { public static IEnumerable<Renderer> FindDebugShapes(GameObject root) { return root.GetComponentsInChildren<Renderer>(true).Where(delegate(Renderer r) { Material sharedMaterial = r.sharedMaterial; return ((sharedMaterial != null) ? ((Object)sharedMaterial).name : null) == "Debug"; }); } public static void SetDebugShapesVisibility(GameObject root, bool visible) { foreach (Renderer item in FindDebugShapes(root)) { item.enabled = visible; } } } public class DebugUI : MonoBehaviour { public abstract class DebugMenu { public abstract string Name { get; } public virtual int? Width { get; } public abstract void OnGUI(); } public const int DefaultWidth = 400; private const int Height = 1200; private List<DebugMenu> debugMenus = new List<DebugMenu>(); private bool show = true; private DebugMenu currentDebugMenu; public static DebugUI Instance { get; private set; } public bool UiEnabled { get { return ((Component)this).gameObject.activeSelf; } set { ((Component)this).gameObject.SetActive(value); } } public static void Create(bool enabled) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: 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_002f: Expected O, but got Unknown if (!((Object)(object)Instance != (Object)null)) { GameObject val = new GameObject("MapStation Debug UI"); val.SetActive(enabled); Instance = val.AddComponent<DebugUI>(); Object.DontDestroyOnLoad((Object)val); } } public void RegisterMenu(DebugMenu menu) { debugMenus.Add(menu); } private void OnGUI() { //IL_0051: Unknown result type (might be due to invalid IL or missing references) int num = ((show && currentDebugMenu != null && currentDebugMenu.Width.HasValue) ? currentDebugMenu.Width.Value : 400); GUILayout.BeginArea(new Rect(0f, 0f, (float)num, 1200f)); GUILayout.BeginVertical(GUI.skin.box, Array.Empty<GUILayoutOption>()); GUILayout.BeginVertical(GUI.skin.box, Array.Empty<GUILayoutOption>()); GUILayout.BeginVertical("Debug UI", GUI.skin.box, Array.Empty<GUILayoutOption>()); GUILayout.Space(20f); try { if (GUILayout.Button("Show/Hide", Array.Empty<GUILayoutOption>())) { show = !show; } if (!show) { return; } if (currentDebugMenu != null) { if (GUILayout.Button("Back", Array.Empty<GUILayoutOption>())) { currentDebugMenu = null; } else { currentDebugMenu.OnGUI(); } return; } foreach (DebugMenu debugMenu in debugMenus) { if (GUILayout.Button(debugMenu.Name, Array.Empty<GUILayoutOption>())) { currentDebugMenu = debugMenu; } } } finally { GUILayout.EndVertical(); GUILayout.EndVertical(); GUILayout.EndVertical(); GUILayout.EndArea(); } } } public static class PluginInfo { public const string PLUGIN_GUID = "MapStation.Common"; public const string PLUGIN_NAME = "MapStation.Common"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace MapStation.Common.Serialization { internal class SerializationExample : MonoBehaviour { [Serializable] private class Conversation { public string showIfUnlockableIsUnlocked; } [Serializable] private class Dialog { public string say; public string animation; public bool askYesNo; } private class SList_NpcDialog : SList<Dialog> { } [SerializeReference] private Conversation conversation = new Conversation(); [SerializeReference] private SList_NpcDialog npcDialog_ = new SList_NpcDialog(); private List<Dialog> npcDialogs => npcDialog_.items; private void Awake() { string text = ""; text += string.Format("{0} serialized data:\n", "SerializationExample"); text += string.Format("{0}.{1}={2}\n", "Conversation", "showIfUnlockableIsUnlocked", conversation.showIfUnlockableIsUnlocked); text += string.Format("{0}.Count={1}\n", "npcDialogs", npcDialogs.Count); for (int i = 0; i < npcDialogs.Count; i++) { text += string.Format("{0}[{1}].{2}={3}\n", "npcDialogs", i, "say", npcDialogs[i].say); text += string.Format("{0}[{1}].{2}={3}\n", "npcDialogs", i, "animation", npcDialogs[i].animation); text += string.Format("{0}[{1}].{2}={3}\n", "npcDialogs", i, "askYesNo", npcDialogs[i].askYesNo); } Log.Info(text); } } public class SList { } [Serializable] public class SList<T> : SList, ISerializationCallbackReceiver where T : new() { [HideInInspector] [SerializeReference] private Node linkedList; [SerializeReference] public List<T> items; public void copyToLinkedList() { if (items == null || items.Count == 0) { linkedList = null; return; } if (linkedList == null) { linkedList = new Node(); } Node next = linkedList; int i = 0; for (int count = items.Count; i < count; i++) { next.value = items[i]; if (i < count - 1) { Node node = next; if (node.next == null) { node.next = new Node(); } next = next.next; } else { next.next = null; } } } public void copyToList() { if (items == null) { items = new List<T>(); } else { items.Clear(); } for (Node next = linkedList; next != null; next = next.next) { items.Add((T)next.value); } } private void instantiateNullList() { if (items == null) { items = new List<T>(); } } private void instantiateNullItemsInList() { int i = 0; for (int count = items.Count; i < count; i++) { if (items[i] == null) { items[i] = new T(); } } } public void OnBeforeSerialize() { instantiateNullList(); instantiateNullItemsInList(); copyToLinkedList(); } public void OnAfterDeserialize() { if (!Application.isEditor) { copyToList(); } } } [Serializable] public class Node { [SerializeReference] public object value; [SerializeReference] public Node next; } } namespace MapStation.Common.Gameplay { [AddComponentMenu("")] public class GrindPath_FixComboBreakingProperty : MonoBehaviour { } public class MapStationVert : MonoBehaviour { } } namespace MapStation.Common.Runtime { [RequireComponent(typeof(AudioSource))] public class GameAudio : MonoBehaviour { public enum AudioTypes { Master = 0, Music = 4, SFX = 1, UI = 2, Gameplay = 3, Voices = 5, Ambience = 6 } public AudioTypes AudioType = AudioTypes.Gameplay; private void Awake() { ((Component)this).GetComponent<AudioSource>().outputAudioMixerGroup = Core.Instance.AudioManager.mixerGroups[(int)AudioType]; } } public static class GamePluginManager { private static ManualLogSource LogSource = Logger.CreateLogSource("MapStation Plugin Manager"); private static List<AGameMapStationPlugin> GetPlugins() { List<AGameMapStationPlugin> list = new List<AGameMapStationPlugin>(); Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { try { Type[] types = assembly.GetTypes(); foreach (Type type in types) { try { if (typeof(AGameMapStationPlugin).IsAssignableFrom(type) && !type.IsAbstract) { AGameMapStationPlugin item = Activator.CreateInstance(type) as AGameMapStationPlugin; list.Add(item); } } catch (Exception arg) { LogSource.LogWarning((object)$"Problem loading Type, silently handled.{Environment.NewLine}{arg}"); } } } catch (Exception arg2) { LogSource.LogWarning((object)$"Problem loading Assembly, silently handled.{Environment.NewLine}{arg2}"); } } return list; } public static void OnAddMapToDatabase(ZipArchive archive, string path, string mapName) { foreach (AGameMapStationPlugin plugin in GetPlugins()) { plugin.OnAddMapToDatabase(archive, path, mapName); } } public static void OnReload() { foreach (AGameMapStationPlugin plugin in GetPlugins()) { plugin.OnReload(); } } } [RequireComponent(typeof(Camera))] public class MapStationCameraOverride : MonoBehaviour { public bool AlsoAffectPhoneCamera = true; private PostProcessLayer _layer; public static MapStationCameraOverride Instance { get; private set; } private void Awake() { Instance = this; Camera component = ((Component)this).GetComponent<Camera>(); if ((Object)(object)component != (Object)null) { ((Behaviour)component).enabled = false; } _layer = ((Component)this).GetComponent<PostProcessLayer>(); if ((Object)(object)_layer != (Object)null) { ((Behaviour)_layer).enabled = false; } AudioListener component2 = ((Component)this).GetComponent<AudioListener>(); if ((Object)(object)component2 != (Object)null) { ((Behaviour)component2).enabled = false; } } private void OnDestroy() { Instance = null; } public void ApplyToCamera(Camera camera) { //IL_0067: 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) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_layer != (Object)null) { PostProcessLayer val = ((Component)camera).gameObject.GetComponent<PostProcessLayer>(); if ((Object)(object)val == (Object)null) { val = ((Component)camera).gameObject.AddComponent<PostProcessLayer>(); } val.finalBlitToCameraTarget = _layer.finalBlitToCameraTarget; val.stopNaNPropagation = _layer.stopNaNPropagation; val.volumeTrigger = ((Component)camera).transform; val.volumeLayer = _layer.volumeLayer; val.antialiasingMode = _layer.antialiasingMode; val.fastApproximateAntialiasing = _layer.fastApproximateAntialiasing; val.subpixelMorphologicalAntialiasing = _layer.subpixelMorphologicalAntialiasing; val.temporalAntialiasing = _layer.temporalAntialiasing; FieldInfo field = typeof(PostProcessLayer).GetField("m_Resources", BindingFlags.Instance | BindingFlags.NonPublic); field.SetValue(val, field.GetValue(_layer)); } } } } namespace MapStation.Common.Runtime.Gameplay { public class MapStationPublicToilet : MonoBehaviour { public Transform Exit; public Animator DoorAnimator; public GameObject GreenLight; public GameObject RedLight; private void Awake() { //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) Transform val = ((Component)this).transform.Find("Trigger"); GameObject toilet = StagePrefabHijacker.Prefabs.GetToilet(); PublicToilet component = toilet.GetComponent<PublicToilet>(); Object.Destroy((Object)(object)((Component)((Component)component).transform.Find("OutHouse").Find("Cube.007")).gameObject); Object.Destroy((Object)(object)((Component)((Component)component).transform.Find("OutHouse").Find("Cube.001")).gameObject); Object.Destroy((Object)(object)((Component)((Component)component).transform.Find("Trigger")).gameObject); Object.Destroy((Object)(object)((Component)component.doorAnimator).gameObject); component.exit = Exit; component.doorAnimator = DoorAnimator; component.greenLight = GreenLight; component.redLight = RedLight; foreach (PlayableBinding output in component.sequence.playableAsset.outputs) { PlayableBinding current = output; if (((PlayableBinding)(ref current)).streamName == "Animation Track (3)") { component.sequence.SetGenericBinding(((PlayableBinding)(ref current)).sourceObject, (Object)(object)DoorAnimator); break; } } toilet.transform.SetParent(((Component)this).transform, false); toilet.transform.SetLocalPositionAndRotation(Vector3.zero, Quaternion.identity); ((Component)val).transform.SetParent(toilet.transform, true); } } } namespace MapStation.Common.VanillaAssets { public class DeleteVanillaGameObjectsV1 : MonoBehaviour { public class SList_Deletion : SList<Deletion> { } [Serializable] public class Deletion { public string Path; } private HashSet<GameObject> disabledGameObjects = new HashSet<GameObject>(); [SerializeReference] private SList_Deletion deletions = new SList_Deletion(); public static DeleteVanillaGameObjectsV1 Instance { get; private set; } private List<Deletion> Deletions => deletions.items; private void Awake() { if (!Application.isEditor) { Instance = this; DeleteGameObjects(); } } public void DeleteGameObjects() { foreach (Deletion deletion in Deletions) { GameObject val = GameObject.Find(deletion.Path); if ((Object)(object)val == (Object)null) { Log.Info("DeleteVanillaGameObjectsV1 could not find GameObject to delete at path: " + deletion.Path); } else { HandleDeleteGameObject(val); } } } private void HandleDeleteGameObject(GameObject gameObject) { if ((Object)(object)gameObject.GetComponent<StreetLifeCluster>() != (Object)null) { DisableGameObject(gameObject); } else { Object.Destroy((Object)(object)gameObject); } } private void DisableGameObject(GameObject gameObject) { gameObject.SetActive(false); disabledGameObjects.Add(gameObject); } public bool IsDisabled(GameObject gameObject) { if (disabledGameObjects.Contains(gameObject)) { return true; } return false; } } public class MoveVanillaGameObjectV1 : MonoBehaviour { public string moveThis; public Transform targetLocation; private void Awake() { if (!Application.isEditor) { MoveGameObject(); } } public void MoveGameObject() { //IL_0017: 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) GameObject obj = GameObject.Find(moveThis); obj.transform.position = targetLocation.position; obj.transform.rotation = targetLocation.rotation; } } public class VanillaAssetReference : MonoBehaviour { public Component component; [TextArea(3, 10)] public List<string> fields = new List<string>(); public const BindingFlags UseTheseBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; private void Awake() { AssignReferences(); } public void AssignReferences() { if ((Object)(object)component == (Object)null) { return; } foreach (string field in fields) { int num = field.IndexOf("="); int num2 = field.IndexOf(":"); string text = field.Substring(0, num); int num3 = -1; int num4 = text.IndexOf("["); if (num4 >= 0) { num3 = int.Parse(text.Substring(num4 + 1, -1)); ((Object)this).name = text.Substring(0, num4); } else { ((Object)this).name = text; } string text2 = field.Substring(num + 1, num2 - num - 1); string text3 = field.Substring(num2 + 1); Object val = Core.Instance.Assets.LoadAssetFromBundle<Object>(text2, text3); if (val == (Object)null) { Log.Info(string.Format("{0}: Restoring reference to vanilla asset failed, asset not found: {1}.{2} = LoadAssetFromBundle(\"{3}\", \"{4}\")", "VanillaAssetReference", ((object)component).GetType().Name, ((Object)this).name, text2, text3)); continue; } Type type = ((object)component).GetType(); MemberInfo memberInfo = type.GetMember(((Object)this).name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy)[0]; string text4 = string.Format("VanillaAssetReference: Assigning {0}.{1} = asset {2}:{3} (asset found={4}, field found={5}, asset type={6})", type.Name, text, text2, text3, val != (Object)null, memberInfo != null, (val != (Object)null) ? ((object)val).GetType().Name : "<not found>"); try { if (num3 >= 0) { object obj = ((memberInfo is PropertyInfo propertyInfo) ? propertyInfo.GetValue(component) : ((FieldInfo)memberInfo).GetValue(component)); obj.GetType().GetProperty("Item").SetValue(obj, val, new object[1] { num3 }); } else if (memberInfo is PropertyInfo propertyInfo2) { propertyInfo2.SetValue(component, val); } else { ((FieldInfo)memberInfo).SetValue(component, val); } } catch (Exception ex) { Log.Info(text4 + "\nFailed with error:\n" + ex.Message + "\n" + ex.StackTrace); } } } } public class VanillaAssetReferenceV2 : MonoBehaviour { public class SList_Components : SList<ComponentEntry> { } [SerializeReference] private SList_Components components = new SList_Components(); public const BindingFlags UseTheseBindingFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy; private List<ComponentEntry> Components => components.items; private void Awake() { AssignReferences(); } public void AssignReferences() { //IL_014a: Unknown result type (might be due to invalid IL or missing references) foreach (ComponentEntry component2 in Components) { Component component = component2.Component; foreach (FieldEntry field in component2.Fields) { Object val = null; Object[] array = null; if (field.SubAssetType == SubAssetType.FbxChild) { array = Core.Instance.Assets.availableBundles[field.BundleName].AssetBundle.LoadAssetWithSubAssets(field.Path); } else { val = Core.Instance.Assets.LoadAssetFromBundle<Object>(field.BundleName, field.Path); } if (val == (Object)null && array == null) { Log.Info(string.Format("{0}: Restoring reference to vanilla asset failed, asset not found: {1}.{2} = LoadAssetFromBundle(\"{3}\", \"{4}\")", "VanillaAssetReferenceV2", ((object)component).GetType().Name, field.Name, field.BundleName, field.Path)); continue; } switch (field.SubAssetType) { case SubAssetType.FbxChild: { Object[] array2 = array; foreach (Object val2 in array2) { if (val2.name == field.SubPath && !(val2 is GameObject) && !(val2 is Component)) { val = val2; break; } } break; } case SubAssetType.MixerGroup: val = (Object)(object)((AudioMixer)val).FindMatchingGroups(field.SubPath)[0]; break; } if (val == (Object)null) { Log.Info(string.Format("{0}: Restoring reference to vanilla asset failed, sub-asset not found: {1}.{2} = LoadAssetFromBundle(\"{3}\", \"{4}\"); SubAssetType={5}; SubPath={6}", "VanillaAssetReferenceV2", ((object)component).GetType().Name, field.Name, field.BundleName, field.Path, field.SubAssetType.ToString(), field.SubPath)); continue; } string message = ""; try { if (component is Animation && field.Name == "AddClip") { AddAnimationClip(val, component, field, out message); continue; } AssignMember(val, component, field, out message); Animation val3 = (Animation)(object)((component is Animation) ? component : null); if ((Object)(object)val3 != (Object)null && field.Name == "clip" && val3.playAutomatically) { ((MonoBehaviour)this).StartCoroutine(PlayAnimationAutomaticallyCoroutine(val3)); } } catch (Exception ex) { Log.Info(message + "\nFailed with error:\n" + ex.Message + "\n" + ex.StackTrace); } } } } private IEnumerator PlayAnimationAutomaticallyCoroutine(Animation animationComponent) { yield return (object)new WaitForEndOfFrame(); animationComponent.Play(); } public static void AssignMember(Object asset, Component component, FieldEntry f, out string message) { Type type = ((object)component).GetType(); MemberInfo memberInfo = type.GetMember(f.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy)[0]; message = string.Format("{0}: Assigning {1}.{2} = asset {3}:{4} (asset found={5}, field found={6}, asset type={7})", "VanillaAssetReferenceV2", type.Name, f.PropertyPath, f.BundleName, f.Path, asset != (Object)null, memberInfo != null, (asset != (Object)null) ? ((object)asset).GetType().Name : "<not found>"); if (f.Index >= 0) { IList list = (IList)((memberInfo is PropertyInfo propertyInfo) ? propertyInfo.GetValue(component) : ((FieldInfo)memberInfo).GetValue(component)); list[f.Index] = asset; if (memberInfo is PropertyInfo) { ((PropertyInfo)memberInfo).SetValue(component, list); } else { ((FieldInfo)memberInfo).SetValue(component, list); } } else if (memberInfo is PropertyInfo propertyInfo2) { Object value = GetComponentFromPrefab(propertyInfo2.PropertyType, asset); propertyInfo2.SetValue(component, value); } else if (memberInfo is FieldInfo fieldInfo) { Object value2 = GetComponentFromPrefab(fieldInfo.FieldType, asset); fieldInfo.SetValue(component, value2); } else { Log.Info($"Unexpected member type: {memberInfo.MemberType}"); } static Object GetComponentFromPrefab(Type FieldOrPropertyType, Object asset) { GameObject val = (GameObject)(object)((asset is GameObject) ? asset : null); if (val != null && FieldOrPropertyType.IsSubclassOf(typeof(Component))) { return (Object)(object)val.GetComponent(FieldOrPropertyType); } return asset; } } public static void AddAnimationClip(Object asset, Component component, FieldEntry f, out string message) { message = "VanillaAssetReferenceV2: Animation.AddClip(asset, " + asset.name + ") where asset is " + f.BundleName + ":" + f.Path + ((f.SubPath != null) ? (":" + f.SubPath) : "") + " (asset type=" + ((asset != (Object)null) ? ((object)asset).GetType().Name : "<not found>") + ")"; ((Animation)((component is Animation) ? component : null)).AddClip((AnimationClip)(object)((asset is AnimationClip) ? asset : null), asset.name); } } [Serializable] public class ComponentEntry { private class SList_FieldEntry : SList<FieldEntry> { } [SerializeField] public Component Component; [SerializeReference] private SList_FieldEntry fields = new SList_FieldEntry(); public List<FieldEntry> Fields => fields.items; } [Serializable] public class FieldEntry { [HideInInspector] [SerializeField] public bool Enabled = true; [HideInInspector] [SerializeField] public bool AutoSync = true; [SerializeField] public string Name; [SerializeField] public int Index = -1; [SerializeField] public string BundleName; [SerializeField] public string Path; [SerializeField] public SubAssetType SubAssetType; [SerializeField] public string SubPath = ""; public string PropertyPath { get { if (Index < 0) { return Name; } return $"{Name}[{Index}]"; } } } public enum SubAssetType { None, MixerGroup, FbxChild } } namespace MapStation.Common.Dependencies { public class AssemblyDependencies { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }
MapStation.Plugin.dll
Decompiled 3 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CommonAPI; using CommonAPI.Phone; using HarmonyLib; using MapStation.API; using MapStation.Common; using MapStation.Common.Dependencies; using MapStation.Common.Doctor; using MapStation.Common.Gameplay; using MapStation.Common.Runtime; using MapStation.Plugin; using MapStation.Plugin.API; using MapStation.Plugin.Dependencies; using MapStation.Plugin.Gameplay; using MapStation.Plugin.Phone; using MapStation.Plugin.Tools; using MapStation.TypeForwarder.Dependencies; using Microsoft.CodeAnalysis; using ProtoBuf; using Reptile; using Reptile.Phone; using Rewired; using TMPro; using Unity.AI.Navigation; using UnityEngine; using UnityEngine.Rendering.PostProcessing; using UnityEngine.SceneManagement; using cspotcode.SlopCrewClient; using cspotcode.SlopCrewClient.SlopCrewAPI; using cspotcode.UnityGUI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("MapStation.Plugin")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("BepInEx Plugin Assembly for MapStation.")] [assembly: AssemblyFileVersion("0.17.1.0")] [assembly: AssemblyInformationalVersion("0.17.1+2a9f5e71dc280b5c7d4e74f2e1ad0f6a1ac841a2")] [assembly: AssemblyProduct("MapStation.Plugin")] [assembly: AssemblyTitle("MapStation.Plugin")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.17.1.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } [HarmonyPatch(typeof(SceneManager))] internal static class SceneManagerPatch { [HarmonyPrefix] [HarmonyPatch("LoadSceneAsync")] [HarmonyPatch(new Type[] { typeof(string), typeof(LoadSceneMode) })] private static void LoadSceneAsync_Prefix(ref string sceneName, LoadSceneMode __1) { if (SceneNameMapper.Instance.Paths.TryGetValue(sceneName, out var value)) { Log.Info("SceneManager.LoadSceneAsync redirected from " + sceneName + " to " + value); sceneName = value; } } [HarmonyPrefix] [HarmonyPatch("UnloadSceneAsync")] [HarmonyPatch(new Type[] { typeof(string) })] private static void UnloadSceneAsync_Prefix(ref string sceneName) { if (SceneNameMapper.Instance.Names.TryGetValue(sceneName, out var value)) { Log.Info("SceneManager.UnloadSceneAsync redirected from " + sceneName + " to " + value); sceneName = value; } } } [HarmonyPatch(typeof(UnityLogSource))] internal class Patch { [HarmonyPrefix] [HarmonyPatch("OnUnityLogMessageReceived")] private static bool OnUnityLogMessageReceived_Prefix(string message, string stackTrace, LogType type) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)type == 2 && message.Contains("does not support negative scale or size")) { return false; } return true; } } namespace MapStation.Common.Doctor { public static class Doctor { public const string AboutMe = "The Doctor will analyze your map and list any problems, offering suggestions to fix them."; private static readonly string[] VendingMachineAnimations = new string[5] { "none", "shake", "emptyShake", "close", "drop" }; public static Analysis Analyze(MapProperties mapProperties) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); return Analyze(((Scene)(ref activeScene)).GetRootGameObjects(), mapProperties); } public static Analysis Analyze(GameObject root, MapProperties mapProperties) { return Analyze((GameObject[])(object)new GameObject[1] { root }, mapProperties); } private static List<T> GetComponentsInChildren<T>(this GameObject[] roots) { List<T> list = new List<T>(); foreach (GameObject val in roots) { list.AddRange(val.GetComponentsInChildren<T>()); } return list; } private static void CheckChunkStuff(Analysis a, GameObject[] roots) { List<MonoBehaviour> list = new List<MonoBehaviour>(); list.AddRange((IEnumerable<MonoBehaviour>)roots.GetComponentsInChildren<Junk>()); list.AddRange((IEnumerable<MonoBehaviour>)roots.GetComponentsInChildren<StreetLifeCluster>()); foreach (MonoBehaviour item in list) { if ((Object)(object)((Component)item).GetComponentInParent<StageChunk>() == (Object)null) { a.Add(Severity.Error, (Object)(object)item, "Component not in Chunk", "This component is not inside of a Stage Chunk. This may crash the game."); } } } private static void CheckStreetLife(Analysis a, GameObject[] roots) { foreach (Pedestrian componentsInChild in roots.GetComponentsInChildren<Pedestrian>()) { if ((Object)(object)((Component)componentsInChild).GetComponentInParent<StreetLifeCluster>(true) == (Object)null) { a.Add(Severity.Warning, (Object)(object)componentsInChild, "Pedestrian not in StreetLifeCluster", "Pedestrian is not in a StreetLifeCluster, may not function properly."); } } } public static Analysis Analyze(GameObject[] roots, MapProperties mapProperties) { Analysis analysis = new Analysis(); if (roots.GetComponentsInChildren<MapStationCameraOverride>().Count > 1) { analysis.Add(Severity.Warning, null, "Multiple Camera Overrides", "There are multiple Camera Overrides. Only one is supported."); } List<PlayerSpawner> componentsInChildren = roots.GetComponentsInChildren<PlayerSpawner>(); bool flag = false; foreach (PlayerSpawner item in componentsInChildren) { if (item.isDefaultSpawnPoint) { flag = true; break; } } if (!flag) { analysis.Add(Severity.Warning, null, "Missing Default Player Spawn Point", "Map is missing a default player spawn point. Player will spawn at 0,0,0."); } CheckChunkStuff(analysis, roots); CheckStreetLife(analysis, roots); List<BasicEnemySpawner> componentsInChildren2 = roots.GetComponentsInChildren<BasicEnemySpawner>(); bool flag2 = false; bool flag3 = false; bool flag4 = false; foreach (BasicEnemySpawner item2 in componentsInChildren2) { if (item2.spawnableEnemies == null) { continue; } GameObject[] spawnableEnemies = item2.spawnableEnemies; for (int i = 0; i < spawnableEnemies.Length; i++) { switch (((Object)spawnableEnemies[i]).name) { case "ShieldCop": case "SniperCop": case "BasicCop": flag2 = true; break; case "CopterCop": flag3 = true; break; case "tankWalker": flag4 = true; break; } } } List<NavMeshSurface> componentsInChildren3 = roots.GetComponentsInChildren<NavMeshSurface>(); bool flag5 = false; bool flag6 = false; bool flag7 = false; foreach (NavMeshSurface item3 in componentsInChildren3) { if (!((Object)(object)item3.navMeshData == (Object)null)) { switch (item3.agentTypeID) { case 0: flag5 = true; break; case -1372625422: flag7 = true; break; case -334000983: flag6 = true; break; } } } if (componentsInChildren2.Count == 0 && !mapProperties.disableCops) { analysis.Add(Severity.Warning, null, "Missing Cop Spawners", "Map has cops enabled, but there are no spawners for them."); } if (flag2 && !flag5) { analysis.Add(Severity.Warning, null, "Missing NavMeshSurface for Cops", "Map has cops but no NavMeshSurface for them. They will not be able to navigate."); } if (flag3 && !flag6) { analysis.Add(Severity.Warning, null, "Missing NavMeshSurface for Cop Helicopters", "Map has helicopters but no NavMeshSurface for them. They will not be able to navigate."); } if (flag4 && !flag7) { analysis.Add(Severity.Warning, null, "Missing NavMeshSurface for Tankwalkers", "Map has tankwalkers but no NavMeshSurface for them. They will not be able to navigate."); } foreach (GraffitiSpot componentsInChild in roots.GetComponentsInChildren<GraffitiSpot>()) { if ((Object)(object)componentsInChild.dynamicRepPickup == (Object)null) { analysis.Add(Severity.Error, (Object)(object)componentsInChild, "Graffiti missing dynamicRepPickup", "Found GraffitiSpot.dynamicRepPickup == null. This will soft-lock when tagged."); } if (((Component)componentsInChild).tag != "GraffitiSpot") { analysis.Add(Severity.Warning, (Object)(object)componentsInChild, "GraffitiSpot has wrong tag", "Found GraffitiSpot not tagged as 'GraffitiSpot'"); } if (((Component)componentsInChild).gameObject.layer != 19) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild, "GraffitiSpot has wrong layer", "Found GraffitiSpot not on the 'TriggerDetectPlayer' layer."); } } List<AProgressable> componentsInChildren4 = roots.GetComponentsInChildren<AProgressable>(); foreach (AProgressable item4 in componentsInChildren4) { if ((!(((Object)((Component)item4).gameObject).name == "DummyNPC") || !(item4 is NPC)) && !Regex.Match(item4.uid, "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$", RegexOptions.None).Success) { analysis.Add(Severity.Warning, (Object)(object)item4, "Bad Uid", "Found " + ((object)item4).GetType().Name + ".uid which is not in expected UID format (all lowercase, numbers and letters a-f, correct length, correct hyphens) UID=" + item4.uid); } } foreach (IGrouping<string, AProgressable> item5 in from p in componentsInChildren4 group p by p.uid) { if (item5.Count() <= 1) { continue; } foreach (AProgressable item6 in item5) { analysis.Add(Severity.Error, (Object)(object)item6, "Duplicate Uid", "Found " + ((object)item6).GetType().Name + ".uid which is identical to one or more other progressables in this map. This may crash the game when the map loads. Ensure all UIDs are unique. UID=" + item6.uid); } } foreach (VendingMachine componentsInChild2 in roots.GetComponentsInChildren<VendingMachine>()) { if (((Component)componentsInChild2).gameObject.layer != 17) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild2, "VendingMachine has wrong layer", "Found VendingMachine that is not on the Enemies layer, this means it cannot be kicked."); } Animation component = ((Component)componentsInChild2).GetComponent<Animation>(); if ((Object)(object)component == (Object)null) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild2, "VendingMachine missing Animation component", "Found VendingMachine without an Animation component."); } string[] vendingMachineAnimations = VendingMachineAnimations; foreach (string text in vendingMachineAnimations) { if ((TrackedReference)(object)component.GetState(text) == (TrackedReference)null) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild2, "VendingMachine missing animations", "Found VendingMachine with Animation component missing animation: " + text + ". This will fail with errors when kicked."); } } } foreach (Teleport componentsInChild3 in roots.GetComponentsInChildren<Teleport>()) { if ((Object)(object)componentsInChild3.teleportTo == (Object)null && !componentsInChild3.automaticallyReturnPlayerToLastSafeLocation) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild3, "Found Teleport missing a `teleportTo` destination."); } BoxCollider componentInChildren = ((Component)componentsInChild3).GetComponentInChildren<BoxCollider>(); if ((Object)(object)componentInChildren == (Object)null) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild3, "Found Teleport without a Box Collider on a child GameObject."); continue; } if (((Component)componentInChildren).tag != "Teleport") { analysis.Add(Severity.Warning, (Object)(object)componentsInChild3, "Found Teleporter's child collider not tagged as 'Teleport'"); } if (((Component)componentInChildren).gameObject.layer != 19) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild3, "Found Teleport's child collider not on the 'TriggerDetectPlayer' layer."); } } List<SunFlareGPU> componentsInChildren5 = roots.GetComponentsInChildren<SunFlareGPU>(); if (componentsInChildren5.Count == 0) { analysis.Add(Severity.Error, null, "Missing Sun", "Map is missing a sun, will crash on startup. Try adding Sun prefab from the right-click menu."); } if (componentsInChildren5.Count > 1) { foreach (SunFlareGPU item7 in componentsInChildren5) { analysis.Add(Severity.Warning, (Object)(object)item7, "Multiple Suns", "Map has multiple suns, lighting will be too bright. Try deleting all but one."); } } foreach (GrindNode componentsInChild4 in roots.GetComponentsInChildren<GrindNode>()) { if ((Object)(object)componentsInChild4.grindLines.Find((GrindLine l) => (Object)(object)l != (Object)null) == (Object)null) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild4, "Unattached Grind Node", "Grind Node is not attached to any grind lines, should probably be deleted."); } } foreach (GrindLine componentsInChild5 in roots.GetComponentsInChildren<GrindLine>()) { if ((Object)(object)componentsInChild5.n0 == (Object)null || (Object)(object)componentsInChild5.n1 == (Object)null) { analysis.Add(Severity.Warning, (Object)(object)componentsInChild5, "Unattached Grind Line", "Grind Line is not attached to two Grind Nodes, should probably be deleted."); } } return analysis; } public static string GetGameObjectPath(GameObject obj) { string text = "/" + ((Object)obj).name; while ((Object)(object)obj.transform.parent != (Object)null) { obj = ((Component)obj.transform.parent).gameObject; text = "/" + ((Object)obj).name + text; } return text; } } public class Analysis { public readonly Dictionary<GameObject, List<Diagnostic>> gameObjects = new Dictionary<GameObject, List<Diagnostic>>(); public readonly List<Diagnostic> diagnostics = new List<Diagnostic>(); public readonly List<Diagnostic> diagnosticsWithoutTarget = new List<Diagnostic>(); public readonly Dictionary<Severity, int> countBySeverity = new Dictionary<Severity, int>(); public Analysis() { foreach (object value in Enum.GetValues(typeof(Severity))) { countBySeverity.Add((Severity)value, 0); } } public void Add(Severity severity, Object target, string message, string details = null) { Diagnostic diagnostic = new Diagnostic(severity, target, message, details); diagnostics.Add(diagnostic); countBySeverity[diagnostic.Severity]++; if ((Object)(object)diagnostic.GameObject != (Object)null) { gameObjects.TryGetValue(diagnostic.GameObject, out var value); if (value == null) { value = new List<Diagnostic>(); gameObjects.Add(diagnostic.GameObject, value); } value.Add(diagnostic); } else { diagnosticsWithoutTarget.Add(diagnostic); } } public void Log() { Debug.Log((object)$"MapStation: Analysis found {diagnostics.Count} problems."); foreach (Diagnostic diagnostic in diagnostics) { string targetPath = diagnostic.TargetPath; string text = ""; if (targetPath != null) { text = " (at " + targetPath + ")"; } Debug.Log((object)(diagnostic.Message + text)); } } } public class Diagnostic { public readonly string Message; public readonly string Details; public readonly Object Target; public readonly Component Component; public readonly GameObject GameObject; public readonly Severity Severity; public string TargetPath; public Diagnostic(Severity severity, Object target, string message, string details = null) { GameObject gameObject = (GameObject)(object)((target is GameObject) ? target : null); Component val = (Component)(object)((target is Component) ? target : null); if ((Object)(object)val != (Object)null) { gameObject = val.gameObject; } Message = message; Details = details; Target = target; GameObject = gameObject; Severity = severity; Component = val; TargetPath = (((Object)(object)GameObject == (Object)null) ? null : Doctor.GetGameObjectPath(GameObject)); } } public enum Severity { Error, Warning } } namespace MapStation.Plugin { public class CrashDetector { [CompilerGenerated] private static class <>O { public static OnStageInitializedDelegate <0>__AfterLoadStage; } private const string PlayerPrefName = "MapStation.CrashDetector.IsLoadingStage"; public static bool ShouldAvoidReCrashing { get; private set; } public static void InitOnGameStart() { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Expected O, but got Unknown ShouldAvoidReCrashing = PlayerPrefs.GetInt("MapStation.CrashDetector.IsLoadingStage") > 0; object obj = <>O.<0>__AfterLoadStage; if (obj == null) { OnStageInitializedDelegate val = AfterLoadStage; <>O.<0>__AfterLoadStage = val; obj = (object)val; } StageManager.OnStagePostInitialization += (OnStageInitializedDelegate)obj; } public static void BeforeLoadStage() { PlayerPrefs.SetInt("MapStation.CrashDetector.IsLoadingStage", 1); } public static void AfterLoadStage() { PlayerPrefs.SetInt("MapStation.CrashDetector.IsLoadingStage", 0); ShouldAvoidReCrashing = false; } } internal class KBMInputDisabler { private static bool KbmDisabled; private static KeyCode ToggleKey; public static void Init(bool kbmDisabled, KeyCode toggleKey, ref Plugin.UpdateDelegate updateEvent, ref Plugin.UpdateDelegate lateUpdateEvent) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) KbmDisabled = kbmDisabled; ToggleKey = toggleKey; updateEvent = (Plugin.UpdateDelegate)Delegate.Combine(updateEvent, new Plugin.UpdateDelegate(Update)); lateUpdateEvent = (Plugin.UpdateDelegate)Delegate.Combine(lateUpdateEvent, new Plugin.UpdateDelegate(LateUpdate)); } private static void Update() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown(ToggleKey)) { KbmDisabled = !KbmDisabled; Apply(); } } private static void LateUpdate() { if (KbmDisabled) { Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; } } private static Player TryGetRewiredPlayer() { Core instance = Core.Instance; if ((Object)(object)instance == (Object)null) { return null; } GameInput gameInput = instance.GameInput; if (gameInput == null) { return null; } RewiredMappingHandler rewiredMappingHandler = gameInput.rewiredMappingHandler; if (rewiredMappingHandler == null) { return null; } return rewiredMappingHandler.GetRewiredPlayer(0); } public static void Apply() { Player val = TryGetRewiredPlayer(); if (val != null) { if (KbmDisabled) { DisableKbm(val); } else { EnableKbm(val); } } } private static void DisableKbm(Player player) { ((Controller)player.controllers.Mouse).enabled = false; ((Controller)player.controllers.Keyboard).enabled = false; Cursor.visible = true; Cursor.lockState = (CursorLockMode)0; } private static void EnableKbm(Player player) { ((Controller)player.controllers.Mouse).enabled = true; ((Controller)player.controllers.Keyboard).enabled = true; Cursor.visible = false; Cursor.lockState = (CursorLockMode)1; } } public enum MapSource { Normal, TestMaps } public class MapDatabase { public static MapDatabase Instance; public Assets Assets; public Dictionary<Stage, PluginMapDatabaseEntry> maps = new Dictionary<Stage, PluginMapDatabaseEntry>(); private ManualLogSource logger; public MapDatabase(Assets assets) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown Assets = assets; logger = new ManualLogSource("MapStation Map Database"); } public void AddFromDirectory(string path, MapSource source = MapSource.Normal) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_007b: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Expected I4, but got Unknown //IL_00d6: 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) string[] files = Directory.GetFiles(path, "*.brcmap", SearchOption.AllDirectories); foreach (string text in files) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text); Stage val = StageEnum.HashMapName(fileNameWithoutExtension); if (maps.ContainsKey(val)) { logger.LogWarning((object)$"Won't add custom stage {fileNameWithoutExtension} to the database as there's already a stage with the same ID ({(int)val})"); continue; } logger.LogInfo((object)("Found map " + fileNameWithoutExtension + " at " + text)); MapProperties val2 = new MapProperties(); MapZip val3 = new MapZip(text); try { JsonUtility.FromJsonOverwrite(val3.GetPropertiesText(), (object)val2); val3.DoPluginOnAddMapToDatabase(fileNameWithoutExtension); } finally { ((IDisposable)val3)?.Dispose(); } PluginMapDatabaseEntry map = new PluginMapDatabaseEntry { Name = fileNameWithoutExtension, internalName = fileNameWithoutExtension, Properties = val2, ScenePath = AssetNames.GetScenePathForMap(fileNameWithoutExtension), zipPath = text, stageId = val, source = source }; Add(map); } } public void Add(PluginMapDatabaseEntry map) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Expected O, but got Unknown maps.Add(map.stageId, map); StageEnum.AddMapName(map.stageId, map.internalName); List<AssetBundleCollection> list = Assets.assetBundleLibrary.collections.ToList(); AssetBundleCollection val = ScriptableObject.CreateInstance<AssetBundleCollection>(); val.assetBundleCollectionName = ((object)(Stage)(ref map.stageId)).ToString(); val.assetBundleNames = new string[18] { "characters", "graffiti", "common_assets", "enemies", "enemy_animation", "character_animation", "in_game_assets", "mocap_animation_two", "mocap_animation", "finalboss_assets", "playeranimation", "finalboss_animation", "storyanimation", "minimap", "common_game_shaders", "city_assets", ((BaseMapDatabaseEntry)map).AssetsBundleName, ((BaseMapDatabaseEntry)map).SceneBundleName }; list.Add(val); Assets.assetBundleLibrary.collections = list.ToArray(); string[] array = new string[2] { ((BaseMapDatabaseEntry)map).AssetsBundleName, ((BaseMapDatabaseEntry)map).SceneBundleName }; foreach (string text in array) { Assets.availableBundles.Add(text, new Bundle(text) { name = text }); } ZipAssetBundles.Instance.Bundles.Add(((BaseMapDatabaseEntry)map).AssetsBundleName, new ZipAssetBundle { zipPath = map.zipPath, bundleType = ZipBundleType.ASSETS }); ZipAssetBundles.Instance.Bundles.Add(((BaseMapDatabaseEntry)map).SceneBundleName, new ZipAssetBundle { zipPath = map.zipPath, bundleType = ZipBundleType.SCENE }); SceneNameMapper.Instance.Names.Add(((object)(Stage)(ref map.stageId)).ToString(), "Scene." + map.internalName); SceneNameMapper.Instance.Paths.Add(((object)(Stage)(ref map.stageId)).ToString(), "Assets/Maps/" + map.internalName + "/Scene." + map.internalName + ".unity"); } } public class PluginMapDatabaseEntry : BaseMapDatabaseEntry { public Stage stageId; public string internalName; public string zipPath; public MapProperties Properties; public MapSource source; } internal class SceneNameMapper { public static SceneNameMapper Instance; public Dictionary<string, string> Names = new Dictionary<string, string>(); public Dictionary<string, string> Paths = new Dictionary<string, string>(); } public static class StageEnum { public const Stage FirstMapId = 15; public const string MapNamePrefix = "mapstation/"; public const int MapNamePrefixLength = 11; public const string MapNameUnknownInfix = "unknown/"; public const Stage FirstVanillaStage = -1; public static readonly Dictionary<string, Stage> MapIds; public static readonly Dictionary<Stage, string> MapNames; static StageEnum() { MapIds = new Dictionary<string, Stage>(); MapNames = new Dictionary<Stage, string>(); if ("mapstation/".Length != 11) { throw new Exception("StageEnumMapNamePrefixLength is wrong."); } } public static string GetMapName(Stage id) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return MapNames[id]; } public static Stage GetMapId(string internalName) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) return MapIds[internalName]; } public static string RemovePrefixFromInternalName(string prefixedInternalName) { int num = prefixedInternalName.IndexOf("/"); if (num < 0) { return prefixedInternalName; } return prefixedInternalName.Substring(num + 1); } public static Stage HashMapName(string internalName) { uint num = BitConverter.ToUInt32(new SHA512Managed().ComputeHash(Encoding.UTF8.GetBytes(internalName)), 0); num &= 0xFFFFFFF0u; num >>= 4; return (Stage)(15 + num); } public static Stage AddMapName(string internalName) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Stage val = HashMapName(internalName); AddMapName(val, internalName); return val; } public static void AddMapName(Stage id, string internalName) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) MapNames.Add(id, internalName); MapIds.Add(internalName, id); } public static void RemoveMapName(string internalName) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) MapNames.Remove(MapIds[internalName]); MapIds.Remove(internalName); } public static bool IsValidMapId(Stage id) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Invalid comparison between Unknown and I4 //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)id < 15) { return (int)id < -1; } return true; } public static bool IsKnownMapId(Stage id) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return MapNames.ContainsKey(id); } } public class StageProgresses : CustomSaveData { public static StageProgresses Instance; public Dictionary<string, StageProgress> stageProgresses = new Dictionary<string, StageProgress>(); private const byte Version = 1; public StageProgresses() : base("MapStation.Plugin", "{0}.msp") { } public override void Write(BinaryWriter writer) { writer.Write((byte)1); writer.Write(stageProgresses.Count); foreach (KeyValuePair<string, StageProgress> stageProgress in stageProgresses) { StageProgress value = stageProgress.Value; string key = stageProgress.Key; writer.Write(key); value.Write(writer); value.WriteVersionTwo(writer); value.WriteVersionThree(writer); } } public override void Read(BinaryReader reader) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) reader.ReadByte(); int num = reader.ReadInt32(); for (int i = 0; i < num; i++) { string text = reader.ReadString(); string internalName = StageEnum.RemovePrefixFromInternalName(text); StageProgress val = new StageProgress(); val.Read(reader); val.ReadVersionTwo(reader); val.ReadVersionThree(reader); val.stageID = StageEnum.HashMapName(internalName); stageProgresses[text] = val; } } public override void Initialize() { stageProgresses.Clear(); } public StageProgress GetOrCreateForStage(Stage stageId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: 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_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Expected O, but got Unknown if (StageEnum.IsValidMapId(stageId)) { string key = ((object)(Stage)(ref stageId)).ToString(); if (stageProgresses.TryGetValue(key, out var value)) { return value; } value = new StageProgress { version = 3, stageID = stageId, policeAllowed = true, mapFound = true, taxiFound = true }; stageProgresses.Add(key, value); return value; } return null; } } public class ZipAssetBundles { public static ZipAssetBundles Instance; public Dictionary<string, ZipAssetBundle> Bundles = new Dictionary<string, ZipAssetBundle>(); } public class ZipAssetBundle { public string zipPath; public ZipBundleType bundleType; } public enum ZipBundleType { ASSETS, SCENE } public static class MapOverrides { public static void OnStagePreInitialization(Stage newStage, Stage previousStage) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) OverrideQualitySettings(newStage, Core.Instance.BaseModule.user.VideoSettingsManager.cachedVideoSettings); } public static void OverrideQualitySettings(Stage stage, VideoSettings videoSettings) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (MapDatabase.Instance.maps.TryGetValue(stage, out var value) && value.Properties.overrideShadowDistance) { QualitySettings.shadowDistance = value.Properties.shadowDistance; } else { QualitySettings.shadowDistance = videoSettings.shadowDistance; } } } public class MapRepair { public static void OnStagePreInitialization(Stage newStage, Stage previousStage) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if (StageEnum.IsKnownMapId(newStage)) { Repair(); } } public static void Repair() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Object.FindObjectOfType<PlayerSpawner>() == (Object)null) { new GameObject().AddComponent<PlayerSpawner>().isDefaultSpawnPoint = true; } CharacterSelectSpot[] array = Object.FindObjectsOfType<CharacterSelectSpot>(); foreach (CharacterSelectSpot val in array) { if ((Object)(object)((Component)val).GetComponentInChildren<NPC>(true) == (Object)null) { GameObject val2 = new GameObject("DummyNPC"); val2.transform.parent = ((Component)val).transform; val2.SetActive(false); val2.AddComponent<NPC>(); } } GameObject val3 = new GameObject("DummyNPC"); val3.SetActive(false); val3.AddComponent<NPC>(); } } public class MapStationConfig { public ConfigEntry<string> QuickLaunch; public ConfigEntry<bool> QuickReload; public ConfigEntry<bool> DisableKBMInput; public ConfigEntry<bool> DebugUI; public ConfigEntry<bool> ShowDebugShapes; public ConfigEntry<KeyCode> QuickReloadKey; public ConfigEntry<KeyCode> DisableKBMInputKey; public static MapStationConfig Instance { get; private set; } public string QuickLaunchValue => QuickLaunch.Value; public bool QuickReloadValue => QuickReload.Value; public bool DisableKBMInputValue => DisableKBMInput.Value; public bool DebugUIValue => DebugUI.Value; public bool ShowDebugShapesValue => ShowDebugShapes.Value; public KeyCode QuickReloadKeyValue => QuickReloadKey.Value; public KeyCode DisableKBMInputKeyValue => DisableKBMInputKey.Value; public MapStationConfig() { Instance = this; } public MapStationConfig(ConfigFile file) : this() { string text = "Mapping"; QuickLaunch = file.Bind<string>(text, "QuickLaunch", "", "Skip game intros and menu and launch directly into this map."); string text2 = "Enable to reload *any* map with a hotkey (F5 by default), including vanilla and downloaded maps. By default, only locally-built maps can be reloaded."; string text3 = "Reloads the map."; QuickReload = file.Bind<bool>(text, "QuickReload", false, text2); string text4 = "Disable keyboard and mouse input, making it easier to use MapStation's DebugUI, Unity Explorer, or tab between windows. When this is enabled, you MUST use a game controller. Note: there is also a hotkey for this."; string text5 = "Enables/disables keyboard and mouse input."; DisableKBMInput = file.Bind<bool>(text, "DisableKBMInput", false, text4); DebugUI = file.Bind<bool>(text, "DebugUI", false, "Show Debug UI in the corner for *all* maps. By default this is enabled only for locally-built maps."); ShowDebugShapes = file.Bind<bool>(text, "ShowDebugShapes", false, "Show debug meshes along grind lines, spawners, teleporters, etc."); string text6 = "Input"; QuickReloadKey = file.Bind<KeyCode>(text6, "QuickReloadKey", (KeyCode)286, text3); DisableKBMInputKey = file.Bind<KeyCode>(text6, "DisableKBMInputKey", (KeyCode)287, text5); } } public static class MiniMapManager { public static bool TryCreateMapForCustomStage(BaseMapDatabaseEntry mapEntry, out Map map) { //IL_0059: 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_0069: Unknown result type (might be due to invalid IL or missing references) GameObject val = Core.Instance.Assets.LoadAssetFromBundle<GameObject>(mapEntry.AssetsBundleName, "MiniMap.prefab"); if ((Object)(object)val == (Object)null) { map = null; return false; } MiniMapProperties val2 = val.GetComponent<MiniMapProperties>(); if ((Object)(object)val2 == (Object)null) { val2 = val.AddComponent<MiniMapProperties>(); } Map val3 = ScriptableObject.CreateInstance<Map>(); val3.m_MapObject = val; val3.m_ScaleFactor = 1f; val3.m_PositionOffset = Vector3.zero; val3.m_EulerOffset = Vector3.zero; val3.mapMaterial = Mapcontroller.Instance.pyramidMap.mapMaterial; map = val3; ProcessCustomMiniMapPrefab(map, val2); if ((Object)(object)val2.MapMaterial != (Object)null) { val3.mapMaterial = val2.MapMaterial; } val3.mapMaterial.SetFloat("_AnchorOffset", -5000f); val3.mapMaterial.SetFloat("_AnchorScale", 0.035f); return true; } private static void ProcessCustomMiniMapPrefab(Map map, MiniMapProperties properties) { Renderer[] componentsInChildren = map.m_MapObject.GetComponentsInChildren<Renderer>(); for (int i = 0; i < componentsInChildren.Length; i++) { ((Component)componentsInChildren[i]).gameObject.layer = 27; } } } [BepInPlugin("MapStation.Plugin", "MapStation.Plugin", "0.17.1")] public class Plugin : BaseUnityPlugin { public delegate void UpdateDelegate(); [CompilerGenerated] private static class <>O { public static StageInitializationDelegate <0>__OnStagePreInitialization; public static StageInitializationDelegate <1>__OnStagePreInitialization; public static UpdateDelegate <2>__QuickReloadUpdate; } public static Plugin Instance; internal string MapStationMapsAbsoluteDirectory; internal string TestMapsAbsoluteDirectory; internal string UserMapsAbsoluteDirectory; private static Type ForceLoadMapStationCommonAssembly = typeof(AssemblyDependencies); private static Type ForceLoadMapStationPluginAssembly = typeof(AssemblyDependencies); private static Type ForceLoadMapStationTypeForwarderAssembly = typeof(AssemblyDependencies); public static UpdateDelegate UpdateEvent; public static UpdateDelegate LateUpdateEvent; public Plugin() { Log.Logger = ((BaseUnityPlugin)this).Logger; } private void Awake() { Instance = this; try { Initialize(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin MapStation.Plugin 0.17.1 is loaded!"); } catch (Exception ex) { ((BaseUnityPlugin)this).Logger.LogError((object)string.Format("Plugin {0} {1} failed to load!{2}{3}", "MapStation.Plugin", "0.17.1", Environment.NewLine, ex)); } } private void Initialize() { //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Expected O, but got Unknown //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Expected O, but got Unknown //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Expected O, but got Unknown //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Expected O, but got Unknown //IL_018b: 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_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014d: Expected O, but got Unknown new MapStationConfig(((BaseUnityPlugin)this).Config); SceneNameMapper.Instance = new SceneNameMapper(); ZipAssetBundles.Instance = new ZipAssetBundles(); StageProgresses.Instance = new StageProgresses(); DebugUI.Create(MapStationConfig.Instance.DebugUI.Value); DebugUI.Instance.RegisterMenu((DebugMenu)(object)new BackToHideoutDebugUI()); DebugUI.Instance.RegisterMenu((DebugMenu)(object)new DoctorDebugUI()); DebugUI.Instance.RegisterMenu((DebugMenu)(object)new HiddenShapesDebugUI()); MapStationMapsAbsoluteDirectory = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); TestMapsAbsoluteDirectory = Path.Combine(Paths.ConfigPath, "MapStation", "TestMaps"); UserMapsAbsoluteDirectory = Paths.PluginPath; ThreadedLogFix.Install(); Sprite val = TextureUtility.LoadSprite(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "MapStation-AppIcon.png")); PhoneAPI.RegisterApp<AppMapStation>("mapstation", val); new Harmony("MapStation.Plugin").PatchAll(); PathDetection.SetBepInExProfileInRegistry(Paths.BepInExRootPath); PathDetection.SetBRCPathInRegistry(Path.GetDirectoryName(Application.dataPath)); StageInitializationDelegate onStagePreInitialization = StageAPI.OnStagePreInitialization; object obj = <>O.<0>__OnStagePreInitialization; if (obj == null) { StageInitializationDelegate val2 = MapRepair.OnStagePreInitialization; <>O.<0>__OnStagePreInitialization = val2; obj = (object)val2; } StageAPI.OnStagePreInitialization = (StageInitializationDelegate)Delegate.Combine((Delegate?)(object)onStagePreInitialization, (Delegate?)obj); StageInitializationDelegate onStagePreInitialization2 = StageAPI.OnStagePreInitialization; object obj2 = <>O.<1>__OnStagePreInitialization; if (obj2 == null) { StageInitializationDelegate val3 = MapOverrides.OnStagePreInitialization; <>O.<1>__OnStagePreInitialization = val3; obj2 = (object)val3; } StageAPI.OnStagePreInitialization = (StageInitializationDelegate)Delegate.Combine((Delegate?)(object)onStagePreInitialization2, (Delegate?)obj2); StageAPI.OnStagePreInitialization = (StageInitializationDelegate)Delegate.Combine((Delegate?)(object)StageAPI.OnStagePreInitialization, (Delegate?)new StageInitializationDelegate(EnableDebugFeaturesOnStageInit)); KBMInputDisabler.Init(MapStationConfig.Instance.DisableKBMInputValue, MapStationConfig.Instance.DisableKBMInputKeyValue, ref UpdateEvent, ref LateUpdateEvent); CrashDetector.InitOnGameStart(); HiddenShapes.Visible = MapStationConfig.Instance.ShowDebugShapesValue; } public void InitializeMapDatabase(Assets assets) { MapDatabase.Instance = new MapDatabase(assets); if (!Directory.Exists(TestMapsAbsoluteDirectory)) { Directory.CreateDirectory(TestMapsAbsoluteDirectory); } MapDatabase.Instance.AddFromDirectory(MapStationMapsAbsoluteDirectory); MapDatabase.Instance.AddFromDirectory(TestMapsAbsoluteDirectory, MapSource.TestMaps); MapDatabase.Instance.AddFromDirectory(UserMapsAbsoluteDirectory); APIManager.Initialize((IMapStationAPI)(object)new MapStationAPI(MapDatabase.Instance)); } private void Update() { UpdateEvent?.Invoke(); } private void LateUpdate() { LateUpdateEvent?.Invoke(); } private static IEnumerator BackToHideout() { yield return null; Core.Instance.BaseModule.SwitchStage((Stage)5); } public static bool CanSwitchStagesWithoutCrashing() { if ((Object)(object)Core.Instance != (Object)null && Core.Instance.BaseModule.IsPlayingInStage && !Core.Instance.BaseModule.IsLoading) { return !Core.Instance.BaseModule.IsInGamePaused; } return false; } private static void QuickReloadUpdate() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (CanSwitchStagesWithoutCrashing() && Input.GetKeyDown(MapStationConfig.Instance.QuickReloadKeyValue)) { GamePluginManager.OnReload(); Core.Instance.BaseModule.StageManager.ExitCurrentStage(Core.Instance.SaveManager.CurrentSaveSlot.currentStageProgress.stageID, (Stage)(-1)); } } private void EnableDebugFeaturesOnStageInit(Stage newStage, Stage previousStage) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) PluginMapDatabaseEntry value; bool flag = MapDatabase.Instance.maps.TryGetValue(newStage, out value) && value.source == MapSource.TestMaps; DebugUI.Instance.UiEnabled = MapStationConfig.Instance.DebugUIValue || flag; UpdateEvent = (UpdateDelegate)Delegate.Remove(UpdateEvent, new UpdateDelegate(QuickReloadUpdate)); if (MapStationConfig.Instance.QuickReloadValue || flag) { UpdateEvent = (UpdateDelegate)Delegate.Combine(UpdateEvent, new UpdateDelegate(QuickReloadUpdate)); } } } internal class ThreadedLogFix { private delegate void UnityLogSource_OnUnityLogMessageReceived(string message, string stackTrace, LogType type); [CompilerGenerated] private static class <>O { public static LogCallback <0>__onLogMessageReceivedThreaded; } private static int MainThreadId; private static UnityLogSource_OnUnityLogMessageReceived UnityLogSource_OnUnityLogMessageReceived_Handler; public static void Install() { //IL_004e: 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_0059: Expected O, but got Unknown MainThreadId = Thread.CurrentThread.ManagedThreadId; UnityLogSource_OnUnityLogMessageReceived_Handler = (UnityLogSource_OnUnityLogMessageReceived)typeof(UnityLogSource).GetMethod("OnUnityLogMessageReceived", BindingFlags.Static | BindingFlags.NonPublic).CreateDelegate(typeof(UnityLogSource_OnUnityLogMessageReceived)); object obj = <>O.<0>__onLogMessageReceivedThreaded; if (obj == null) { LogCallback val = onLogMessageReceivedThreaded; <>O.<0>__onLogMessageReceivedThreaded = val; obj = (object)val; } Application.logMessageReceivedThreaded += (LogCallback)obj; } private static void onLogMessageReceivedThreaded(string condition, string stackTrace, LogType type) { //IL_0018: Unknown result type (might be due to invalid IL or missing references) if (Thread.CurrentThread.ManagedThreadId != MainThreadId) { UnityLogSource_OnUnityLogMessageReceived_Handler(condition, stackTrace, type); } } } public static class PluginInfo { public const string PLUGIN_GUID = "MapStation.Plugin"; public const string PLUGIN_NAME = "MapStation.Plugin"; public const string PLUGIN_VERSION = "0.17.1"; } } namespace MapStation.Plugin.Tools { internal class BackToHideoutDebugUI : DebugMenu { public override string Name => "Hideout Escape"; public override void OnGUI() { if (Plugin.CanSwitchStagesWithoutCrashing()) { GUILayout.Label("This button takes you back to the hideout, if you get trapped in a custom map.", Array.Empty<GUILayoutOption>()); if (GUILayout.Button("Go to Hideout", Array.Empty<GUILayoutOption>())) { Core.Instance.BaseModule.SwitchStage((Stage)5); } } } } public class DoctorDebugUI : DebugMenu { private int widthIndex; private int[] widths = new int[3] { 400, 700, 1000 }; private Analysis analysis; private bool[] showDiag; private bool[] showGo; private Vector2 scrollPosition = Vector2.zero; private bool HasUnityExplorer; private Assembly unityExplorerAssembly; private Type unityExplorerInspectorManagerType; private Type unityExplorerUIManagerType; private Type unityExplorerCacheObjectBase; public override string Name => "Map Doctor"; public override int? Width => widths[widthIndex]; public DoctorDebugUI() { //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: 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_003e: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Expected O, but got Unknown StageAPI.OnStagePreInitialization = (StageInitializationDelegate)Delegate.Combine((Delegate?)(object)StageAPI.OnStagePreInitialization, (Delegate?)new StageInitializationDelegate(OnStagePreInitialization)); HasUnityExplorer = false; unityExplorerAssembly = AppDomain.CurrentDomain.GetAssemblies().SingleOrDefault((Assembly assembly) => assembly.GetName().Name == "UnityExplorer.BIE5.Mono"); if (unityExplorerAssembly != null) { unityExplorerInspectorManagerType = unityExplorerAssembly.GetExportedTypes().SingleOrDefault((Type type) => type.FullName == "UnityExplorer.InspectorManager"); unityExplorerUIManagerType = unityExplorerAssembly.GetExportedTypes().SingleOrDefault((Type type) => type.FullName == "UnityExplorer.UI.UIManager"); unityExplorerCacheObjectBase = unityExplorerAssembly.GetExportedTypes().SingleOrDefault((Type t) => t.Name == "CacheObjectBase"); HasUnityExplorer = unityExplorerInspectorManagerType != null; } } public override void OnGUI() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_002f: 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_003c: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) GUIStyle wrappedLabel = new GUIStyle(GUI.skin.label) { wordWrap = true }; GUIStyle val = new GUIStyle(GUI.skin.label) { fontStyle = (FontStyle)1 }; GUILayout.Label("The Doctor will analyze your map and list any problems, offering suggestions to fix them.", Array.Empty<GUILayoutOption>()); if (GUILayout.Button("Expand", Array.Empty<GUILayoutOption>())) { widthIndex = (widthIndex + 1) % widths.Length; } if (GUILayout.Button("Analyze", Array.Empty<GUILayoutOption>()) && MapDatabase.Instance.maps.TryGetValue(Core.Instance.BaseModule.CurrentStage, out var value)) { analysis = Doctor.Analyze(value.Properties); showDiag = new bool[analysis.diagnostics.Count]; showGo = new bool[analysis.gameObjects.Count + 1]; } if (analysis == null) { return; } GUILayout.Label($"Analysis found {analysis.diagnostics.Count} problems.", val, Array.Empty<GUILayoutOption>()); using (GUIUtil.ScrollView(ref scrollPosition)) { int di = -1; int num = 0; if (analysis.diagnosticsWithoutTarget.Count > 0) { GUILayout.Label("Misc", Array.Empty<GUILayoutOption>()); using (GUIUtil.Indent(2, true)) { foreach (Diagnostic item in analysis.diagnosticsWithoutTarget) { DrawDiagnostic(item); } } } foreach (KeyValuePair<GameObject, List<Diagnostic>> gameObject in analysis.gameObjects) { num++; GameObject key = gameObject.Key; List<Diagnostic> value2 = gameObject.Value; showGo[num] = GUILayout.Toggle(showGo[num], $"{expandCollapseIcon(showGo[num])} GameObject: {value2[0].TargetPath}", GUI.skin.label, Array.Empty<GUILayoutOption>()); if (!showGo[num]) { continue; } using (GUIUtil.Indent(1, true)) { if (HasUnityExplorer && GUILayout.Button("UnityExplorer", Array.Empty<GUILayoutOption>())) { OpenInUnityExplorer((Object)(object)key); } foreach (Diagnostic item2 in value2) { DrawDiagnostic(item2); } } } void DrawDiagnostic(Diagnostic diagnostic) { di++; showDiag[di] = GUILayout.Toggle(showDiag[di], $"{expandCollapseIcon(showDiag[di])} {diagnostic.Message}", wrappedLabel, Array.Empty<GUILayoutOption>()); if (showDiag[di]) { using (GUIUtil.Indent(1, true)) { GUILayout.Label((diagnostic.Details == null) ? "<no details>" : diagnostic.Details, Array.Empty<GUILayoutOption>()); } } } } } private char expandCollapseIcon(bool expanded) { if (!expanded) { return '▶'; } return '▼'; } private void OpenInUnityExplorer(Object obj) { MethodInfo? method = unityExplorerInspectorManagerType.GetMethod("Inspect", new Type[2] { typeof(object), unityExplorerCacheObjectBase }); object[] parameters = (object[])(object)new Object[2] { obj, default(Object) }; method.Invoke(null, parameters); unityExplorerUIManagerType.GetMethod("set_ShowMenu").Invoke(null, new object[1] { true }); } private void OnStagePreInitialization(Stage newStage, Stage previousStage) { analysis = null; } } public static class HiddenShapes { private static readonly int[] DebugLayers = new int[2] { 12, 19 }; private static bool visible; private static GameplayCamera camera; public static bool Visible { get { return visible; } set { visible = value; Apply(); } } public static GameplayCamera Camera { get { return camera; } set { camera = value; Apply(); } } private static void Apply() { if ((Object)(object)camera == (Object)null) { return; } int[] debugLayers = DebugLayers; foreach (int num in debugLayers) { if (visible) { Camera cam = camera.cam; cam.cullingMask |= 1 << num; } else { Camera cam2 = camera.cam; cam2.cullingMask &= ~(1 << num); } } } } internal class HiddenShapesDebugUI : DebugMenu { public override string Name => "Show/Hide Hidden Shapes"; public override void OnGUI() { GUILayout.Label("Toggle visibility of hidden shapes: spawn points, grind lines, etc.", Array.Empty<GUILayoutOption>()); if (GUILayout.Button(HiddenShapes.Visible ? "Hide" : "Show", Array.Empty<GUILayoutOption>())) { HiddenShapes.Visible = !HiddenShapes.Visible; } } } [ProtoContract] [ProtoInclude(1, typeof(PlayAnimation))] internal class BasePacket { } [ProtoContract] internal class PlayAnimation : BasePacket { [ProtoMember(1)] public string directorId; [ProtoMember(2)] public Vector3 position; } internal class SlopCrewClientUI : DebugMenu { private Client<BasePacket> client; public override string Name => "SlopCrewClient"; public SlopCrewClientUI() { client = new Client<BasePacket>("MapStation.Common"); client.Enable(); client.OnPacketReceived += delegate(uint player, BasePacket packet, bool isLocal) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) Debug.Log((object)$"{player} sent us: {packet}"); if (packet is PlayAnimation playAnimation) { Debug.Log((object)playAnimation.directorId); Debug.Log((object)playAnimation.position); } }; } public override void OnGUI() { //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) GUILayout.Label($"IsSlopCrewInstalled {APIManager.IsSlopCrewInstalled}", Array.Empty<GUILayoutOption>()); GUILayout.Label($"API available? {client.ApiAvailable}", Array.Empty<GUILayoutOption>()); if (client.ApiAvailable) { GUILayout.Label($"Connected {client.SlopCrewAPI.Connected}", Array.Empty<GUILayoutOption>()); GUILayout.Label($"TickRate {client.SlopCrewAPI.TickRate}", Array.Empty<GUILayoutOption>()); GUILayout.Label("ServerAddress " + client.SlopCrewAPI.ServerAddress, Array.Empty<GUILayoutOption>()); GUILayout.Label($"Latency {client.SlopCrewAPI.Latency}", Array.Empty<GUILayoutOption>()); GUILayout.Label($"PlayerCount {client.SlopCrewAPI.PlayerCount}", Array.Empty<GUILayoutOption>()); foreach (uint player in client.SlopCrewAPI.Players) { GUILayout.Label($"Player#{player}: {client.SlopCrewAPI.GetPlayerName(player)}", Array.Empty<GUILayoutOption>()); } } GUILayout.Label($"CurrentTick {client.CurrentTick}", Array.Empty<GUILayoutOption>()); GUILayout.Label($"CurrentTickSmoothed {client.CurrentTickSmoothed}", Array.Empty<GUILayoutOption>()); GUILayout.Label($"TickDuration {client.TickDuration}", Array.Empty<GUILayoutOption>()); bool flag = client.CurrentTickSmoothed > client.CurrentTick; bool flag2 = client.CurrentTickSmoothed < client.CurrentTick; ulong num = (flag ? (client.CurrentTickSmoothed - client.CurrentTick) : (client.CurrentTick - client.CurrentTickSmoothed)); GUILayout.Label(string.Format("Tick difference {0} {1}", num, flag ? "Local is ahead" : (flag2 ? "Server is ahead" : "")), Array.Empty<GUILayoutOption>()); if (GUILayout.Button("Send Packet", Array.Empty<GUILayoutOption>())) { client.Send((BasePacket)new PlayAnimation { directorId = "foobar", position = Vector3.down }, true); } } } } namespace MapStation.Plugin.Phone { public class AppMapStation : CustomApp { public override void OnAppInit() { ((CustomApp)this).OnAppInit(); ((CustomApp)this).CreateIconlessTitleBar("MapStation", 70f); base.ScrollView = PhoneScrollView.Create((CustomApp)(object)this, 275f, 1600f); } public override void OnAppEnable() { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) ((App)this).OnAppEnable(); base.ScrollView.RemoveAllButtons(); base.ScrollView.ResetScroll(); base.ScrollView.CancelAnimation(); IEnumerable<PluginMapDatabaseEntry> enumerable = from map in MapDatabase.Instance.maps.Values orderby map.source descending, map.Properties.displayName where map.Properties.showInFastTravelMenus select map; addButton((Stage)5, "Hideout"); foreach (PluginMapDatabaseEntry item in enumerable) { addButton(item.stageId, item.Properties.displayName, item.source == MapSource.TestMaps); } void addButton(Stage stageId, string displayName, bool localBuild = false) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: 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_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) SimplePhoneButton val = PhoneUIUtility.CreateSimpleButton(displayName); if (localBuild) { GameObject obj = Object.Instantiate<GameObject>(((Component)((TMP_Text)val.Label).transform).gameObject, val.AnimationParent); ((TMP_Text)obj.GetComponent<TextMeshProUGUI>()).text = "L"; RectTransform obj2 = GameObjectExtensions.RectTransform(obj); ((Transform)obj2).localPosition = ((Transform)obj2).localPosition + (Vector3.up * 65f + Vector3.left * 65f); } ((PhoneButton)val).OnConfirm = (Action)Delegate.Combine(((PhoneButton)val).OnConfirm, (Action)delegate { //IL_0010: Unknown result type (might be due to invalid IL or missing references) Core.Instance.BaseModule.StageManager.ExitCurrentStage(stageId, (Stage)(-1)); }); base.ScrollView.AddButton((PhoneButton)(object)val); } } } } namespace MapStation.Plugin.Patches { [HarmonyPatch(typeof(AirDashAbility))] internal static class AirDashAbilityPatch { [HarmonyPrefix] [HarmonyPatch("OnStartAbility")] private static void OnStartAbility_Prefix(AirDashAbility __instance) { MapStationPlayer mapStationPlayer = MapStationPlayer.Get(((Ability)__instance).p); if (mapStationPlayer.OnVertAir) { mapStationPlayer.AirVertEnd(); } } } [HarmonyPatch(typeof(AirTrickAbility))] internal static class AirTrickAbilityPatch { [HarmonyPrefix] [HarmonyPatch("SetupBoostTrick")] private static bool SetupBoostTrick_Prefix(AirTrickAbility __instance) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) Player p = ((Ability)__instance).p; if (MapStationPlayer.Get(p).OnVertAir) { p.PlayAnim(__instance.airBoostTrickHashes[__instance.curTrick], true, false, 0f); p.PlayVoice((AudioClipID)498, (VoicePriority)2, true); p.ringParticles.Emit(1); __instance.trickType = (TrickType)2; __instance.duration *= 1.5f; p.AddBoostCharge(0f - p.boostTrickCost); return false; } return true; } } [HarmonyPatch(typeof(AProgressable))] internal static class AProgressablePatch { [HarmonyPrefix] [HarmonyPatch("InitProgressable")] private static bool InitProgressable_Prefix(AProgressable __instance, StageProgress stageProgress) { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) __instance.hasSaveData = stageProgress.HasProgressableData(__instance.uid); if (__instance.hasSaveData) { __instance.progressableData = stageProgress.GetProgressableData(__instance.uid); try { __instance.ReadFromData(); } catch (InvalidCastException) { string uid = __instance.uid; Type type = ((object)__instance).GetType(); Stage stageID = stageProgress.stageID; Debug.LogWarning((object)$"Invalid data for progressable with UID {uid}, type {type} in Stage {((object)(Stage)(ref stageID)).ToString()}. Setting default data."); __instance.SetDefaultData(stageProgress); return false; } return false; } __instance.SetDefaultData(stageProgress); return false; } } [HarmonyPatch(typeof(ASceneSetupInstruction))] public class ASceneSetupInstructionPatch { [HarmonyPrefix] [HarmonyPatch("SetSceneActive")] protected static void SetSceneActive_Prefix(ref string sceneToSetActive) { if (SceneNameMapper.Instance.Names.TryGetValue(sceneToSetActive, out var value)) { Log.Info("ASceneSetupInstruction.SetSceneActive redirected from " + sceneToSetActive + " to " + value); sceneToSetActive = value; } } } [HarmonyPatch(typeof(Assets))] internal static class AssetsPatch { [HarmonyPostfix] [HarmonyPatch("Init")] private static void Init_Postfix(Assets __instance) { Plugin.Instance.InitializeMapDatabase(__instance); } [HarmonyPostfix] [HarmonyPatch("GetAssetsToLoadDataForScene")] private static void GetAssetsToLoadDataForScene_Postfix(Assets __instance, string sceneName, ref AssetsToLoadData __result) { if ((Object)(object)__result == (Object)null) { Log.Info("Assets.GetAssetsToLoadDataForScene does not know about scene " + sceneName + "; assuming it's a custom map, creating default struct instead."); __result = ScriptableObject.CreateInstance<AssetsToLoadData>(); __result.loadCharacters = true; __result.loadGameplayPrefabs = true; __result.loadGraffiti = true; __result.sfxCollectionsToLoad = (SfxCollection[])(object)new SfxCollection[0]; } } [HarmonyPrefix] [HarmonyPatch("UnloadAssetBundleByName")] private static bool UnloadAssetBundleByName_Prefix(string assetBundleName) { if (StagePrefabHijacker.Loaded && StagePrefabHijacker.ProtectedAssetBundles.Contains(assetBundleName)) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("LoadBundleASync")] private static bool LoadBundleASync_Prefix(ref IEnumerator __result, Assets __instance, Bundle bundleToLoad) { if (ZipAssetBundles.Instance.Bundles.TryGetValue(bundleToLoad.name, out var value)) { __result = LoadMapBundleASync(__instance, bundleToLoad, value); return false; } if (bundleToLoad.IsLoaded) { return false; } return true; } private static IEnumerator LoadMapBundleASync(Assets __instance, Bundle bundleToLoad, ZipAssetBundle zipAssetBundle) { bundleToLoad.InitializeLoad(); Log.Info("Assets.LoadBundleASync loading " + bundleToLoad.Name + " from zip " + zipAssetBundle.zipPath); MapZip val = new MapZip(zipAssetBundle.zipPath); byte[] array; try { Stream stream = zipAssetBundle.bundleType switch { ZipBundleType.SCENE => val.GetSceneBundleStream(), ZipBundleType.ASSETS => val.GetAssetsBundleStream(), _ => throw new Exception("Unexpected ZipBundleType " + zipAssetBundle.bundleType), }; using (stream) { using MemoryStream memoryStream = new MemoryStream(); stream.CopyTo(memoryStream); array = memoryStream.ToArray(); } } finally { ((IDisposable)val)?.Dispose(); } __instance.currentAssetBundleCreateRequest = AssetBundle.LoadFromMemoryAsync(array); yield return __instance.currentAssetBundleCreateRequest; if ((Object)(object)__instance.currentAssetBundleCreateRequest.assetBundle == (Object)null) { bundleToLoad.ResetLoadState(); } else { bundleToLoad.SetAssetBundle(__instance.currentAssetBundleCreateRequest.assetBundle); } } } [HarmonyPatch(typeof(BaseModule))] internal static class BaseModulePatch { [HarmonyPrefix] [HarmonyPatch("SetupNewStage")] private static bool SetupNewStage_Prefix(Stage newStage) { //IL_0050: 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) if (!StagePrefabHijacker.Loaded && StagePrefabHijacker.Active) { StagePrefabHijacker.RunOnHijackStage(); StagePrefabHijacker.Log("Hideout resources loaded - switching to intended stage now."); StagePrefabHijacker.Loaded = true; StagePrefabHijacker.Active = false; Core.Instance.BaseModule.SwitchStage(StagePrefabHijacker.ActualTargetStage); return false; } if (StagePrefabHijacker.Loaded && MapDatabase.Instance.maps.ContainsKey(newStage)) { StagePrefabHijacker.RunOnCustomStage(); } StagePrefabHijacker.Loaded = false; return true; } } [HarmonyPatch(typeof(BoostAbility))] internal static class BoostAbilityPatch { [HarmonyPrefix] [HarmonyPatch("CheckActivation")] private static bool CheckActivation_Prefix(BoostAbility __instance, ref bool __result) { MapStationPlayer mapStationPlayer = MapStationPlayer.Get(((Ability)__instance).p); if (mapStationPlayer.VertBoostCooldown > 0f && mapStationPlayer.OnVertAir) { __result = false; return false; } return true; } [HarmonyPrefix] [HarmonyPatch("SetState")] private static void SetState_Prefix(BoostAbility __instance, State setState) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 MapStationPlayer mapStationPlayer = MapStationPlayer.Get(((Ability)__instance).p); if (mapStationPlayer.OnVertAir && (int)setState == 1) { mapStationPlayer.AirVertEnd(); } } } [HarmonyPatch(typeof(Bootstrap))] internal static class BootstrapPatch { [HarmonyPrefix] [HarmonyPatch("LaunchGame")] private static bool LaunchGame_Prefix(Bootstrap __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) if (MapStationConfig.Instance.QuickLaunchValue != "") { ((MonoBehaviour)__instance).StartCoroutine(__instance.SetupGameToStage(StageEnum.GetMapId(MapStationConfig.Instance.QuickLaunchValue))); return false; } return true; } } [HarmonyPatch(typeof(CharacterVisual))] internal static class CharacterVisualPatch { [HarmonyPostfix] [HarmonyPatch("InitVFX")] private static void InitVFX_Postfix(CharacterVisual __instance) { if (__instance.VFX != null) { Assets assets = Core.Instance.Assets; Texture2D mainTexture = assets.LoadAssetFromBundle<Texture2D>("common_assets", "spraycanTex"); if ((Object)(object)__instance.VFX.spraycan != (Object)null) { __instance.VFX.spraycan.GetComponent<Renderer>().sharedMaterial.mainTexture = (Texture)(object)mainTexture; } Texture2D mainTexture2 = assets.LoadAssetFromBundle<Texture2D>("common_assets", "flipPhoneTex"); if ((Object)(object)__instance.VFX.phone != (Object)null) { __instance.VFX.phone.GetComponent<Renderer>().sharedMaterial.mainTexture = (Texture)(object)mainTexture2; } } } } [HarmonyPatch(typeof(GameplayCamera))] internal static class GameplayCameraPatch { [HarmonyPostfix] [HarmonyPatch("Awake")] private static void Awake_Postfix(GameplayCamera __instance) { HiddenShapes.Camera = __instance; } [HarmonyPostfix] [HarmonyPatch("UpdateCamera")] private static void UpdateCamera_Postfix(GameplayCamera __instance) { //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) if (Object.op_Implicit((Object)(object)__instance.player) && ((Behaviour)__instance).isActiveAndEnabled && (!(__instance.hitpause > 0f) || !(__instance.player.GetVelocity() == Vector3.zero))) { MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance.player); if (__instance.cameraMode == __instance.cameraModeDrag && mapStationPlayer.OnVertAir) { __instance.SetCameraMode(mapStationPlayer.VertCameraMode, false); } } } [HarmonyPrefix] [HarmonyPatch("SetCameraMode")] [HarmonyPatch(new Type[] { typeof(CameraMode), typeof(bool) })] private static bool SetCameraMode_Prefix(GameplayCamera __instance, ref CameraMode mode) { MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance.player); if (!(mode is CameraModeDrag)) { return true; } if (mapStationPlayer.OnVertAir) { mode = mapStationPlayer.VertCameraMode; if (__instance.cameraMode == mapStationPlayer.VertCameraMode) { return false; } } return true; } } [HarmonyPatch(typeof(GrindAbility))] internal static class GrindAbilityPatch { [HarmonyPrefix] [HarmonyPatch("SetToLine")] private static void SetToLine_Prefix(GrindAbility __instance) { Player p = ((Ability)__instance).p; MapStationPlayer mapStationPlayer = MapStationPlayer.Get(p); if (mapStationPlayer.OnVertGround || mapStationPlayer.OnVertAir || mapStationPlayer.HasVertBelow) { p.OrientVisualInstantReset(); } } [HarmonyPrefix] [HarmonyPatch("JumpOut")] private static void JumpOut_Prefix(GrindAbility __instance) { if ((Object)(object)((Component)__instance.lastPath).GetComponent<GrindPath_FixComboBreakingProperty>() != (Object)null) { MapStationPlayer.Get(((Ability)__instance).p).GroundCooldown = 0.1f; } } } [HarmonyPatch(typeof(GroundDetection))] internal static class GroundDetectionPatch { private static void ComputeVert(GroundDetection __instance) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e0: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) Player player = ((BaseGroundDetection)__instance).player; MapStationPlayer mapStationPlayer = MapStationPlayer.Get(player); mapStationPlayer.HasVertBelow = false; float num = 500f; RaycastInfo raycastInfo = __instance.GetRaycastInfo(((Component)player).transform.position + Vector3.up * 1f, Vector3.down, num, 1f); if (!raycastInfo.hit) { return; } float num2 = Vector3.Angle(Vector3.up, ((RaycastHit)(ref raycastInfo.hitInfo)).normal); if ((Object)(object)((Component)((RaycastHit)(ref raycastInfo.hitInfo)).collider).GetComponent<MapStationVert>() == (Object)null) { return; } if (num2 >= 45f) { mapStationPlayer.HasVertBelow = true; if (!mapStationPlayer.OnVertGround) { mapStationPlayer.GroundVertVector = -((RaycastHit)(ref raycastInfo.hitInfo)).normal; } } if (!mapStationPlayer.OnVertAir) { return; } RaycastInfo raycastInfo2 = __instance.GetRaycastInfo(((Component)player).transform.position - mapStationPlayer.AirVertVector * 0.35f + Vector3.up * 1f, Vector3.down, num, 1f); if (raycastInfo2.hit && ((Object)(object)((Component)((RaycastHit)(ref raycastInfo2.hitInfo)).collider).GetComponent<MapStationVert>() == (Object)null || Vector3.Angle(((RaycastHit)(ref raycastInfo2.hitInfo)).normal, Vector3.up) < 45f)) { Transform transform = ((Component)player).transform; transform.position += mapStationPlayer.AirVertVector * 0.35f; } raycastInfo2 = __instance.GetRaycastInfo(((Component)player).transform.position + mapStationPlayer.AirVertVector * 0.35f + Vector3.up * 1f, Vector3.down, num, 1f); if (raycastInfo2.hit && ((Object)(object)((Component)((RaycastHit)(ref raycastInfo2.hitInfo)).collider).GetComponent<MapStationVert>() == (Object)null || Vector3.Angle(((RaycastHit)(ref raycastInfo2.hitInfo)).normal, Vector3.up) < 45f)) { Transform transform2 = ((Component)player).transform; transform2.position -= mapStationPlayer.AirVertVector * 0.35f; } if (!(num2 < 45f)) { Vector3 vertVectorFromGroundNormal = MapStationPlayer.GetVertVectorFromGroundNormal(((RaycastHit)(ref raycastInfo.hitInfo)).normal); if (!(vertVectorFromGroundNormal == mapStationPlayer.AirVertVector)) { mapStationPlayer.TransferVert(vertVectorFromGroundNormal); } } } [HarmonyPrefix] [HarmonyPatch("ComputeGroundHit")] private static bool ComputeGroundHit_Prefix(GroundDetection __instance, ref bool __result, Vector3 position, Quaternion rotation, ref GroundHit groundHitInfo, float distance) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_0134: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) MapStationPlayer mapStationPlayer = MapStationPlayer.Get(((BaseGroundDetection)__instance).player); if (mapStationPlayer.GroundCooldown > 0f || mapStationPlayer.OnPreventComboBreakingGrindPath()) { mapStationPlayer.OnVertGround = false; mapStationPlayer.WasOnVertGround = false; mapStationPlayer.HasVertBelow = false; __result = false; return false; } if (!mapStationPlayer.MoveStyleEquipped) { mapStationPlayer.OnVertGround = false; mapStationPlayer.WasOnVertGround = false; mapStationPlayer.HasVertBelow = false; return true; } ComputeVert(__instance); mapStationPlayer.OnVertGround = false; if (mapStationPlayer.OnVertAir && ((BaseGroundDetection)__instance).player.motor.velocity.y > 0f) { __result = false; return false; } Vector3 val = mapStationPlayer.GroundVertVector; float num = distance; if (mapStationPlayer.WasOnVertGround || ((BaseGroundDetection)__instance).player.motor.wasGrounded) { num = distance * 2f; } if (mapStationPlayer.OnVertAir) { num = distance * 1.25f; val = -mapStationPlayer.AirVertVector; } RaycastInfo raycastInfo = __instance.GetRaycastInfo(position, val, num, 1f); if (!raycastInfo.hit) { RaycastHit hitInfo = default(RaycastHit); if (!((BaseGroundDetection)__instance).BottomSphereCast(position, rotation, ref hitInfo, distance, 0.05f)) { return true; } raycastInfo.hit = true; raycastInfo.hitInfo = hitInfo; } if ((Object)(object)((Component)((RaycastHit)(ref raycastInfo.hitInfo)).collider).GetComponent<MapStationVert>() == (Object)null) { return true; } ((GroundHit)(ref groundHitInfo)).SetFrom(raycastInfo.hitInfo); ((GroundHit)(ref groundHitInfo)).groundDistance = 0.001f; ((GroundHit)(ref groundHitInfo)).isOnGround = true; ((GroundHit)(ref groundHitInfo)).isValidGround = true; Vector3 groundNormal = ((GroundHit)(ref groundHitInfo)).groundNormal; ((GroundHit)(ref groundHitInfo)).groundNormal = ((Vector3)(ref groundNormal)).normalized; ((GroundHit)(ref groundHitInfo)).groundNormalVisual = ((GroundHit)(ref groundHitInfo)).groundNormal; ((GroundHit)(ref groundHitInfo)).isOnStep = false; mapStationPlayer.VertCollider = ((GroundHit)(ref groundHitInfo)).groundCollider; mapStationPlayer.OnVertGround = true; __result = true; return false; } [HarmonyPostfix] [HarmonyPatch("ComputeGroundHit")] private static void ComputeGroundHit_Postfix(GroundDetection __instance, ref bool __result, Vector3 position, Quaternion rotation, ref GroundHit groundHitInfo, float distance) { //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_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) MapStationPlayer mapStationPlayer = MapStationPlayer.Get(((BaseGroundDetection)__instance).player); if (!__result && (mapStationPlayer.WasOnVertGround || mapStationPlayer.OnVertGround || mapStationPlayer.HasVertBelow)) { GroundHit prevGroundHit = ((BaseGroundDetection)__instance).prevGroundHit; if (((GroundHit)(ref prevGroundHit)).isValidGround && Vector3.Angle(-mapStationPlayer.GroundVertVector, Vector3.up) >= 45f && ((BaseGroundDetection)__instance).player.motor.velocity.y > 0f) { mapStationPlayer.AirVertBegin(); } } if (__result && mapStationPlayer.OnVertAir && ((GroundHit)(ref groundHitInfo)).isValidGround) { mapStationPlayer.AirVertEnd(); } if (mapStationPlayer.OnVertGround) { mapStationPlayer.GroundVertVector = -((GroundHit)(ref groundHitInfo)).groundNormal; } if (!mapStationPlayer.OnVertGround && ((GroundHit)(ref groundHitInfo)).isValidGround && ((GroundHit)(ref groundHitInfo)).isOnGround && mapStationPlayer.MoveStyleEquipped && mapStationPlayer.GroundVertVector != Vector3.down && (Object)(object)((Component)((GroundHit)(ref groundHitInfo)).groundCollider).GetComponent<MapStationVert>() != (Object)null) { mapStationPlayer.OnVertGround = true; } if (!mapStationPlayer.OnVertGround) { mapStationPlayer.GroundVertVector = Vector3.down; } mapStationPlayer.WasOnVertGround = mapStationPlayer.OnVertGround; } } [HarmonyPatch(typeof(LedgeClimbAbility))] internal static class LedgeClimbAbilityPatch { [HarmonyPrefix] [HarmonyPatch("CheckActivation")] private static bool CheckActivation_Prefix(LedgeClimbAbility __instance, ref bool __result) { if (MapStationPlayer.Get(((Ability)__instance).p).OnVertAir) { __result = false; return false; } return true; } } [HarmonyPatch(typeof(LoadStageASyncInstruction))] internal class LoadStageASyncInstructionPatch { [HarmonyPrefix] [HarmonyPatch(/*Could not decode attribute arguments.*/)] [HarmonyPatch(new Type[] { typeof(Stage), typeof(bool), typeof(float) })] private static void LoadStageASyncInstruction_ctor_Prefix(ref Stage stage) { //IL_0095: Unknown result type (might be due to invalid IL or missing references) CrashDetector.BeforeLoadStage(); if ((StageEnum.IsValidMapId(stage) && !StageEnum.IsKnownMapId(stage)) || (int)stage == -1) { Log.Info($"Invariant violated! Attempting to load invalid/unrecognized stage int={(int)stage} ToString()=\"{((object)(Stage)(ref stage)).ToString()}\" This should never happen, because other patches should redirect to hideout before we get here."); stage = (Stage)5; } else if (CrashDetector.ShouldAvoidReCrashing) { Log.Info($"Crash detector believes we previously crashed while loading a stage. To avoid re-crashing, redirecting from stage int={(int)stage} ToString()=\"{((object)(Stage)(ref stage)).ToString()}\" to hideout."); stage = (Stage)5; } if (!StagePrefabHijacker.Loaded && MapDatabase.Instance.maps.ContainsKey(stage)) { StagePrefabHijacker.Log("Loading Hideout resources."); StagePrefabHijacker.ActualTargetStage = stage; stage = (Stage)5; StagePrefabHijacker.Active = true; } } } [HarmonyPatch(typeof(Logger))] internal class LoggerPatch { private static readonly object Lock = new object(); [HarmonyPrefix] [HarmonyPatch("InternalLogEvent")] private static bool InternalLogEvent_Prefix(object sender, LogEventArgs eventArgs) { lock (Lock) { foreach (ILogListener listener in Logger.Listeners) { if (listener != null) { listener.LogEvent(sender, eventArgs); } } } return false; } } [HarmonyPatch(typeof(Mapcontroller))] internal static class MapcontrollerPatch { [HarmonyPrefix] [HarmonyPatch("SetMapGradient")] private static bool SetMapGradient_Prefix(Mapcontroller __instance) { if ((Object)(object)__instance.mapMaterial == (Object)null) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("GetMap")] private static bool GetMap_Prefix(Stage stage, ref Map __result) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (MapDatabase.Instance.maps.TryGetValue(stage, out var value)) { if (!MiniMapManager.TryCreateMapForCustomStage((BaseMapDatabaseEntry)(object)value, out var map)) { return true; } __result = map; return false; } return true; } } [HarmonyPatch(typeof(MovementMotor))] internal static class MovementMotorPatch { [HarmonyPrefix] [HarmonyPatch("ApplyGroundMovement")] private static void ApplyGroundMovement_Prefix(MovementMotor __instance, out GroundHit __state) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: 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) GroundHit prevGroundHit = (__state = __instance.groundDetection.prevGroundHit); Player component = ((Component)__instance).gameObject.GetComponent<Player>(); if (!((Object)(object)component == (Object)null) && MapStationPlayer.Get(component).OnVertGround && !((GroundHit)(ref prevGroundHit)).isOnGround && !((GroundHit)(ref prevGroundHit)).isValidGround) { ((GroundHit)(ref prevGroundHit)).isOnGround = true; ((GroundHit)(ref prevGroundHit)).isValidGround = true; __instance.groundDetection.prevGroundHit = prevGroundHit; } } [HarmonyPostfix] [HarmonyPatch("ApplyGroundMovement")] private static void ApplyGroundMovement_Postfix(MovementMotor __instance, GroundHit __state) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) __instance.groundDetection.prevGroundHit = __state; } } [HarmonyPatch(typeof(Player))] internal static class PlayerPatch { private struct MoveState { public float airDecc; public float aboveMaxAirDecc; } private struct OrientState { public MovementType targetMovement; public MoveStyle moveStyle; } [HarmonyPrefix] [HarmonyPatch("Awake")] private static void Awake_Prefix(Player __instance) { ((Component)__instance).gameObject.AddComponent<MapStationPlayer>(); } [HarmonyPostfix] [HarmonyPatch("Init")] private static void Init_Postfix(Player __instance) { KBMInputDisabler.Apply(); MapStationPlayer.Get(__instance).Init(); } [HarmonyPrefix] [HarmonyPatch("OnLanded")] private static bool OnLanded_Prefix(Player __instance) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) if (MapStationPlayer.Get(__instance).OnVertGround && Vector3.Angle(__instance.motor.groundNormal, Vector3.up) >= 10f) { __instance.OrientVisualInstant(); __instance.audioManager.PlaySfxGameplay(__instance.moveStyle, (AudioClipID)255, __instance.playerOneShotAudioSource, 0f); return false; } return true; } [HarmonyPrefix] [HarmonyPatch("UpdateRotation")] private static bool UpdateRotation_Prefix(Player __instance) { if (MapStationPlayer.Get(__instance).OnVertAir) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("Move")] private static void Move_Prefix(Player __instance, out MoveState __state) { __state = default(MoveState); __state.airDecc = __instance.stats.airDecc; __state.aboveMaxAirDecc = __instance.aboveMaxAirDecc; if (MapStationPlayer.Get(__instance).OnVertAir) { __instance.stats.airDecc = 0f; __instance.aboveMaxAirDecc = 0f; } } [HarmonyPostfix] [HarmonyPatch("Move")] private static void Move_Postfix(Player __instance, MoveState __state) { __instance.stats.airDecc = __state.airDecc; __instance.aboveMaxAirDecc = __state.aboveMaxAirDecc; } [HarmonyPrefix] [HarmonyPatch("SetVisualRotXZ")] private static bool SetVisualRotXZ_Prefix(Player __instance) { if (MapStationPlayer.Get(__instance).OnVertAir) { return false; } return true; } [HarmonyPrefix] [HarmonyPatch("OrientVisualToSurface")] private static bool OrientVisualToSurface_Prefix(Player __instance, out OrientState __state) { //IL_0012: 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_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance); OrientState orientState = default(OrientState); orientState.targetMovement = __instance.targetMovement; orientState.moveStyle = __instance.moveStyle; OrientState orientState2 = orientState; __state = orientState2; if (mapStationPlayer.OnVertGround) { __instance.targetMovement = (MovementType)0; __instance.moveStyle = (MoveStyle)2; } if (mapStationPlayer.OnVertAir) { mapStationPlayer.UpdateVertRotation(); return false; } return true; } [HarmonyPostfix] [HarmonyPatch("OrientVisualToSurface")] private static void OrientVisualToSurface_Postfix(Player __instance, OrientState __state) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) __instance.targetMovement = __state.targetMovement; __instance.moveStyle = __state.moveStyle; } [HarmonyPrefix] [HarmonyPatch("SetMoveStyle")] private static void SetMoveStyle_Prefix(Player __instance, MoveStyle setMoveStyle) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) if ((int)setMoveStyle != 0) { return; } Ability ability = __instance.ability; BoostAbility val = (BoostAbility)(object)((ability is BoostAbility) ? ability : null); if (val == null || !val.equippedMovestyleWasUsed) { MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance); if (mapStationPlayer.OnVertAir) { mapStationPlayer.AirVertEnd(); } } } [HarmonyPostfix] [HarmonyPatch("CompletelyStop")] private static void CompletelyStop_Postfix(Player __instance) { MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance); mapStationPlayer.SpeedFromVertAir = 0f; if (mapStationPlayer.OnVertAir) { mapStationPlayer.AirVertEnd(); } } [HarmonyPrefix] [HarmonyPatch("JumpIsAllowed")] private static bool JumpIsAllowed_Prefix(Player __instance, ref bool __result) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Unknown result type (might be due to invalid IL or missing references) MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance); if (mapStationPlayer.OnVertGround && Vector3.Angle(__instance.motor.groundNormal, Vector3.up) >= 45f) { __result = false; return false; } if (mapStationPlayer.OnVertAir) { __result = false; return false; } return true; } [HarmonyPrefix] [HarmonyPatch("CanStartGrind")] private static bool CanStartGrind_Prefix(Player __instance, ref bool __result) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) if (__instance.jumpButtonHeld || __instance.jumpButtonNew || __instance.jumpRequested) { return true; } MapStationPlayer mapStationPlayer = MapStationPlayer.Get(__instance); if (mapStationPlayer.OnVertAir) { __result = false; return false; } if (mapStationPlayer.HasVertBelow) { __result = false; return false; } if (mapStationPlayer.OnVertGround && Vector3.Angle(__instance.motor.groundNormal, Vector3.up) >= 45f) { __result = false; return false; } return true; } [HarmonyPostfix] [HarmonyPatch("UpdateAbilities")] private static void UpdateAbilities_Postfix(Player __instance) { if (__instance.ability == __instance.handplantAbility) { MapStationPlayer.Get(__instance).MapStationHandplantAbility.UpdateAbility(); } } [HarmonyPostfix] [HarmonyPatch("LateUpdateAnimation")] private static void LateUpdateAnimation_Postfix(Player __instance) { if (((Component)__instance).gameObject.activeSelf) { MapStationPlayer.Get(__instance).MapStationHandplantAbility.LateUpdateAnimation(); } } } [HarmonyPatch(typeof(PlayerPhoneCameras))] internal class PlayerPhoneCamerasPatch { [HarmonyPostfix] [HarmonyPatch("Awake")] private static void Awake_Postfix(PlayerPhoneCameras __instance) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) MapStationCameraOverride instance = MapStationCameraOverride.Instance; if ((Object)(object)instance == (Object)null || !instance.AlsoAffectPhoneCamera) { return; } Camera[] componentsInChildren = ((Component)__instance).GetComponentsInChildren<Camera>(); foreach (Camera val in componentsInChildren) { instance.ApplyToCamera(val); if ((Object)(object)((Component)val).GetComponent<PostProcessLayer>() != (Object)null) { PostProcessLayer component = ((Component)val).GetComponent<PostProcessLayer>(); component.volumeLayer = LayerMask.op_Implicit(LayerMask.op_Implicit(component.volumeLayer) | 0x1000000); } } } } [HarmonyPatch(typeof(SaveSlotData))] internal static class SaveSlotDataPatch { [HarmonyPostfix] [HarmonyPatch("GetStageProgress")] private static void GetStageProgress_Postfix(Stage stage, ref StageProgress __result) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (__result == null && StageEnum.IsKnownMapId(stage)) { __result = StageProgresses.Instance.GetOrCreateForStage(stage); } } } [HarmonyPatch(typeof(Enum))] internal static class StagePatch { [HarmonyPostfix] [HarmonyPatch("ToString")] [HarmonyPatch(new Type[] { })] private static void ToString_Postfix(ref string __result, Enum __instance) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (!(__instance is Stage)) { return; } Stage val = (Stage)(object)__instance; if (StageEnum.IsValidMapId(val)) { if (StageEnum.MapNames.TryGetValue(val, out var value)) { __result = "mapstation/" + value; } else { __result = "mapstation/unknown/" + __result; } } } } [HarmonyPatch(typeof(TextMeshProGameTextLocalizer))] internal class TextMeshProGameTextLocalizerPatch { [HarmonyPrefix] [HarmonyPatch("GetStageNameKey")] private static bool GetStageNameKey_Prefix(TextMeshProGameTextLocalizer __instance, Stage stageID, ref string __result) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) if (MapDatabase.Instance.maps.TryGetValue(stageID, out var value)) { __result = value.Properties.displayName; return false; } return true; } } [HarmonyPatch(typeof(Utility))] internal static class UtilityPatch { [HarmonyPostfix] [HarmonyPatch("SceneNameToStage")] private static void SceneNameToStage_Postfix(ref Stage __result, string sceneName) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected I4, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected I4, but got Unknown if ((int)__result != -1) { return; } bool flag = false; if (sceneName.StartsWith("mapstation/")) { string key = sceneName.Substring(11); if (StageEnum.MapIds.TryGetValue(ke
MapStation.Tools.dll
Decompiled 3 months agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Microsoft.CodeAnalysis; using Reptile; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.7.1", FrameworkDisplayName = ".NET Framework 4.7.1")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: AssemblyCompany("MapStation.Tools")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+2a9f5e71dc280b5c7d4e74f2e1ad0f6a1ac841a2")] [assembly: AssemblyProduct("MapStation.Tools")] [assembly: AssemblyTitle("MapStation.Tools")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [assembly: TypeForwardedTo(typeof(ABaseError))] [assembly: TypeForwardedTo(typeof(Ability))] [assembly: TypeForwardedTo(typeof(Achievement))] [assembly: TypeForwardedTo(typeof(AchievementLibrary))] [assembly: TypeForwardedTo(typeof(AchievementPhotoObjective))] [assembly: TypeForwardedTo(typeof(Achievements))] [assembly: TypeForwardedTo(typeof(AchievementsCache))] [assembly: TypeForwardedTo(typeof(AchievementsLocal))] [assembly: TypeForwardedTo(typeof(AchievementsSteam))] [assembly: TypeForwardedTo(typeof(AchievementsTracker))] [assembly: TypeForwardedTo(typeof(AchievementsTracking))] [assembly: TypeForwardedTo(typeof(AchievementType))] [assembly: TypeForwardedTo(typeof(ActiveOnChapter))] [assembly: TypeForwardedTo(typeof(ADataSerializer))] [assembly: TypeForwardedTo(typeof(ADownloadableContent))] [assembly: TypeForwardedTo(typeof(AErrorHandler))] [assembly: TypeForwardedTo(typeof(AFileTransaction))] [assembly: TypeForwardedTo(typeof(AFodsLocalizationFileParser))] [assembly: TypeForwardedTo(typeof(AGameDebug))] [assembly: TypeForwardedTo(typeof(AGameTextFormatter))] [assembly: TypeForwardedTo(typeof(AIndexQueue))] [assembly: TypeForwardedTo(typeof(AirDashAbility))] [assembly: TypeForwardedTo(typeof(AirTrickAbility))] [assembly: TypeForwardedTo(typeof(AlignWithRayAttribute))] [assembly: TypeForwardedTo(typeof(AmbientManager))] [assembly: TypeForwardedTo(typeof(AmbientTrigger))] [assembly: TypeForwardedTo(typeof(AMenuController))] [assembly: TypeForwardedTo(typeof(AnimatedStripe))] [assembly: TypeForwardedTo(typeof(AnimationAssetManager))] [assembly: TypeForwardedTo(typeof(AnimationEventRelay))] [assembly: TypeForwardedTo(typeof(AnimationInstanceEvent))] [assembly: TypeForwardedTo(typeof(AnimationInstanceInfo))] [assembly: TypeForwardedTo(typeof(AnimationInstanceType))] [assembly: TypeForwardedTo(typeof(AnimationInstancing))] [assembly: TypeForwardedTo(typeof(AnimationInstancingManager))] [assembly: TypeForwardedTo(typeof(AnimationTexture))] [assembly: TypeForwardedTo(typeof(AnimInfo))] [assembly: TypeForwardedTo(typeof(AOptionsMenuTab))] [assembly: TypeForwardedTo(typeof(APlatform))] [assembly: TypeForwardedTo(typeof(ApplicationUtility))] [assembly: TypeForwardedTo(typeof(ApplyToChildAttribute))] [assembly: TypeForwardedTo(typeof(AProgressable))] [assembly: TypeForwardedTo(typeof(Arm))] [assembly: TypeForwardedTo(typeof(ASceneAssetLoader))] [assembly: TypeForwardedTo(typeof(ASceneSetupInstruction))] [assembly: TypeForwardedTo(typeof(AssetBundleCollection))] [assembly: TypeForwardedTo(typeof(AssetBundleLibrary))] [assembly: TypeForwardedTo(typeof(Assets))] [assembly: TypeForwardedTo(typeof(AssetsToLoadData))] [assembly: TypeForwardedTo(typeof(AssetsToLoadDataLibrary))] [assembly: TypeForwardedTo(typeof(AStorage))] [assembly: TypeForwardedTo(typeof(AsyncState))] [assembly: TypeForwardedTo(typeof(ATextMeshProFormatter))] [assembly: TypeForwardedTo(typeof(ATransaction))] [assembly: TypeForwardedTo(typeof(AudioAmbienceTrigger))] [assembly: TypeForwardedTo(typeof(AudioAmbienceZone))] [assembly: TypeForwardedTo(typeof(AudioAnalyzer))] [assembly: TypeForwardedTo(typeof(AudioChannelID))] [assembly: TypeForwardedTo(typeof(AudioClipFilterAttribute))] [assembly: TypeForwardedTo(typeof(AudioClipID))] [assembly: TypeForwardedTo(typeof(AudioManager))] [assembly: TypeForwardedTo(typeof(AudioRectangularReverb))] [assembly: TypeForwardedTo(typeof(AudioSettings))] [assembly: TypeForwardedTo(typeof(AudioSourceID))] [assembly: TypeForwardedTo(typeof(AudioSubSystem))] [assembly: TypeForwardedTo(typeof(AUnlockable))] [assembly: TypeForwardedTo(typeof(AUser))] [assembly: TypeForwardedTo(typeof(AUserSaveDataLoader))] [assembly: TypeForwardedTo(typeof(AutoPlayLoop))] [assembly: TypeForwardedTo(typeof(BannerSpin))] [assembly: TypeForwardedTo(typeof(BaseGroundDetection))] [assembly: TypeForwardedTo(typeof(BaseMenuTimelineBehaviour))] [assembly: TypeForwardedTo(typeof(BaseModule))] [assembly: TypeForwardedTo(typeof(BaseMoveHandler))] [assembly: TypeForwardedTo(typeof(BasePhotoObjective))] [assembly: TypeForwardedTo(typeof(BasicCop))] [assembly: TypeForwardedTo(typeof(BasicCopAnimInfo))] [assembly: TypeForwardedTo(typeof(BasicEnemy))] [assembly: TypeForwardedTo(typeof(BasicEnemySpawner))] [assembly: TypeForwardedTo(typeof(BasketballAchievement))] [assembly: TypeForwardedTo(typeof(Battle))] [assembly: TypeForwardedTo(typeof(Bird))] [assembly: TypeForwardedTo(typeof(BirdAchievement))] [assembly: TypeForwardedTo(typeof(BirdBehaviour))] [assembly: TypeForwardedTo(typeof(BlackBarBehaviour))] [assembly: TypeForwardedTo(typeof(BlackBarClip))] [assembly: TypeForwardedTo(typeof(BlackBarTrack))] [assembly: TypeForwardedTo(typeof(BMXOnlyGateway))] [assembly: TypeForwardedTo(typeof(BoostAbility))] [assembly: TypeForwardedTo(typeof(BoosterAchievementsTracker))] [assembly: TypeForwardedTo(typeof(BoosterEvent))] [assembly: TypeForwardedTo(typeof(BoosterStats))] [assembly: TypeForwardedTo(typeof(BoostpackEffectMode))] [assembly: TypeForwardedTo(typeof(Bootstrap))] [assembly: TypeForwardedTo(typeof(BouncingBoxWidget))] [assembly: TypeForwardedTo(typeof(BoxGroundDetection))] [assembly: TypeForwardedTo(typeof(BoxSide))] [assembly: TypeForwardedTo(typeof(BreakableObject))] [assembly: TypeForwardedTo(typeof(Buffer<>))] [assembly: TypeForwardedTo(typeof(Bullet))] [assembly: TypeForwardedTo(typeof(Bundle))] [assembly: TypeForwardedTo(typeof(ButtonSpriteData))] [assembly: TypeForwardedTo(typeof(ButtonSpriteDictionary))] [assembly: TypeForwardedTo(typeof(CameraExtensions))] [assembly: TypeForwardedTo(typeof(CameraMode))] [assembly: TypeForwardedTo(typeof(CameraModeDrag))] [assembly: TypeForwardedTo(typeof(CameraModeGrind))] [assembly: TypeForwardedTo(typeof(CameraModeHandplant))] [assembly: TypeForwardedTo(typeof(CameraModeLock))] [assembly: TypeForwardedTo(typeof(CameraModeVert))] [assembly: TypeForwardedTo(typeof(CameraModeWallrun))] [assembly: TypeForwardedTo(typeof(CameraModeZone))] [assembly: TypeForwardedTo(typeof(CameraRegisterer))] [assembly: TypeForwardedTo(typeof(CameraShakeBehaviour))] [assembly: TypeForwardedTo(typeof(CameraShakeClip))] [assembly: TypeForwardedTo(typeof(CameraShakeComponent))] [assembly: TypeForwardedTo(typeof(CameraShakeTrack))] [assembly: TypeForwardedTo(typeof(CameraUtility))] [assembly: TypeForwardedTo(typeof(CameraZone))] [assembly: TypeForwardedTo(typeof(CameraZoneMode))] [assembly: TypeForwardedTo(typeof(Car))] [assembly: TypeForwardedTo(typeof(CarsMoveHandler))] [assembly: TypeForwardedTo(typeof(CarVisualAudio))] [assembly: TypeForwardedTo(typeof(Category))] [assembly: TypeForwardedTo(typeof(CaughtAbility))] [assembly: TypeForwardedTo(typeof(ChapterMusic))] [assembly: TypeForwardedTo(typeof(CharacterConstructor))] [assembly: TypeForwardedTo(typeof(CharacterLoader))] [assembly: TypeForwardedTo(typeof(CharacterNamePickerAttribute))] [assembly: TypeForwardedTo(typeof(CharacterProgress))] [assembly: TypeForwardedTo(typeof(Characters))] [assembly: TypeForwardedTo(typeof(CharacterSelect))] [assembly: TypeForwardedTo(typeof(CharacterSelectAbility))] [assembly: TypeForwardedTo(typeof(CharacterSelectCharacter))] [assembly: TypeForwardedTo(typeof(CharacterSelectSpot))] [assembly: TypeForwardedTo(typeof(CharacterSelectUI))] [assembly: TypeForwardedTo(typeof(CharacterVisual))] [assembly: TypeForwardedTo(typeof(Collectable))] [assembly: TypeForwardedTo(typeof(CollectableProgress))] [assembly: TypeForwardedTo(typeof(CombatEncounter))] [assembly: TypeForwardedTo(typeof(ComboEncounter))] [assembly: TypeForwardedTo(typeof(ComboMascot))] [assembly: TypeForwardedTo(typeof(ComboMascotSystem))] [assembly: TypeForwardedTo(typeof(ComparerHash))] [assembly: TypeForwardedTo(typeof(ComponentExtensions))] [assembly: TypeForwardedTo(typeof(CompressedGameSaveDataSerializer))] [assembly: TypeForwardedTo(typeof(ContainerExtensions))] [assembly: TypeForwardedTo(typeof(ControllerGuidHandlerFactory))] [assembly: TypeForwardedTo(typeof(CopAnimInfo))] [assembly: TypeForwardedTo(typeof(CopterCop))] [assembly: TypeForwardedTo(typeof(CopterCopAnimInfo))] [assembly: TypeForwardedTo(typeof(CopterCopSpawner))] [assembly: TypeForwardedTo(typeof(Core))] [assembly: TypeForwardedTo(typeof(CorruptedDataLoadError))] [assembly: TypeForwardedTo(typeof(CorruptedDataSaveError))] [assembly: TypeForwardedTo(typeof(CorruptedSaveSlotLoadError))] [assembly: TypeForwardedTo(typeof(CreditsManager))] [assembly: TypeForwardedTo(typeof(Crew))] [assembly: TypeForwardedTo(typeof(CuffMissileEnemy))] [assembly: TypeForwardedTo(typeof(CuffMissileLauncher))] [assembly: TypeForwardedTo(typeof(CutsceneAudioTrack))] [assembly: TypeForwardedTo(typeof(CutsceneCameraFollowTempRacer))] [assembly: TypeForwardedTo(typeof(DanceAbility))] [assembly: TypeForwardedTo(typeof(DanceAbilityUI))] [assembly: TypeForwardedTo(typeof(DanceAbilityUIButton))] [assembly: TypeForwardedTo(typeof(Dances))] [assembly: TypeForwardedTo(typeof(DataSerializerFactory))] [assembly: TypeForwardedTo(typeof(DeactivateOnAwake))] [assembly: TypeForwardedTo(typeof(DebugConsoleTextAreaHandler))] [assembly: TypeForwardedTo(typeof(DebugMenuController))] [assembly: TypeForwardedTo(typeof(DebugUtility))] [assembly: TypeForwardedTo(typeof(DefaultIndexQueue))] [assembly: TypeForwardedTo(typeof(DeleteTransaction))] [assembly: TypeForwardedTo(typeof(DelimiterMatcher))] [assembly: TypeForwardedTo(typeof(DelimiterRegexFormatterData))] [assembly: TypeForwardedTo(typeof(DestroyWhenOutOfView))] [assembly: TypeForwardedTo(typeof(DialogueBehaviour))] [assembly: TypeForwardedTo(typeof(DialogueClip))] [assembly: TypeForwardedTo(typeof(DialogueTrack))] [assembly: TypeForwardedTo(typeof(DialogueUI))] [assembly: TypeForwardedTo(typeof(DieAbility))] [assembly: TypeForwardedTo(typeof(DieMenu))] [assembly: TypeForwardedTo(typeof(DirectoryCreateTransaction))] [assembly: TypeForwardedTo(typeof(DirectoryInfoTransaction))] [assembly: TypeForwardedTo(typeof(DJBoss))] [assembly: TypeForwardedTo(typeof(DJBossAnimInfo))] [assembly: TypeForwardedTo(typeof(DJBossJumper))] [assembly: TypeForwardedTo(typeof(DJCollider))] [assembly: TypeForwardedTo(typeof(DownloadableContentEditor))] [assembly: TypeForwardedTo(typeof(DownloadableContentItem))] [assembly: TypeForwardedTo(typeof(DownloadableContentLibrary))] [assembly: TypeForwardedTo(typeof(DownloadableContentSteam))] [assembly: TypeForwardedTo(typeof(DownloadableContentWindows))] [assembly: TypeForwardedTo(typeof(DreamEncounter))] [assembly: TypeForwardedTo(typeof(DummyAnimationEventRelay))] [assembly: TypeForwardedTo(typeof(DumpFileGenerator))] [assembly: TypeForwardedTo(typeof(DynamicJunk))] [assembly: TypeForwardedTo(typeof(DynamicJunkUpdater))] [assembly: TypeForwardedTo(typeof(DynamicPickup))] [assembly: TypeForwardedTo(typeof(DynamicRepPickup))] [assembly: TypeForwardedTo(typeof(EffectsUI))] [assembly: TypeForwardedTo(typeof(EmptyError))] [assembly: TypeForwardedTo(typeof(Encounter))] [assembly: TypeForwardedTo(typeof(EncounterProgress))] [assembly: TypeForwardedTo(typeof(EnemyAnimationEventRelay))] [assembly: TypeForwardedTo(typeof(EnemyAnimations))] [assembly: TypeForwardedTo(typeof(EnemyAnimInfos))] [assembly: TypeForwardedTo(typeof(EnemyExtension))] [assembly: TypeForwardedTo(typeof(EnemyFirearm))] [assembly: TypeForwardedTo(typeof(EnemyGraffitiSpotDamager))] [assembly: TypeForwardedTo(typeof(EnemyGrindLines))] [assembly: TypeForwardedTo(typeof(EnemyHitResponse))] [assembly: TypeForwardedTo(typeof(EnemyLockOnAiming))] [assembly: TypeForwardedTo(typeof(EnemyMeleeWeapon))] [assembly: TypeForwardedTo(typeof(EnemyNavmeshMovement))] [assembly: TypeForwardedTo(typeof(EnemyPositioningInfo))] [assembly: TypeForwardedTo(typeof(EnemyShield))] [assembly: TypeForwardedTo(typeof(EnemySpawnAdds))] [assembly: TypeForwardedTo(typeof(EnemySpawnReplacement))] [assembly: TypeForwardedTo(typeof(EnemyStopMoveAlongPoints))] [assembly: TypeForwardedTo(typeof(EnemyTargetabilityAiming))] [assembly: TypeForwardedTo(typeof(EnemyTargets))] [assembly: TypeForwardedTo(typeof(EnemyType))] [assembly: TypeForwardedTo(typeof(EnemyVelocityAiming))] [assembly: TypeForwardedTo(typeof(EnemyVoices))] [assembly: TypeForwardedTo(typeof(ErrorHandlerFinishedDelegate))] [assembly: TypeForwardedTo(typeof(ErrorHandlingResult))] [assembly: TypeForwardedTo(typeof(ErrorQueue))] [assembly: TypeForwardedTo(typeof(ErrorYieldInstruction))] [assembly: TypeForwardedTo(typeof(ExplosionMaterialData))] [assembly: TypeForwardedTo(typeof(Explosive))] [assembly: TypeForwardedTo(typeof(ExtraBoneInfo))] [assembly: TypeForwardedTo(typeof(Extrusion))] [assembly: TypeForwardedTo(typeof(FadeBehaviour))] [assembly: TypeForwardedTo(typeof(FadeClip))] [assembly: TypeForwardedTo(typeof(FadeTrack))] [assembly: TypeForwardedTo(typeof(FinalBossAchievement))] [assembly: TypeForwardedTo(typeof(FixedFramerateSequence))] [assembly: TypeForwardedTo(typeof(FlipOutJumpAbility))] [assembly: TypeForwardedTo(typeof(FloorIsLavaEncounter))] [assembly: TypeForwardedTo(typeof(FodsCharacterNamesParser))] [assembly: TypeForwardedTo(typeof(FodsCreditsParser))] [assembly: TypeForwardedTo(typeof(FodsDialogueParser))] [assembly: TypeForwardedTo(typeof(FodsDocumentLoader))] [assembly: TypeForwardedTo(typeof(FodsLocalizationFileReader))] [assembly: TypeForwardedTo(typeof(FodsObjectiveTextParser))] [assembly: TypeForwardedTo(typeof(FodsStageNamesParser))] [assembly: TypeForwardedTo(typeof(FodsTable))] [assembly: TypeForwardedTo(typeof(FodsTextLocalizationParser))] [assembly: TypeForwardedTo(typeof(FodsTextSizeLocalizationParser))] [assembly: TypeForwardedTo(typeof(FormatterData))] [assembly: TypeForwardedTo(typeof(FormattingUtility))] [assembly: TypeForwardedTo(typeof(FortuneCookie))] [assembly: TypeForwardedTo(typeof(FortuneRare))] [assembly: TypeForwardedTo(typeof(FrictionEffectMode))] [assembly: TypeForwardedTo(typeof(GameDebugDummy))] [assembly: TypeForwardedTo(typeof(GameFontType))] [assembly: TypeForwardedTo(typeof(GameInput))] [assembly: TypeForwardedTo(typeof(GameNotificationUI))] [assembly: TypeForwardedTo(typeof(GameParameters))] [assembly: TypeForwardedTo(typeof(GameplayCamera))] [assembly: TypeForwardedTo(typeof(GameplayEvent))] [assembly: TypeForwardedTo(typeof(GameplaySettings))] [assembly: TypeForwardedTo(typeof(GameplayUI))] [assembly: TypeForwardedTo(typeof(GamePrefabLoader))] [assembly: TypeForwardedTo(typeof(GameVersion))] [assembly: TypeForwardedTo(typeof(GassBarrier))] [assembly: TypeForwardedTo(typeof(GenericStats<, >))] [assembly: TypeForwardedTo(typeof(GraffitiAchievementsTracker))] [assembly: TypeForwardedTo(typeof(GraffitiArt))] [assembly: TypeForwardedTo(typeof(GraffitiArtInfo))] [assembly: TypeForwardedTo(typeof(GraffitiCollectableVisual))] [assembly: TypeForwardedTo(typeof(GraffitiEffect))] [assembly: TypeForwardedTo(typeof(GraffitiEvent))] [assembly: TypeForwardedTo(typeof(GraffitiGame))] [assembly: TypeForwardedTo(typeof(GraffitiInfoPanel))] [assembly: TypeForwardedTo(typeof(GraffitiLoader))] [assembly: TypeForwardedTo(typeof(GraffitiSize))] [assembly: TypeForwardedTo(typeof(GraffitiSpot))] [assembly: TypeForwardedTo(typeof(GraffitiSpotFinisher))] [assembly: TypeForwardedTo(typeof(GraffitiSpotProgress))] [assembly: TypeForwardedTo(typeof(GraffitiState))] [assembly: TypeForwardedTo(typeof(GraffitiStats))] [assembly: TypeForwardedTo(typeof(GraphicsStatusHandler))] [assembly: TypeForwardedTo(typeof(GrindAbility))] [assembly: TypeForwardedTo(typeof(GrindLine))] [assembly: TypeForwardedTo(typeof(GrindLineAnimate))] [assembly: TypeForwardedTo(typeof(GrindNode))] [assembly: TypeForwardedTo(typeof(GrindNodeAnimate))] [assembly: TypeForwardedTo(typeof(GrindPath))] [assembly: TypeForwardedTo(typeof(GroundDetection))] [assembly: TypeForwardedTo(typeof(GroundHit))] [assembly: TypeForwardedTo(typeof(GroundTrickAbility))] [assembly: TypeForwardedTo(typeof(GroupOptions))] [assembly: TypeForwardedTo(typeof(HackerText))] [assembly: TypeForwardedTo(typeof(HandplantAbility))] [assembly: TypeForwardedTo(typeof(HeadspinAbility))] [assembly: TypeForwardedTo(typeof(HitBounceAbility))] [assembly: TypeForwardedTo(typeof(HitDir))] [assembly: TypeForwardedTo(typeof(HomeScreenApp))] [assembly: TypeForwardedTo(typeof(IAudioSubSystem))] [assembly: TypeForwardedTo(typeof(ICollectionGenerator))] [assembly: TypeForwardedTo(typeof(IDataSerializer))] [assembly: TypeForwardedTo(typeof(IEditorGameTextLocalizer))] [assembly: TypeForwardedTo(typeof(IError))] [assembly: TypeForwardedTo(typeof(IGameTextFormatter))] [assembly: TypeForwardedTo(typeof(IGameTextLocalizer))] [assembly: TypeForwardedTo(typeof(IInitializableSceneObject))] [assembly: TypeForwardedTo(typeof(IInterruptable))] [assembly: TypeForwardedTo(typeof(ILocalizationFileLoader))] [assembly: TypeForwardedTo(typeof(ILocalizationFileParser))] [assembly: TypeForwardedTo(typeof(ILocalizationFileReader))] [assembly: TypeForwardedTo(typeof(IMenuAnimationTransitionController))] [assembly: TypeForwardedTo(typeof(IMultiTransactionHandler))] [assembly: TypeForwardedTo(typeof(IMusicLibraryPlayer))] [assembly: TypeForwardedTo(typeof(IMusicPlayer))] [assembly: TypeForwardedTo(typeof(IncorrectFormatException))] [assembly: TypeForwardedTo(typeof(InputControllerGuidData))] [assembly: TypeForwardedTo(typeof(InputSelectionRowController))] [assembly: TypeForwardedTo(typeof(InputSettings))] [assembly: TypeForwardedTo(typeof(InstanceAnimationInstanceInfo))] [assembly: TypeForwardedTo(typeof(InstanceData))] [assembly: TypeForwardedTo(typeof(InstancingPackage))] [assembly: TypeForwardedTo(typeof(InverseKinematicsRelay))] [assembly: TypeForwardedTo(typeof(IOUtility))] [assembly: TypeForwardedTo(typeof(IPoolable))] [assembly: TypeForwardedTo(typeof(IRegexPatternCreator))] [assembly: TypeForwardedTo(typeof(IRewiredControllerGuidHandler))] [assembly: TypeForwardedTo(typeof(ISaveable))] [assembly: TypeForwardedTo(typeof(ISceneAssetLoader))] [assembly: TypeForwardedTo(typeof(ISubsystem))] [assembly: TypeForwardedTo(typeof(ITextFormatter))] [assembly: TypeForwardedTo(typeof(ITextMatcher))] [assembly: TypeForwardedTo(typeof(ITextSelectable))] [assembly: TypeForwardedTo(typeof(ITransactionError))] [assembly: TypeForwardedTo(typeof(IUIElement))] [assembly: TypeForwardedTo(typeof(IUIMenuController))] [assembly: TypeForwardedTo(typeof(IUserId))] [assembly: TypeForwardedTo(typeof(IUserSaveDataLoader))] [assembly: TypeForwardedTo(typeof(Junk))] [assembly: TypeForwardedTo(typeof(JunkBehaviour))] [assembly: TypeForwardedTo(typeof(JunkHolder))] [assembly: TypeForwardedTo(typeof(JunkStageHandler))] [assembly: TypeForwardedTo(typeof(KnockbackAbility))] [assembly: TypeForwardedTo(typeof(Layers))] [assembly: TypeForwardedTo(typeof(Layout))] [assembly: TypeForwardedTo(typeof(LayoutManagerRuleSet))] [assembly: TypeForwardedTo(typeof(LedgeClimbAbility))] [assembly: TypeForwardedTo(typeof(LoadingScreenUI))] [assembly: TypeForwardedTo(typeof(LoadSceneASyncInstruction))] [assembly: TypeForwardedTo(typeof(LoadSceneInstruction))] [assembly: TypeForwardedTo(typeof(LoadStageASyncInstruction))] [assembly: TypeForwardedTo(typeof(LoadTransaction<>))] [assembly: TypeForwardedTo(typeof(LocalizationData))] [assembly: TypeForwardedTo(typeof(LocalizationGroup))] [assembly: TypeForwardedTo(typeof(LocalizationKeyValuePair))] [assembly: TypeForwardedTo(typeof(LocalizationLookupTable))] [assembly: TypeForwardedTo(typeof(LocalizationNameFont))] [assembly: TypeForwardedTo(typeof(LocalizationTableGenerator))] [assembly: TypeForwardedTo(typeof(LocalizedTMProText))] [assembly: TypeForwardedTo(typeof(LodInfo))] [assembly: TypeForwardedTo(typeof(LogEntry))] [assembly: TypeForwardedTo(typeof(Logger))] [assembly: TypeForwardedTo(typeof(LookAtIKBehaviour))] [assembly: TypeForwardedTo(typeof(LookAtIKClip))] [assembly: TypeForwardedTo(typeof(LookAtIKComponent))] [assembly: TypeForwardedTo(typeof(LookAtIKMixerBehaviour))] [assembly: TypeForwardedTo(typeof(LookAtIKTrack))] [assembly: TypeForwardedTo(typeof(MainMenuManager))] [assembly: TypeForwardedTo(typeof(Map))] [assembly: TypeForwardedTo(typeof(Mapcontroller))] [assembly: TypeForwardedTo(typeof(MapPin))] [assembly: TypeForwardedTo(typeof(MaterialBlock))] [assembly: TypeForwardedTo(typeof(Menu))] [assembly: TypeForwardedTo(typeof(MenuNavigationController))] [assembly: TypeForwardedTo(typeof(MenuTimelineButton))] [assembly: TypeForwardedTo(typeof(MissileEnemy))] [assembly: TypeForwardedTo(typeof(MissionPhotoObjective))] [assembly: TypeForwardedTo(typeof(MouseLook))] [assembly: TypeForwardedTo(typeof(MoveAlongHandler))] [assembly: TypeForwardedTo(typeof(MoveAlongPoints))] [assembly: TypeForwardedTo(typeof(MoveAlongPoints_Hot))] [assembly: TypeForwardedTo(typeof(MovementMotor))] [assembly: TypeForwardedTo(typeof(MovementStats))] [assembly: TypeForwardedTo(typeof(MoveObject))] [assembly: TypeForwardedTo(typeof(MoverLOD))] [assembly: TypeForwardedTo(typeof(MoveStyle))] [assembly: TypeForwardedTo(typeof(MoveStyleCollectableVisuals))] [assembly: TypeForwardedTo(typeof(MoveStyleLoader))] [assembly: TypeForwardedTo(typeof(MoveStyleSkin))] [assembly: TypeForwardedTo(typeof(MovingPlatform))] [assembly: TypeForwardedTo(typeof(MultiOptionButton))] [assembly: TypeForwardedTo(typeof(MusicAssetsLoader))] [assembly: TypeForwardedTo(typeof(MusicBundle))] [assembly: TypeForwardedTo(typeof(MusicLibrary))] [assembly: TypeForwardedTo(typeof(MusicLibraryPlayer))] [assembly: TypeForwardedTo(typeof(MusicPlayer))] [assembly: TypeForwardedTo(typeof(MusicPlayerBuffer))] [assembly: TypeForwardedTo(typeof(MusicPlayerData))] [assembly: TypeForwardedTo(typeof(MusicTimelineBehaviour))] [assembly: TypeForwardedTo(typeof(MusicTimelineClip))] [assembly: TypeForwardedTo(typeof(MusicTimelineMixer))] [assembly: TypeForwardedTo(typeof(MusicTimelineTrack))] [assembly: TypeForwardedTo(typeof(MusicTrack))] [assembly: TypeForwardedTo(typeof(MusicTrackDictionary))] [assembly: TypeForwardedTo(typeof(MusicTrackID))] [assembly: TypeForwardedTo(typeof(MusicTrackIDComparer))] [assembly: TypeForwardedTo(typeof(MusicTrackQueue))] [assembly: TypeForwardedTo(typeof(NoAccessToDataError))] [assembly: TypeForwardedTo(typeof(NoBundleFoundException))] [assembly: TypeForwardedTo(typeof(NoDiskSpaceSaveError))] [assembly: TypeForwardedTo(typeof(NoModelException))] [assembly: TypeForwardedTo(typeof(NonPlayerAnimationEventRelay))] [assembly: TypeForwardedTo(typeof(NoOutfitException))] [assembly: TypeForwardedTo(typeof(NotificationTextAsset))] [assembly: TypeForwardedTo(typeof(NPC))] [assembly: TypeForwardedTo(typeof(NPCProgress))] [assembly: TypeForwardedTo(typeof(ObjectProgress))] [assembly: TypeForwardedTo(typeof(OneOffVisualEffect))] [assembly: TypeForwardedTo(typeof(OnGSpotStateChanged))] [assembly: TypeForwardedTo(typeof(OnLanguageChangedHandler))] [assembly: TypeForwardedTo(typeof(OnMultiOptionsUIChangedEvent))] [assembly: TypeForwardedTo(typeof(OnSliderValueChangedEvent))] [assembly: TypeForwardedTo(typeof(OptionsMenu))] [assembly: TypeForwardedTo(typeof(OptionsMenuAudioTab))] [assembly: TypeForwardedTo(typeof(OptionsMenuGameTab))] [assembly: TypeForwardedTo(typeof(OptionsMenuInputTab))] [assembly: TypeForwardedTo(typeof(OptionsMenuVideoTab))] [assembly: TypeForwardedTo(typeof(OptionsSliderButton))] [assembly: TypeForwardedTo(typeof(OutfitSwappableCharacter))] [assembly: TypeForwardedTo(typeof(OutfitSwitchBehaviour))] [assembly: TypeForwardedTo(typeof(OutfitSwitchClip))] [assembly: TypeForwardedTo(typeof(OutfitSwitchMenu))] [assembly: TypeForwardedTo(typeof(OutfitSwitchTrack))] [assembly: TypeForwardedTo(typeof(OutfitUnlockable))] [assembly: TypeForwardedTo(typeof(Overlay))] [assembly: TypeForwardedTo(typeof(PauseMenu))] [assembly: TypeForwardedTo(typeof(PauseType))] [assembly: TypeForwardedTo(typeof(Pedestrian))] [assembly: TypeForwardedTo(typeof(PhonePictureData))] [assembly: TypeForwardedTo(typeof(PhotoAchievementTracker))] [assembly: TypeForwardedTo(typeof(PhotoButton))] [assembly: TypeForwardedTo(typeof(PhotoEvent))] [assembly: TypeForwardedTo(typeof(PhotoObjectiveProgressable))] [assembly: TypeForwardedTo(typeof(PhotoObjectProgress))] [assembly: TypeForwardedTo(typeof(PhotosAlbumMenu))] [assembly: TypeForwardedTo(typeof(PhotosManager))] [assembly: TypeForwardedTo(typeof(PhotoStats))] [assembly: TypeForwardedTo(typeof(PhotoViewScrollArea))] [assembly: TypeForwardedTo(typeof(Pickup))] [assembly: TypeForwardedTo(typeof(PlatformData))] [assembly: TypeForwardedTo(typeof(PlatformLanguages))] [assembly: TypeForwardedTo(typeof(PlatformSteam))] [assembly: TypeForwardedTo(typeof(PlayAudioOnEnable))] [assembly: TypeForwardedTo(typeof(Player))] [assembly: TypeForwardedTo(typeof(PlayerAchievements))] [assembly: TypeForwardedTo(typeof(PlayerAI))] [assembly: TypeForwardedTo(typeof(PlayerAIPath))] [assembly: TypeForwardedTo(typeof(PlayerAIWaypoint))] [assembly: TypeForwardedTo(typeof(PlayerCuff))] [assembly: TypeForwardedTo(typeof(PlayerIK))] [assembly: TypeForwardedTo(typeof(PlayerLogInputThing))] [assembly: TypeForwardedTo(typeof(PlayerMoveStyleProps))] [assembly: TypeForwardedTo(typeof(PlayerPhoneCameras))] [assembly: TypeForwardedTo(typeof(PlayerSpawner))] [assembly: TypeForwardedTo(typeof(PlayerStats))] [assembly: TypeForwardedTo(typeof(PlayerType))] [assembly: TypeForwardedTo(typeof(PlayerVisualEffects))] [assembly: TypeForwardedTo(typeof(Playlist))] [assembly: TypeForwardedTo(typeof(PlayListDictionary))] [assembly: TypeForwardedTo(typeof(PlaylistID))] [assembly: TypeForwardedTo(typeof(PlaylistIDComparer))] [assembly: TypeForwardedTo(typeof(PlaystationFiveBootstrap))] [assembly: TypeForwardedTo(typeof(PoliceCaptainIrene))] [assembly: TypeForwardedTo(typeof(PoliceCaptainIreneAnimInfo))] [assembly: TypeForwardedTo(typeof(PoliceCaptainSniper))] [assembly: TypeForwardedTo(typeof(PoliceCutscenes))] [assembly: TypeForwardedTo(typeof(PoliceTubeSpawner))] [assembly: TypeForwardedTo(typeof(PoliceWall))] [assembly: TypeForwardedTo(typeof(PoolableInstantiator))] [assembly: TypeForwardedTo(typeof(PoolableObjectToName))] [assembly: TypeForwardedTo(typeof(PoolableParticleEffects))] [assembly: TypeForwardedTo(typeof(PoolableState))] [assembly: TypeForwardedTo(typeof(PostProssesing))] [assembly: TypeForwardedTo(typeof(PreludeMusicStopper))] [assembly: TypeForwardedTo(typeof(ProgressableData))] [assembly: TypeForwardedTo(typeof(ProgressableDataFactory))] [assembly: TypeForwardedTo(typeof(ProgressableType))] [assembly: TypeForwardedTo(typeof(ProgressObject))] [assembly: TypeForwardedTo(typeof(Projectile))] [assembly: TypeForwardedTo(typeof(PromptButton))] [assembly: TypeForwardedTo(typeof(ProximityMine))] [assembly: TypeForwardedTo(typeof(PseudoGraffitiAbility))] [assembly: TypeForwardedTo(typeof(PublicToilet))] [assembly: TypeForwardedTo(typeof(QuickTurnAbility))] [assembly: TypeForwardedTo(typeof(RaceEncounter))] [assembly: TypeForwardedTo(typeof(RailRider))] [assembly: TypeForwardedTo(typeof(RailRiderLauncher))] [assembly: TypeForwardedTo(typeof(RateLimitWatcher))] [assembly: TypeForwardedTo(typeof(RawDataSerializer))] [assembly: TypeForwardedTo(typeof(RaycastGroundDetection))] [assembly: TypeForwardedTo(typeof(RecoverAbility))] [assembly: TypeForwardedTo(typeof(RegexGameTextFormatter))] [assembly: TypeForwardedTo(typeof(RegularErrorHandler))] [assembly: TypeForwardedTo(typeof(RenameFileTransaction))] [assembly: TypeForwardedTo(typeof(RestrictedArea))] [assembly: TypeForwardedTo(typeof(RewiredControllerGuidHandler))] [assembly: TypeForwardedTo(typeof(RewiredControllerHandler))] [assembly: TypeForwardedTo(typeof(RewiredInputUIActionBinder))] [assembly: TypeForwardedTo(typeof(RewiredMappingHandler))] [assembly: TypeForwardedTo(typeof(RewiredPlayerId))] [assembly: TypeForwardedTo(typeof(RewiredRemappingHandler))] [assembly: TypeForwardedTo(typeof(RewiredStructUtility))] [assembly: TypeForwardedTo(typeof(RewiredUtility))] [assembly: TypeForwardedTo(typeof(RigidbodyMoveAlongHandler))] [assembly: TypeForwardedTo(typeof(RotateObject))] [assembly: TypeForwardedTo(typeof(RuntimeHelper))] [assembly: TypeForwardedTo(typeof(SafeLocation))] [assembly: TypeForwardedTo(typeof(SaveDataUtility))] [assembly: TypeForwardedTo(typeof(SaveManager))] [assembly: TypeForwardedTo(typeof(SaveSettingsData))] [assembly: TypeForwardedTo(typeof(SaveSlotData))] [assembly: TypeForwardedTo(typeof(SaveSlotHandler))] [assembly: TypeForwardedTo(typeof(SaveSlotMenu))] [assembly: TypeForwardedTo(typeof(SaveTransaction<>))] [assembly: TypeForwardedTo(typeof(SceneExtensions))] [assembly: TypeForwardedTo(typeof(SceneInspector))] [assembly: TypeForwardedTo(typeof(SceneLibrary))] [assembly: TypeForwardedTo(typeof(SceneLoader))] [assembly: TypeForwardedTo(typeof(SceneObjectsRegister))] [assembly: TypeForwardedTo(typeof(ScoreEncounter))] [assembly: TypeForwardedTo(typeof(ScreenShakeType))] [assembly: TypeForwardedTo(typeof(SelectEnlargeButton))] [assembly: TypeForwardedTo(typeof(SequenceHandler))] [assembly: TypeForwardedTo(typeof(SequenceState))] [assembly: TypeForwardedTo(typeof(SerializableDictionary<, >))] [assembly: TypeForwardedTo(typeof(SerializedLibraryUtility))] [assembly: TypeForwardedTo(typeof(setclearflag))] [assembly: TypeForwardedTo(typeof(SettingsData))] [assembly: TypeForwardedTo(typeof(SettingsMultiOptionsUI))] [assembly: TypeForwardedTo(typeof(SettingsSliderUI))] [assembly: TypeForwardedTo(typeof(SfxApplyAttribute))] [assembly: TypeForwardedTo(typeof(SfxClip))] [assembly: TypeForwardedTo(typeof(SfxCollection))] [assembly: TypeForwardedTo(typeof(SfxCollectionDictionary))] [assembly: TypeForwardedTo(typeof(SfxCollectionID))] [assembly: TypeForwardedTo(typeof(SfxCollectionLoader))] [assembly: TypeForwardedTo(typeof(SfxCollectionPickerAttribute))] [assembly: TypeForwardedTo(typeof(SfxLibrary))] [assembly: TypeForwardedTo(typeof(SfxTimelineClip))] [assembly: TypeForwardedTo(typeof(ShieldCop))] [assembly: TypeForwardedTo(typeof(ShieldCopAnimInfo))] [assembly: TypeForwardedTo(typeof(ShuffleIndexQueue))] [assembly: TypeForwardedTo(typeof(Side))] [assembly: TypeForwardedTo(typeof(SinglePathMoveAlongHandler))] [assembly: TypeForwardedTo(typeof(SitAbility))] [assembly: TypeForwardedTo(typeof(SkateboardScrewPole))] [assembly: TypeForwardedTo(typeof(SkyboxRotate))] [assembly: TypeForwardedTo(typeof(SlideAbility))] [assembly: TypeForwardedTo(typeof(SlideButton))] [assembly: TypeForwardedTo(typeof(SnakeBossAnimationEventRelay))] [assembly: TypeForwardedTo(typeof(SnakeBossAnimInfo))] [assembly: TypeForwardedTo(typeof(SnakeBossChestImpactReceiver))] [assembly: TypeForwardedTo(typeof(SnakeBossNEW))] [assembly: TypeForwardedTo(typeof(SniperCop))] [assembly: TypeForwardedTo(typeof(SniperCopAnimInfo))] [assembly: TypeForwardedTo(typeof(SoloMoveAlongUpdater))] [assembly: TypeForwardedTo(typeof(SpecialAirAbility))] [assembly: TypeForwardedTo(typeof(SphereGroundDetection))] [assembly: TypeForwardedTo(typeof(SplashScreen))] [assembly: TypeForwardedTo(typeof(SplineBasedGrindLineGenerator))] [assembly: TypeForwardedTo(typeof(Stage))] [assembly: TypeForwardedTo(typeof(StageAchievements))] [assembly: TypeForwardedTo(typeof(StageAmbience))] [assembly: TypeForwardedTo(typeof(StageChunk))] [assembly: TypeForwardedTo(typeof(StageManager))] [assembly: TypeForwardedTo(typeof(StageProgress))] [assembly: TypeForwardedTo(typeof(StageTransition))] [assembly: TypeForwardedTo(typeof(StageTransitionProgress))] [assembly: TypeForwardedTo(typeof(StandbyAbility))] [assembly: TypeForwardedTo(typeof(StatTracker))] [assembly: TypeForwardedTo(typeof(StatTrackerInfo))] [assembly: TypeForwardedTo(typeof(StatTrackerMAX))] [assembly: TypeForwardedTo(typeof(StatTrackerMIN))] [assembly: TypeForwardedTo(typeof(StatTrackerREPLACE))] [assembly: TypeForwardedTo(typeof(StatTrackerSUM))] [assembly: TypeForwardedTo(typeof(Statusbar))] [assembly: TypeForwardedTo(typeof(SteamControllerGuidHandler))] [assembly: TypeForwardedTo(typeof(StorageSteam))] [assembly: TypeForwardedTo(typeof(Story))] [assembly: TypeForwardedTo(typeof(StoryBlinkAnimation))] [assembly: TypeForwardedTo(typeof(StoryManager))] [assembly: TypeForwardedTo(typeof(StoryObjectivePin))] [assembly: TypeForwardedTo(typeof(StreetLife))] [assembly: TypeForwardedTo(typeof(StreetLifeBehaviour))] [assembly: TypeForwardedTo(typeof(StreetLifeCluster))] [assembly: TypeForwardedTo(typeof(StreetLifeHot))] [assembly: TypeForwardedTo(typeof(StringExtensions))] [assembly: TypeForwardedTo(typeof(StyleSwitchBehaviour))] [assembly: TypeForwardedTo(typeof(StyleSwitchClip))] [assembly: TypeForwardedTo(typeof(StyleSwitchMenu))] [assembly: TypeForwardedTo(typeof(StyleSwitchResetTexture))] [assembly: TypeForwardedTo(typeof(StyleSwitchTrack))] [assembly: TypeForwardedTo(typeof(SunFlareGPU))] [assembly: TypeForwardedTo(typeof(SunGlare))] [assembly: TypeForwardedTo(typeof(SwirlSkyUpdater))] [assembly: TypeForwardedTo(typeof(SwitchCorruptedDataLoadError))] [assembly: TypeForwardedTo(typeof(SwitchCorruptedDataSaveError))] [assembly: TypeForwardedTo(typeof(SwitchCorruptedSaveSlotLoadError))] [assembly: TypeForwardedTo(typeof(SwitchErrorHandler))] [assembly: TypeForwardedTo(typeof(SwitchMoveStyleAbility))] [assembly: TypeForwardedTo(typeof(SwitchStageInstruction))] [assembly: TypeForwardedTo(typeof(SystemLanguageUtility))] [assembly: TypeForwardedTo(typeof(Tags))] [assembly: TypeForwardedTo(typeof(TalkAbility))] [assembly: TypeForwardedTo(typeof(TalkIcon))] [assembly: TypeForwardedTo(typeof(Tankwalker))] [assembly: TypeForwardedTo(typeof(TankwalkerAnimInfo))] [assembly: TypeForwardedTo(typeof(TargetVisual))] [assembly: TypeForwardedTo(typeof(Taxi))] [assembly: TypeForwardedTo(typeof(TaxiBehaviour))] [assembly: TypeForwardedTo(typeof(TaxiClip))] [assembly: TypeForwardedTo(typeof(TaxiTrack))] [assembly: TypeForwardedTo(typeof(TaxiUI))] [assembly: TypeForwardedTo(typeof(Teleport))] [assembly: TypeForwardedTo(typeof(TextMeshProBoldFormatter))] [assembly: TypeForwardedTo(typeof(TextMeshProButtonGlyphFormatter))] [assembly: TypeForwardedTo(typeof(TextMeshProButtonSpriteHandler))] [assembly: TypeForwardedTo(typeof(TextMeshProFont))] [assembly: TypeForwardedTo(typeof(TextMeshProGameTextLocalizer))] [assembly: TypeForwardedTo(typeof(TextMeshProHighlightFormatter))] [assembly: TypeForwardedTo(typeof(TextMeshProMenuButton))] [assembly: TypeForwardedTo(typeof(TextMeshProMenuButtonFont))] [assembly: TypeForwardedTo(typeof(TextMeshProNormalFormatter))] [assembly: TypeForwardedTo(typeof(TextMeshProSlider))] [assembly: TypeForwardedTo(typeof(TMProFontLocalizer))] [assembly: TypeForwardedTo(typeof(TMProLocalizationAddOn))] [assembly: TypeForwardedTo(typeof(TrackerType))] [assembly: TypeForwardedTo(typeof(TransactionsYieldInstruction))] [assembly: TypeForwardedTo(typeof(TransactionYieldInstruction))] [assembly: TypeForwardedTo(typeof(TransformExtentions))] [assembly: TypeForwardedTo(typeof(TransformMoveAlongHandler))] [assembly: TypeForwardedTo(typeof(TRInputId))] [assembly: TypeForwardedTo(typeof(TurretEnemy))] [assembly: TypeForwardedTo(typeof(TurretSpawner))] [assembly: TypeForwardedTo(typeof(UIAnimationController))] [assembly: TypeForwardedTo(typeof(UIButtonGlyphComponent))] [assembly: TypeForwardedTo(typeof(UILocalizationUtility))] [assembly: TypeForwardedTo(typeof(UIManager))] [assembly: TypeForwardedTo(typeof(UIPopup))] [assembly: TypeForwardedTo(typeof(UIPrompt))] [assembly: TypeForwardedTo(typeof(UnloadSceneInstruction))] [assembly: TypeForwardedTo(typeof(UnloadStageASyncInstruction))] [assembly: TypeForwardedTo(typeof(UnlockableSaveData))] [assembly: TypeForwardedTo(typeof(UpdateGraffitiOnOtherJuggledEnemies))] [assembly: TypeForwardedTo(typeof(UserAchievementsCacheLoader))] [assembly: TypeForwardedTo(typeof(UserIdSteam))] [assembly: TypeForwardedTo(typeof(UserInputHandler))] [assembly: TypeForwardedTo(typeof(UserPhotosDataLoader))] [assembly: TypeForwardedTo(typeof(UserPlayerStatsLoader))] [assembly: TypeForwardedTo(typeof(UserSaveSlotSaveDataLoader))] [assembly: TypeForwardedTo(typeof(UserSaveSlotSettingsDataLoader))] [assembly: TypeForwardedTo(typeof(UserSettingsSaveDataLoader))] [assembly: TypeForwardedTo(typeof(UserStatusHandler))] [assembly: TypeForwardedTo(typeof(UserSteam))] [assembly: TypeForwardedTo(typeof(Utility))] [assembly: TypeForwardedTo(typeof(VendingMachine))] [assembly: TypeForwardedTo(typeof(VersionUIHandler))] [assembly: TypeForwardedTo(typeof(VertAbility))] [assembly: TypeForwardedTo(typeof(VertexCache))] [assembly: TypeForwardedTo(typeof(VertShape))] [assembly: TypeForwardedTo(typeof(VideoSettings))] [assembly: TypeForwardedTo(typeof(VideoSettingsManager))] [assembly: TypeForwardedTo(typeof(VoicePriority))] [assembly: TypeForwardedTo(typeof(VoiceSfxTimelineClip))] [assembly: TypeForwardedTo(typeof(WallrunLine))] [assembly: TypeForwardedTo(typeof(WallrunLineAbility))] [assembly: TypeForwardedTo(typeof(WantedManager))] [assembly: TypeForwardedTo(typeof(WatermarkInitializer))] [assembly: TypeForwardedTo(typeof(WorldHandler))] [assembly: TypeForwardedTo(typeof(XmlHelper))] [assembly: TypeForwardedTo(typeof(YesNoButton))] [assembly: TypeForwardedTo(typeof(YesNoPanel))] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace MapStation.Tools { public static class PluginInfo { public const string PLUGIN_GUID = "MapStation.Tools"; public const string PLUGIN_NAME = "MapStation.Tools"; public const string PLUGIN_VERSION = "1.0.0"; } } namespace MapStation.TypeForwarder.Dependencies { public class AssemblyDependencies { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }
System.IO.Compression.dll
Decompiled 3 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Buffers; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Globalization; using System.IO.Compression; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Win32.SafeHandles; using Unity; [assembly: CLSCompliant(true)] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("System.IO.Compression.dll")] [assembly: AssemblyDefaultAlias("System.IO.Compression.dll")] [assembly: AssemblyDescription("System.IO.Compression.dll")] [assembly: AssemblyCompany("Mono development team")] [assembly: AssemblyProduct("Mono Common Language Infrastructure")] [assembly: AssemblyCopyright("(c) Various Mono authors")] [assembly: AssemblyInformationalVersion("4.6.57.0")] [assembly: AssemblyFileVersion("4.6.57.0")] [assembly: AssemblyDelaySign(true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("4.0.0.0")] [assembly: TypeForwardedTo(typeof(CompressionLevel))] [assembly: TypeForwardedTo(typeof(CompressionMode))] [assembly: TypeForwardedTo(typeof(DeflateStream))] [assembly: TypeForwardedTo(typeof(GZipStream))] [module: UnverifiableCode] internal static class Interop { internal static class Brotli { [DllImport("__Internal")] internal static extern SafeBrotliDecoderHandle BrotliDecoderCreateInstance(IntPtr allocFunc, IntPtr freeFunc, IntPtr opaque); [DllImport("__Internal")] internal unsafe static extern int BrotliDecoderDecompressStream(SafeBrotliDecoderHandle state, ref IntPtr availableIn, byte** nextIn, ref IntPtr availableOut, byte** nextOut, out IntPtr totalOut); [DllImport("__Internal")] internal unsafe static extern bool BrotliDecoderDecompress(IntPtr availableInput, byte* inBytes, ref IntPtr availableOutput, byte* outBytes); [DllImport("__Internal")] internal static extern void BrotliDecoderDestroyInstance(IntPtr state); [DllImport("__Internal")] internal static extern bool BrotliDecoderIsFinished(SafeBrotliDecoderHandle state); [DllImport("__Internal")] internal static extern SafeBrotliEncoderHandle BrotliEncoderCreateInstance(IntPtr allocFunc, IntPtr freeFunc, IntPtr opaque); [DllImport("__Internal")] internal static extern bool BrotliEncoderSetParameter(SafeBrotliEncoderHandle state, BrotliEncoderParameter parameter, uint value); [DllImport("__Internal")] internal unsafe static extern bool BrotliEncoderCompressStream(SafeBrotliEncoderHandle state, BrotliEncoderOperation op, ref IntPtr availableIn, byte** nextIn, ref IntPtr availableOut, byte** nextOut, out IntPtr totalOut); [DllImport("__Internal")] internal static extern bool BrotliEncoderHasMoreOutput(SafeBrotliEncoderHandle state); [DllImport("__Internal")] internal static extern void BrotliEncoderDestroyInstance(IntPtr state); [DllImport("__Internal")] internal unsafe static extern bool BrotliEncoderCompress(int quality, int window, int v, IntPtr availableInput, byte* inBytes, ref IntPtr availableOutput, byte* outBytes); } internal static class Libraries { internal const string CompressionNative = "__Internal"; } } internal static class Consts { public const string MonoCorlibVersion = "1A5E0066-58DC-428A-B21C-0AD6CDAE2789"; public const string MonoVersion = "6.13.0.0"; public const string MonoCompany = "Mono development team"; public const string MonoProduct = "Mono Common Language Infrastructure"; public const string MonoCopyright = "(c) Various Mono authors"; public const string FxVersion = "4.0.0.0"; public const string FxFileVersion = "4.6.57.0"; public const string EnvironmentVersion = "4.0.30319.42000"; public const string VsVersion = "0.0.0.0"; public const string VsFileVersion = "11.0.0.0"; private const string PublicKeyToken = "b77a5c561934e089"; public const string AssemblyI18N = "I18N, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMicrosoft_JScript = "Microsoft.JScript, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMono_Http = "Mono.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Posix = "Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Security = "Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyCorlib = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem = "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Data = "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Design = "System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing = "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Messaging = "System.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Security = "System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Web = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_2_0 = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystemCore_3_5 = "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Core = "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string WindowsBase_3_0 = "WindowsBase, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyWindowsBase = "WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_3_5 = "PresentationCore, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_4_0 = "PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationFramework_3_5 = "PresentationFramework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblySystemServiceModel_3_0 = "System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; } internal static class SR { public const string ArgumentOutOfRange_Enum = "Enum value was out of legal range."; public const string ArgumentOutOfRange_NeedPosNum = "Positive number required."; public const string CannotReadFromDeflateStream = "Reading from the compression stream is not supported."; public const string CannotWriteToDeflateStream = "Writing to the compression stream is not supported."; public const string GenericInvalidData = "Found invalid data while decoding."; public const string InvalidArgumentOffsetCount = "Offset plus count is larger than the length of target array."; public const string InvalidBeginCall = "Only one asynchronous reader or writer is allowed time at one time."; public const string InvalidBlockLength = "Block length does not match with its complement."; public const string InvalidHuffmanData = "Failed to construct a huffman tree using the length array. The stream might be corrupted."; public const string NotSupported = "This operation is not supported."; public const string NotSupported_UnreadableStream = "Stream does not support reading."; public const string NotSupported_UnwritableStream = "Stream does not support writing."; public const string ObjectDisposed_StreamClosed = "Can not access a closed Stream."; public const string UnknownBlockType = "Unknown block type. Stream might be corrupted."; public const string UnknownState = "Decoder is in some unknown state. This might be caused by corrupted data."; public const string ZLibErrorDLLLoadError = "The underlying compression routine could not be loaded correctly."; public const string ZLibErrorInconsistentStream = "The stream state of the underlying compression routine is inconsistent."; public const string ZLibErrorIncorrectInitParameters = "The underlying compression routine received incorrect initialization parameters."; public const string ZLibErrorNotEnoughMemory = "The underlying compression routine could not reserve sufficient memory."; public const string ZLibErrorVersionMismatch = "The version of the underlying compression routine does not match expected version."; public const string ZLibErrorUnexpected = "The underlying compression routine returned an unexpected error code."; public const string ArgumentNeedNonNegative = "The argument must be non-negative."; public const string CannotBeEmpty = "String cannot be empty."; public const string CDCorrupt = "Central Directory corrupt."; public const string CentralDirectoryInvalid = "Central Directory is invalid."; public const string CreateInReadMode = "Cannot create entries on an archive opened in read mode."; public const string CreateModeCapabilities = "Cannot use create mode on a non-writable stream."; public const string CreateModeCreateEntryWhileOpen = "Entries cannot be created while previously created entries are still open."; public const string CreateModeWriteOnceAndOneEntryAtATime = "Entries in create mode may only be written to once, and only one entry may be held open at a time."; public const string DateTimeOutOfRange = "The DateTimeOffset specified cannot be converted into a Zip file timestamp."; public const string DeletedEntry = "Cannot modify deleted entry."; public const string DeleteOnlyInUpdate = "Delete can only be used when the archive is in Update mode."; public const string DeleteOpenEntry = "Cannot delete an entry currently open for writing."; public const string EntriesInCreateMode = "Cannot access entries in Create mode."; public const string EntryNameEncodingNotSupported = "The specified entry name encoding is not supported."; public const string EntryNamesTooLong = "Entry names cannot require more than 2^16 bits."; public const string EntryTooLarge = "Entries larger than 4GB are not supported in Update mode."; public const string EOCDNotFound = "End of Central Directory record could not be found."; public const string FieldTooBigCompressedSize = "Compressed Size cannot be held in an Int64."; public const string FieldTooBigLocalHeaderOffset = "Local Header Offset cannot be held in an Int64."; public const string FieldTooBigNumEntries = "Number of Entries cannot be held in an Int64."; public const string FieldTooBigOffsetToCD = "Offset to Central Directory cannot be held in an Int64."; public const string FieldTooBigOffsetToZip64EOCD = "Offset to Zip64 End Of Central Directory record cannot be held in an Int64."; public const string FieldTooBigStartDiskNumber = "Start Disk Number cannot be held in an Int64."; public const string FieldTooBigUncompressedSize = "Uncompressed Size cannot be held in an Int64."; public const string FrozenAfterWrite = "Cannot modify entry in Create mode after entry has been opened for writing."; public const string HiddenStreamName = "A stream from ZipArchiveEntry has been disposed."; public const string LengthAfterWrite = "Length properties are unavailable once an entry has been opened for writing."; public const string LocalFileHeaderCorrupt = "A local file header is corrupt."; public const string NumEntriesWrong = "Number of entries expected in End Of Central Directory does not correspond to number of entries in Central Directory."; public const string OffsetLengthInvalid = "The offset and length parameters are not valid for the array that was given."; public const string ReadingNotSupported = "This stream from ZipArchiveEntry does not support reading."; public const string ReadModeCapabilities = "Cannot use read mode on a non-readable stream."; public const string ReadOnlyArchive = "Cannot modify read-only archive."; public const string SeekingNotSupported = "This stream from ZipArchiveEntry does not support seeking."; public const string SetLengthRequiresSeekingAndWriting = "SetLength requires a stream that supports seeking and writing."; public const string SplitSpanned = "Split or spanned archives are not supported."; public const string UnexpectedEndOfStream = "Zip file corrupt: unexpected end of stream reached."; public const string UnsupportedCompression = "The archive entry was compressed using an unsupported compression method."; public const string UnsupportedCompressionMethod = "The archive entry was compressed using {0} and is not supported."; public const string UpdateModeCapabilities = "Update mode requires a stream with read, write, and seek capabilities."; public const string UpdateModeOneStream = "Entries cannot be opened multiple times in Update mode."; public const string WritingNotSupported = "This stream from ZipArchiveEntry does not support writing."; public const string Zip64EOCDNotWhereExpected = "Zip 64 End of Central Directory Record not where indicated."; public const string Argument_InvalidPathChars = "Illegal characters in path '{0}'."; public const string Stream_FalseCanRead = "Stream does not support reading."; public const string Stream_FalseCanWrite = "Stream does not support writing."; public const string BrotliEncoder_Create = "Failed to create BrotliEncoder instance"; public const string BrotliEncoder_Disposed = "Can not access a closed Encoder."; public const string BrotliEncoder_Quality = "Provided BrotliEncoder Quality of {0} is not between the minimum value of {1} and the maximum value of {2}"; public const string BrotliEncoder_Window = "Provided BrotliEncoder Window of {0} is not between the minimum value of {1} and the maximum value of {2}"; public const string BrotliEncoder_InvalidSetParameter = "The BrotliEncoder {0} can not be changed at current encoder state."; public const string BrotliDecoder_Create = "Failed to create BrotliDecoder instance"; public const string BrotliDecoder_Error = "Decoder threw unexpected error: {0}"; public const string BrotliDecoder_Disposed = "Can not access a closed Decoder."; public const string BrotliStream_Compress_UnsupportedOperation = "Can not perform Read operations on a BrotliStream constructed with CompressionMode.Compress."; public const string BrotliStream_Compress_InvalidData = "Encoder ran into invalid data."; public const string BrotliStream_Decompress_UnsupportedOperation = "Can not perform Write operations on a BrotliStream constructed with CompressionMode.Decompress."; public const string BrotliStream_Decompress_InvalidData = "Decoder ran into invalid data."; public const string BrotliStream_Decompress_InvalidStream = "BrotliStream.BaseStream returned more bytes than requested in Read."; internal static string GetString(string name, params object[] args) { return GetString(CultureInfo.InvariantCulture, name, args); } internal static string GetString(CultureInfo culture, string name, params object[] args) { return string.Format(culture, name, args); } internal static string GetString(string name) { return name; } internal static string GetString(CultureInfo culture, string name) { return name; } internal static string Format(string resourceFormat, params object[] args) { if (args != null) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, args); } return resourceFormat; } internal static string Format(string resourceFormat, object p1) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, p1); } internal static string Format(string resourceFormat, object p1, object p2) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, p1, p2); } internal static string Format(CultureInfo ci, string resourceFormat, object p1, object p2) { return string.Format(ci, resourceFormat, p1, p2); } internal static string Format(string resourceFormat, object p1, object p2, object p3) { return string.Format(CultureInfo.InvariantCulture, resourceFormat, p1, p2, p3); } internal static string GetResourceString(string str) { return str; } } namespace System.Runtime.CompilerServices { internal class FriendAccessAllowedAttribute : Attribute { } } namespace System.IO.Compression { public sealed class BrotliStream : Stream { [StructLayout(LayoutKind.Auto)] [CompilerGenerated] private struct <FinishReadAsyncMemory>d__41 : IAsyncStateMachine { public int <>1__state; public AsyncValueTaskMethodBuilder<int> <>t__builder; public BrotliStream <>4__this; public CancellationToken cancellationToken; public Memory<byte> buffer; private int <totalWritten>5__2; private ConfiguredValueTaskAwaiter<int> <>u__1; private void MoveNext() { //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Invalid comparison between Unknown and I4 //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Invalid comparison between Unknown and I4 //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; BrotliStream brotliStream = <>4__this; int result; try { if (num != 0) { brotliStream.AsyncOperationStarting(); } try { OperationStatus val; if (num != 0) { <totalWritten>5__2 = 0; _ = Memory<byte>.Empty; val = (OperationStatus)1; goto IL_0215; } ConfiguredValueTaskAwaiter<int> awaiter = <>u__1; <>u__1 = default(ConfiguredValueTaskAwaiter<int>); num = (<>1__state = -1); goto IL_0158; IL_0215: int num2; if (buffer.Length > 0 && (int)val != 0) { if ((int)val == 2) { if (brotliStream._bufferCount > 0 && brotliStream._bufferOffset != 0) { MemoryExtensions.AsSpan<byte>(brotliStream._buffer, brotliStream._bufferOffset, brotliStream._bufferCount).CopyTo(Span<byte>.op_Implicit(brotliStream._buffer)); } brotliStream._bufferOffset = 0; num2 = 0; goto IL_00ab; } goto IL_017a; } goto IL_0229; IL_00ab: bool flag = brotliStream._bufferCount < brotliStream._buffer.Length; if (flag) { awaiter = brotliStream._stream.ReadAsync(new Memory<byte>(brotliStream._buffer, brotliStream._bufferCount, brotliStream._buffer.Length - brotliStream._bufferCount), default(CancellationToken)).ConfigureAwait(false).GetAwaiter(); if (!awaiter.IsCompleted) { num = (<>1__state = 0); <>u__1 = awaiter; <>t__builder.AwaitUnsafeOnCompleted<ConfiguredValueTaskAwaiter<int>, <FinishReadAsyncMemory>d__41>(ref awaiter, ref this); return; } goto IL_0158; } goto IL_0167; IL_0158: flag = (num2 = awaiter.GetResult()) > 0; goto IL_0167; IL_0167: if (flag) { brotliStream._bufferCount += num2; if (brotliStream._bufferCount > brotliStream._buffer.Length) { throw new InvalidDataException("BrotliStream.BaseStream returned more bytes than requested in Read."); } goto IL_00ab; } if (brotliStream._bufferCount > 0) { goto IL_017a; } goto IL_0229; IL_0229: result = <totalWritten>5__2; goto end_IL_0018; IL_017a: cancellationToken.ThrowIfCancellationRequested(); val = brotliStream._decoder.Decompress(Span<byte>.op_Implicit(MemoryExtensions.AsSpan<byte>(brotliStream._buffer, brotliStream._bufferOffset, brotliStream._bufferCount)), buffer.Span, out var bytesConsumed, out var bytesWritten); if ((int)val == 3) { throw new InvalidOperationException("Decoder ran into invalid data."); } if (bytesConsumed > 0) { brotliStream._bufferOffset += bytesConsumed; brotliStream._bufferCount -= bytesConsumed; } if (bytesWritten > 0) { <totalWritten>5__2 += bytesWritten; buffer = buffer.Slice(bytesWritten); } goto IL_0215; end_IL_0018:; } finally { if (num < 0) { brotliStream.AsyncOperationCompleting(); } } } catch (Exception exception) { <>1__state = -2; <>t__builder.SetException(exception); return; } <>1__state = -2; <>t__builder.SetResult(result); } void IAsyncStateMachine.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext this.MoveNext(); } [DebuggerHidden] private void SetStateMachine(IAsyncStateMachine stateMachine) { <>t__builder.SetStateMachine(stateMachine); } void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine) { //ILSpy generated this explicit interface implementation from .override directive in SetStateMachine this.SetStateMachine(stateMachine); } } private const int DefaultInternalBufferSize = 65520; private Stream _stream; private readonly byte[] _buffer; private readonly bool _leaveOpen; private readonly CompressionMode _mode; private int _activeAsyncOperation; private BrotliDecoder _decoder; private int _bufferOffset; private int _bufferCount; private BrotliEncoder _encoder; public Stream BaseStream => _stream; public override bool CanRead { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)_mode == 0 && _stream != null) { return _stream.CanRead; } return false; } } public override bool CanWrite { get { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)_mode == 1 && _stream != null) { return _stream.CanWrite; } return false; } } public override bool CanSeek => false; public override long Length { get { throw new NotSupportedException(); } } public override long Position { get { throw new NotSupportedException(); } set { throw new NotSupportedException(); } } private bool AsyncOperationIsActive => _activeAsyncOperation != 0; public BrotliStream(Stream stream, CompressionMode mode) : this(stream, mode, leaveOpen: false) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public BrotliStream(Stream stream, CompressionMode mode, bool leaveOpen) { //IL_0014: 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_0019: Invalid comparison between Unknown and I4 //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) if (stream == null) { throw new ArgumentNullException("stream"); } if ((int)mode != 0) { if ((int)mode != 1) { throw new ArgumentException("Enum value was out of legal range.", "mode"); } if (!stream.CanWrite) { throw new ArgumentException("Stream does not support writing.", "stream"); } } else if (!stream.CanRead) { throw new ArgumentException("Stream does not support reading.", "stream"); } _mode = mode; _stream = stream; _leaveOpen = leaveOpen; _buffer = new byte[65520]; } private void EnsureNotDisposed() { if (_stream == null) { throw new ObjectDisposedException("stream", "Can not access a closed Stream."); } } protected override void Dispose(bool disposing) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Invalid comparison between Unknown and I4 //IL_0015: Unknown result type (might be due to invalid IL or missing references) try { if (disposing && _stream != null) { if ((int)_mode == 1) { WriteCore(ReadOnlySpan<byte>.Empty, isFinalBlock: true); } if (!_leaveOpen) { _stream.Dispose(); } } } finally { _stream = null; _encoder.Dispose(); _decoder.Dispose(); base.Dispose(disposing); } } private static void ValidateParameters(byte[] array, int offset, int count) { if (array == null) { throw new ArgumentNullException("array"); } if (offset < 0) { throw new ArgumentOutOfRangeException("offset", "Positive number required."); } if (count < 0) { throw new ArgumentOutOfRangeException("count", "Positive number required."); } if (array.Length - offset < count) { throw new ArgumentException("Offset plus count is larger than the length of target array."); } } public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException(); } public override void SetLength(long value) { throw new NotSupportedException(); } private void EnsureNoActiveAsyncOperation() { if (AsyncOperationIsActive) { ThrowInvalidBeginCall(); } } private void AsyncOperationStarting() { if (Interlocked.CompareExchange(ref _activeAsyncOperation, 1, 0) != 0) { ThrowInvalidBeginCall(); } } private void AsyncOperationCompleting() { Interlocked.CompareExchange(ref _activeAsyncOperation, 0, 1); } private static void ThrowInvalidBeginCall() { throw new InvalidOperationException("Only one asynchronous reader or writer is allowed time at one time."); } public override int Read(byte[] buffer, int offset, int count) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ValidateParameters(buffer, offset, count); return ((Stream)this).Read(new Span<byte>(buffer, offset, count)); } public int Read(Span<byte> buffer) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Invalid comparison between Unknown and I4 //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Invalid comparison between Unknown and I4 //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) if ((int)_mode != 0) { throw new InvalidOperationException("Can not perform Read operations on a BrotliStream constructed with CompressionMode.Compress."); } EnsureNotDisposed(); int num = 0; OperationStatus val = (OperationStatus)1; while (buffer.Length > 0 && (int)val != 0) { if ((int)val == 2) { if (_bufferCount > 0 && _bufferOffset != 0) { MemoryExtensions.AsSpan<byte>(_buffer, _bufferOffset, _bufferCount).CopyTo(Span<byte>.op_Implicit(_buffer)); } _bufferOffset = 0; int num2 = 0; while (_bufferCount < _buffer.Length && (num2 = _stream.Read(_buffer, _bufferCount, _buffer.Length - _bufferCount)) > 0) { _bufferCount += num2; if (_bufferCount > _buffer.Length) { throw new InvalidDataException("BrotliStream.BaseStream returned more bytes than requested in Read."); } } if (_bufferCount <= 0) { break; } } val = _decoder.Decompress(Span<byte>.op_Implicit(MemoryExtensions.AsSpan<byte>(_buffer, _bufferOffset, _bufferCount)), buffer, out var bytesConsumed, out var bytesWritten); if ((int)val == 3) { throw new InvalidOperationException("Decoder ran into invalid data."); } if (bytesConsumed > 0) { _bufferOffset += bytesConsumed; _bufferCount -= bytesConsumed; } if (bytesWritten > 0) { num += bytesWritten; buffer = buffer.Slice(bytesWritten); } } return num; } public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState) { return System.Threading.Tasks.TaskToApm.Begin(ReadAsync(buffer, offset, count, CancellationToken.None), asyncCallback, asyncState); } public override int EndRead(IAsyncResult asyncResult) { return System.Threading.Tasks.TaskToApm.End<int>(asyncResult); } public override Task<int> ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) ValidateParameters(buffer, offset, count); return ((Stream)this).ReadAsync(new Memory<byte>(buffer, offset, count), cancellationToken).AsTask(); } public ValueTask<int> ReadAsync(Memory<byte> buffer, CancellationToken cancellationToken = default(CancellationToken)) { //IL_0001: 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_0037: 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) if ((int)_mode != 0) { throw new InvalidOperationException("Can not perform Read operations on a BrotliStream constructed with CompressionMode.Compress."); } EnsureNoActiveAsyncOperation(); EnsureNotDisposed(); if (cancellationToken.IsCancellationRequested) { return new ValueTask<int>(Task.FromCanceled<int>(cancellationToken)); } return FinishReadAsyncMemory(buffer, cancellationToken); } [AsyncStateMachine(typeof(<FinishReadAsyncMemory>d__41))] private ValueTask<int> FinishReadAsyncMemory(Memory<byte> buffer, CancellationToken cancellationToken) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //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_0041: Unknown result type (might be due to invalid IL or missing references) <FinishReadAsyncMemory>d__41 <FinishReadAsyncMemory>d__ = default(<FinishReadAsyncMemory>d__41); <FinishReadAsyncMemory>d__.<>4__this = this; <FinishReadAsyncMemory>d__.buffer = buffer; <FinishReadAsyncMemory>d__.cancellationToken = cancellationToken; <FinishReadAsyncMemory>d__.<>t__builder = AsyncValueTaskMethodBuilder<int>.Create(); <FinishReadAsyncMemory>d__.<>1__state = -1; <FinishReadAsyncMemory>d__.<>t__builder.Start<<FinishReadAsyncMemory>d__41>(ref <FinishReadAsyncMemory>d__); return <FinishReadAsyncMemory>d__.<>t__builder.Task; } public BrotliStream(Stream stream, CompressionLevel compressionLevel) : this(stream, compressionLevel, leaveOpen: false) { }//IL_0002: Unknown result type (might be due to invalid IL or missing references) public BrotliStream(Stream stream, CompressionLevel compressionLevel, bool leaveOpen) : this(stream, (CompressionMode)1, leaveOpen) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) _encoder.SetQuality(BrotliUtils.GetQualityFromCompressionLevel(compressionLevel)); } public override void Write(byte[] buffer, int offset, int count) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) ValidateParameters(buffer, offset, count); WriteCore(new ReadOnlySpan<byte>(buffer, offset, count)); } public void Write(ReadOnlySpan<byte> buffer) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) WriteCore(buffer); } internal void WriteCore(ReadOnlySpan<byte> buffer, bool isFinalBlock = false) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Invalid comparison between Unknown and I4 //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Invalid comparison between Unknown and I4 //IL_005f: 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_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) if ((int)_mode != 1) { throw new InvalidOperationException("Can not perform Write operations on a BrotliStream constructed with CompressionMode.Decompress."); } EnsureNotDisposed(); OperationStatus val = (OperationStatus)1; Span<byte> destination = default(Span<byte>); destination..ctor(_buffer); while ((int)val == 1) { int bytesConsumed = 0; int bytesWritten = 0; val = _encoder.Compress(buffer, destination, out bytesConsumed, out bytesWritten, isFinalBlock); if ((int)val == 3) { throw new InvalidOperationException("Encoder ran into invalid data."); } if (bytesWritten > 0) { _stream.Write(Span<byte>.op_Implicit(destination.Slice(0, bytesWritten))); } if (bytesConsumed > 0) { buffer = buffer.Slice(bytesConsumed); } } } public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState) { return System.Threading.Tasks.TaskToApm.Begin(WriteAsync(buffer, offset, count, CancellationToken.None), asyncCallback, asyncState); } public override void EndWrite(IAsyncResult asyncResult) { System.Threading.Tasks.TaskToApm.End(asyncResult); } public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) ValidateParameters(buffer, offset, count); ValueTask val = ((Stream)this).WriteAsync(new ReadOnlyMemory<byte>(buffer, offset, count), cancellationToken); return ((ValueTask)(ref val)).AsTask(); } public ValueTask WriteAsync(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken = default(CancellationToken)) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if ((int)_mode != 1) { throw new InvalidOperationException("Can not perform Write operations on a BrotliStream constructed with CompressionMode.Decompress."); } EnsureNoActiveAsyncOperation(); EnsureNotDisposed(); return new ValueTask(cancellationToken.IsCancellationRequested ? Task.FromCanceled<int>(cancellationToken) : WriteAsyncMemoryCore(buffer, cancellationToken)); } private async Task WriteAsyncMemoryCore(ReadOnlyMemory<byte> buffer, CancellationToken cancellationToken) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) AsyncOperationStarting(); try { OperationStatus lastResult = (OperationStatus)1; Memory<byte> destination = default(Memory<byte>); while ((int)lastResult == 1) { destination..ctor(_buffer); int bytesConsumed = 0; int bytesWritten = 0; lastResult = _encoder.Compress(buffer, destination, out bytesConsumed, out bytesWritten, isFinalBlock: false); if ((int)lastResult == 3) { throw new InvalidOperationException("Encoder ran into invalid data."); } if (bytesConsumed > 0) { buffer = buffer.Slice(bytesConsumed); } if (bytesWritten > 0) { ValueTask val = _stream.WriteAsync(new ReadOnlyMemory<byte>(_buffer, 0, bytesWritten), cancellationToken); await ((ValueTask)(ref val)).ConfigureAwait(false); } } } finally { AsyncOperationCompleting(); } } public override void Flush() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Invalid comparison between Unknown and I4 //IL_0048: 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_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Invalid comparison between Unknown and I4 //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) EnsureNotDisposed(); if ((int)_mode != 1 || _encoder._state == null || _encoder._state.IsClosed) { return; } OperationStatus val = (OperationStatus)1; Span<byte> destination = default(Span<byte>); destination..ctor(_buffer); while ((int)val == 1) { int bytesWritten = 0; val = _encoder.Flush(destination, out bytesWritten); if ((int)val == 3) { throw new InvalidDataException("Encoder ran into invalid data."); } if (bytesWritten > 0) { _stream.Write(Span<byte>.op_Implicit(destination.Slice(0, bytesWritten))); } } } public override Task FlushAsync(CancellationToken cancellationToken) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Invalid comparison between Unknown and I4 EnsureNoActiveAsyncOperation(); EnsureNotDisposed(); if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } if ((int)_mode == 1) { return FlushAsyncCore(cancellationToken); } return Task.CompletedTask; } private async Task FlushAsyncCore(CancellationToken cancellationToken) { AsyncOperationStarting(); try { if (_encoder._state == null || _encoder._state.IsClosed) { return; } OperationStatus lastResult = (OperationStatus)1; Memory<byte> destination = default(Memory<byte>); while ((int)lastResult == 1) { destination..ctor(_buffer); int bytesWritten = 0; lastResult = _encoder.Flush(destination, out bytesWritten); if ((int)lastResult == 3) { throw new InvalidDataException("Encoder ran into invalid data."); } if (bytesWritten > 0) { ValueTask val = _stream.WriteAsync(Memory<byte>.op_Implicit(destination.Slice(0, bytesWritten)), cancellationToken); await ((ValueTask)(ref val)).ConfigureAwait(false); } } } finally { AsyncOperationCompleting(); } } } internal static class BrotliUtils { public const int WindowBits_Min = 10; public const int WindowBits_Default = 22; public const int WindowBits_Max = 24; public const int Quality_Min = 0; public const int Quality_Default = 11; public const int Quality_Max = 11; public const int MaxInputSize = 2147483132; internal static int GetQualityFromCompressionLevel(CompressionLevel level) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected I4, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected I4, but got Unknown return (int)level switch { 0 => 11, 2 => 0, 1 => 1, _ => (int)level, }; } } public struct BrotliDecoder : IDisposable { private SafeBrotliDecoderHandle _state; private bool _disposed; internal void InitializeDecoder() { _state = global::Interop.Brotli.BrotliDecoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (_state.IsInvalid) { throw new IOException("Failed to create BrotliDecoder instance"); } } internal void EnsureInitialized() { EnsureNotDisposed(); if (_state == null) { InitializeDecoder(); } } public void Dispose() { _disposed = true; _state?.Dispose(); } private void EnsureNotDisposed() { if (_disposed) { throw new ObjectDisposedException("BrotliDecoder", "Can not access a closed Decoder."); } } public unsafe OperationStatus Decompress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesConsumed, out int bytesWritten) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) EnsureInitialized(); bytesConsumed = 0; bytesWritten = 0; if (!global::Interop.Brotli.BrotliDecoderIsFinished(_state)) { IntPtr availableOut = (IntPtr)destination.Length; IntPtr availableIn = (IntPtr)source.Length; while ((int)availableOut > 0) { fixed (byte* ptr = &MemoryMarshal.GetReference<byte>(source)) { fixed (byte* ptr3 = &MemoryMarshal.GetReference<byte>(destination)) { byte* ptr2 = ptr; byte* ptr4 = ptr3; IntPtr totalOut; int num = global::Interop.Brotli.BrotliDecoderDecompressStream(_state, ref availableIn, &ptr2, ref availableOut, &ptr4, out totalOut); if (num == 0) { return (OperationStatus)3; } bytesConsumed += source.Length - (int)availableIn; bytesWritten += destination.Length - (int)availableOut; switch (num) { case 1: return (OperationStatus)0; case 3: return (OperationStatus)1; } source = source.Slice(source.Length - (int)availableIn); destination = destination.Slice(destination.Length - (int)availableOut); if (num == 2 && source.Length == 0) { return (OperationStatus)2; } } } } return (OperationStatus)1; } return (OperationStatus)0; } public unsafe static bool TryDecompress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) fixed (byte* inBytes = &MemoryMarshal.GetReference<byte>(source)) { fixed (byte* outBytes = &MemoryMarshal.GetReference<byte>(destination)) { IntPtr availableOutput = (IntPtr)destination.Length; bool result = global::Interop.Brotli.BrotliDecoderDecompress((IntPtr)source.Length, inBytes, ref availableOutput, outBytes); bytesWritten = (int)availableOutput; return result; } } } } public struct BrotliEncoder : IDisposable { internal SafeBrotliEncoderHandle _state; private bool _disposed; public BrotliEncoder(int quality, int window) { _disposed = false; _state = global::Interop.Brotli.BrotliEncoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (_state.IsInvalid) { throw new IOException("Failed to create BrotliEncoder instance"); } SetQuality(quality); SetWindow(window); } internal void InitializeEncoder() { EnsureNotDisposed(); _state = global::Interop.Brotli.BrotliEncoderCreateInstance(IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); if (_state.IsInvalid) { throw new IOException("Failed to create BrotliEncoder instance"); } } internal void EnsureInitialized() { EnsureNotDisposed(); if (_state == null) { InitializeEncoder(); } } public void Dispose() { _disposed = true; _state?.Dispose(); } private void EnsureNotDisposed() { if (_disposed) { throw new ObjectDisposedException("BrotliEncoder", "Can not access a closed Encoder."); } } internal void SetQuality(int quality) { EnsureNotDisposed(); if (_state == null || _state.IsInvalid || _state.IsClosed) { InitializeEncoder(); } if (quality < 0 || quality > 11) { throw new ArgumentOutOfRangeException("quality", SR.Format("Provided BrotliEncoder Quality of {0} is not between the minimum value of {1} and the maximum value of {2}", quality, 0, 11)); } if (!global::Interop.Brotli.BrotliEncoderSetParameter(_state, BrotliEncoderParameter.Quality, (uint)quality)) { throw new InvalidOperationException(SR.Format("The BrotliEncoder {0} can not be changed at current encoder state.", "Quality")); } } internal void SetWindow(int window) { EnsureNotDisposed(); if (_state == null || _state.IsInvalid || _state.IsClosed) { InitializeEncoder(); } if (window < 10 || window > 24) { throw new ArgumentOutOfRangeException("window", SR.Format("Provided BrotliEncoder Window of {0} is not between the minimum value of {1} and the maximum value of {2}", window, 10, 24)); } if (!global::Interop.Brotli.BrotliEncoderSetParameter(_state, BrotliEncoderParameter.LGWin, (uint)window)) { throw new InvalidOperationException(SR.Format("The BrotliEncoder {0} can not be changed at current encoder state.", "Window")); } } public static int GetMaxCompressedLength(int length) { if (length < 0 || length > 2147483132) { throw new ArgumentOutOfRangeException("length"); } if (length == 0) { return 1; } int num = length >> 24; int num2 = (((length & 0xFFFFFF) > 1048576) ? 4 : 3); int num3 = 2 + 4 * num + num2 + 1; return length + num3; } internal OperationStatus Flush(Memory<byte> destination, out int bytesWritten) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) return Flush(destination.Span, out bytesWritten); } public OperationStatus Flush(Span<byte> destination, out int bytesWritten) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) int bytesConsumed; return Compress(ReadOnlySpan<byte>.Empty, destination, out bytesConsumed, out bytesWritten, BrotliEncoderOperation.Flush); } internal OperationStatus Compress(ReadOnlyMemory<byte> source, Memory<byte> destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) return Compress(source.Span, destination.Span, out bytesConsumed, out bytesWritten, isFinalBlock); } public OperationStatus Compress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesConsumed, out int bytesWritten, bool isFinalBlock) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) return Compress(source, destination, out bytesConsumed, out bytesWritten, isFinalBlock ? BrotliEncoderOperation.Finish : BrotliEncoderOperation.Process); } internal unsafe OperationStatus Compress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesConsumed, out int bytesWritten, BrotliEncoderOperation operation) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_00dd: Unknown result type (might be due to invalid IL or missing references) EnsureInitialized(); bytesWritten = 0; bytesConsumed = 0; IntPtr availableOut = (IntPtr)destination.Length; IntPtr availableIn = (IntPtr)source.Length; while ((int)availableOut > 0) { fixed (byte* ptr = &MemoryMarshal.GetReference<byte>(source)) { fixed (byte* ptr3 = &MemoryMarshal.GetReference<byte>(destination)) { byte* ptr2 = ptr; byte* ptr4 = ptr3; if (!global::Interop.Brotli.BrotliEncoderCompressStream(_state, operation, ref availableIn, &ptr2, ref availableOut, &ptr4, out var _)) { return (OperationStatus)3; } bytesConsumed += source.Length - (int)availableIn; bytesWritten += destination.Length - (int)availableOut; if ((int)availableOut == destination.Length && !global::Interop.Brotli.BrotliEncoderHasMoreOutput(_state) && (int)availableIn == 0) { return (OperationStatus)0; } source = source.Slice(source.Length - (int)availableIn); destination = destination.Slice(destination.Length - (int)availableOut); } } } return (OperationStatus)1; } public static bool TryCompress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) return TryCompress(source, destination, out bytesWritten, 11, 22); } public unsafe static bool TryCompress(ReadOnlySpan<byte> source, Span<byte> destination, out int bytesWritten, int quality, int window) { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) if (quality < 0 || quality > 11) { throw new ArgumentOutOfRangeException("quality", SR.Format("Provided BrotliEncoder Quality of {0} is not between the minimum value of {1} and the maximum value of {2}", quality, 0, 11)); } if (window < 10 || window > 24) { throw new ArgumentOutOfRangeException("window", SR.Format("Provided BrotliEncoder Window of {0} is not between the minimum value of {1} and the maximum value of {2}", window, 10, 24)); } fixed (byte* inBytes = &MemoryMarshal.GetReference<byte>(source)) { fixed (byte* outBytes = &MemoryMarshal.GetReference<byte>(destination)) { IntPtr availableOutput = (IntPtr)destination.Length; bool result = global::Interop.Brotli.BrotliEncoderCompress(quality, window, 0, (IntPtr)source.Length, inBytes, ref availableOutput, outBytes); bytesWritten = (int)availableOutput; return result; } } } } internal enum BrotliEncoderOperation { Process, Flush, Finish, EmitMetadata } internal enum BrotliEncoderParameter { Mode, Quality, LGWin, LGBlock, LCModeling, SizeHint } internal enum BlockType { Uncompressed, Static, Dynamic } internal sealed class CopyEncoder { private const int PaddingSize = 5; private const int MaxUncompressedBlockSize = 65536; public void GetBlock(DeflateInput input, OutputBuffer output, bool isFinal) { int num = 0; if (input != null) { num = Math.Min(input.Count, output.FreeBytes - 5 - output.BitsInBuffer); if (num > 65531) { num = 65531; } } if (isFinal) { output.WriteBits(3, 1u); } else { output.WriteBits(3, 0u); } output.FlushBits(); WriteLenNLen((ushort)num, output); if (input != null && num > 0) { output.WriteBytes(input.Buffer, input.StartIndex, num); input.ConsumeBytes(num); } } private void WriteLenNLen(ushort len, OutputBuffer output) { output.WriteUInt16(len); ushort value = (ushort)(~len); output.WriteUInt16(value); } } internal sealed class DeflateInput { internal readonly struct InputState { internal readonly int _count; internal readonly int _startIndex; internal InputState(int count, int startIndex) { _count = count; _startIndex = startIndex; } } internal byte[] Buffer { get; set; } internal int Count { get; set; } internal int StartIndex { get; set; } internal void ConsumeBytes(int n) { StartIndex += n; Count -= n; } internal InputState DumpState() { return new InputState(Count, StartIndex); } internal void RestoreState(InputState state) { Count = state._count; StartIndex = state._startIndex; } } internal sealed class DeflateManagedStream : Stream { internal const int DefaultBufferSize = 8192; private Stream _stream; private CompressionMode _mode; private bool _leaveOpen; private System.IO.Compression.InflaterManaged _inflater; private DeflaterManaged _deflater; private byte[] _buffer; private int _asyncOperations; private IFileFormatWriter _formatWriter; private bool _wroteHeader; private bool _wroteBytes; public override bool CanRead { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) if (_stream == null) { return false; } if ((int)_mode == 0) { return _stream.CanRead; } return false; } } public override bool CanWrite { get { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 if (_stream == null) { return false; } if ((int)_mode == 1) { return _stream.CanWrite; } return false; } } public override bool CanSeek => false; public override long Length { get { throw new NotSupportedException("This operation is not supported."); } } public override long Position { get { throw new NotSupportedException("This operation is not supported."); } set { throw new NotSupportedException("This operation is not supported."); } } internal DeflateManagedStream(Stream stream, ZipArchiveEntry.CompressionMethodValues method) { if (stream == null) { throw new ArgumentNullException("stream"); } if (!stream.CanRead) { throw new ArgumentException("Stream does not support reading.", "stream"); } InitializeInflater(stream, leaveOpen: false, null, method); } internal void InitializeInflater(Stream stream, bool leaveOpen, IFileFormatReader reader = null, ZipArchiveEntry.CompressionMethodValues method = ZipArchiveEntry.CompressionMethodValues.Deflate) { //IL_0037: Unknown result type (might be due to invalid IL or missing references) if (!stream.CanRead) { throw new ArgumentException("Stream does not support reading.", "stream"); } _inflater = new System.IO.Compression.InflaterManaged(reader, method == ZipArchiveEntry.CompressionMethodValues.Deflate64); _stream = stream; _mode = (CompressionMode)0; _leaveOpen = leaveOpen; _buffer = new byte[8192]; } internal void SetFileFormatWriter(IFileFormatWriter writer) { if (writer != null) { _formatWriter = writer; } } public override void Flush() { EnsureNotDisposed(); } public override Task FlushAsync(CancellationToken cancellationToken) { EnsureNotDisposed(); if (!cancellationToken.IsCancellationRequested) { return Task.CompletedTask; } return Task.FromCanceled(cancellationToken); } public override long Seek(long offset, SeekOrigin origin) { throw new NotSupportedException("This operation is not supported."); } public override void SetLength(long value) { throw new NotSupportedException("This operation is not supported."); } public override int Read(byte[] array, int offset, int count) { EnsureDecompressionMode(); ValidateParameters(array, offset, count); EnsureNotDisposed(); int num = offset; int num2 = count; while (true) { int num3 = _inflater.Inflate(array, num, num2); num += num3; num2 -= num3; if (num2 == 0 || _inflater.Finished()) { break; } int num4 = _stream.Read(_buffer, 0, _buffer.Length); if (num4 <= 0) { break; } if (num4 > _buffer.Length) { throw new InvalidDataException("Found invalid data while decoding."); } _inflater.SetInput(_buffer, 0, num4); } return count - num2; } private void ValidateParameters(byte[] array, int offset, int count) { if (array == null) { throw new ArgumentNullException("array"); } if (offset < 0) { throw new ArgumentOutOfRangeException("offset"); } if (count < 0) { throw new ArgumentOutOfRangeException("count"); } if (array.Length - offset < count) { throw new ArgumentException("Offset plus count is larger than the length of target array."); } } private void EnsureNotDisposed() { if (_stream == null) { ThrowStreamClosedException(); } } [MethodImpl(MethodImplOptions.NoInlining)] private static void ThrowStreamClosedException() { throw new ObjectDisposedException(null, "Can not access a closed Stream."); } private void EnsureDecompressionMode() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) if ((int)_mode != 0) { ThrowCannotReadFromDeflateManagedStreamException(); } } [MethodImpl(MethodImplOptions.NoInlining)] private static void ThrowCannotReadFromDeflateManagedStreamException() { throw new InvalidOperationException("Reading from the compression stream is not supported."); } private void EnsureCompressionMode() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 if ((int)_mode != 1) { ThrowCannotWriteToDeflateManagedStreamException(); } } [MethodImpl(MethodImplOptions.NoInlining)] private static void ThrowCannotWriteToDeflateManagedStreamException() { throw new InvalidOperationException("Writing to the compression stream is not supported."); } public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState) { return System.Threading.Tasks.TaskToApm.Begin(ReadAsync(buffer, offset, count, CancellationToken.None), asyncCallback, asyncState); } public override int EndRead(IAsyncResult asyncResult) { return System.Threading.Tasks.TaskToApm.End<int>(asyncResult); } public override Task<int> ReadAsync(byte[] array, int offset, int count, CancellationToken cancellationToken) { EnsureDecompressionMode(); if (_asyncOperations != 0) { throw new InvalidOperationException("Only one asynchronous reader or writer is allowed time at one time."); } ValidateParameters(array, offset, count); EnsureNotDisposed(); if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled<int>(cancellationToken); } Interlocked.Increment(ref _asyncOperations); Task<int> task = null; try { int num = _inflater.Inflate(array, offset, count); if (num != 0) { return Task.FromResult(num); } if (_inflater.Finished()) { return Task.FromResult(0); } task = _stream.ReadAsync(_buffer, 0, _buffer.Length, cancellationToken); if (task == null) { throw new InvalidOperationException("Stream does not support reading."); } return ReadAsyncCore(task, array, offset, count, cancellationToken); } finally { if (task == null) { Interlocked.Decrement(ref _asyncOperations); } } } private async Task<int> ReadAsyncCore(Task<int> readTask, byte[] array, int offset, int count, CancellationToken cancellationToken) { try { int num; while (true) { num = await readTask.ConfigureAwait(continueOnCapturedContext: false); EnsureNotDisposed(); if (num <= 0) { return 0; } if (num > _buffer.Length) { throw new InvalidDataException("Found invalid data while decoding."); } cancellationToken.ThrowIfCancellationRequested(); _inflater.SetInput(_buffer, 0, num); num = _inflater.Inflate(array, offset, count); if (num != 0 || _inflater.Finished()) { break; } readTask = _stream.ReadAsync(_buffer, 0, _buffer.Length, cancellationToken); if (readTask == null) { throw new InvalidOperationException("Stream does not support reading."); } } return num; } finally { Interlocked.Decrement(ref _asyncOperations); } } public override void Write(byte[] array, int offset, int count) { EnsureCompressionMode(); ValidateParameters(array, offset, count); EnsureNotDisposed(); DoMaintenance(array, offset, count); WriteDeflaterOutput(); _deflater.SetInput(array, offset, count); WriteDeflaterOutput(); } private void WriteDeflaterOutput() { while (!_deflater.NeedsInput()) { int deflateOutput = _deflater.GetDeflateOutput(_buffer); if (deflateOutput > 0) { _stream.Write(_buffer, 0, deflateOutput); } } } private void DoMaintenance(byte[] array, int offset, int count) { if (count <= 0) { return; } _wroteBytes = true; if (_formatWriter != null) { if (!_wroteHeader) { byte[] header = _formatWriter.GetHeader(); _stream.Write(header, 0, header.Length); _wroteHeader = true; } _formatWriter.UpdateWithBytesRead(array, offset, count); } } private void PurgeBuffers(bool disposing) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Invalid comparison between Unknown and I4 if (!disposing || _stream == null) { return; } Flush(); if ((int)_mode != 1) { return; } if (_wroteBytes) { WriteDeflaterOutput(); bool flag; do { flag = _deflater.Finish(_buffer, out var bytesRead); if (bytesRead > 0) { _stream.Write(_buffer, 0, bytesRead); } } while (!flag); } else { int bytesRead2; while (!_deflater.Finish(_buffer, out bytesRead2)) { } } if (_formatWriter != null && _wroteHeader) { byte[] footer = _formatWriter.GetFooter(); _stream.Write(footer, 0, footer.Length); } } protected override void Dispose(bool disposing) { try { PurgeBuffers(disposing); } finally { try { if (disposing && !_leaveOpen && _stream != null) { _stream.Dispose(); } } finally { _stream = null; try { _deflater?.Dispose(); _inflater?.Dispose(); } finally { _deflater = null; _inflater = null; base.Dispose(disposing); } } } } public override Task WriteAsync(byte[] array, int offset, int count, CancellationToken cancellationToken) { EnsureCompressionMode(); if (_asyncOperations != 0) { throw new InvalidOperationException("Only one asynchronous reader or writer is allowed time at one time."); } ValidateParameters(array, offset, count); EnsureNotDisposed(); if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled<int>(cancellationToken); } return WriteAsyncCore(array, offset, count, cancellationToken); } private async Task WriteAsyncCore(byte[] array, int offset, int count, CancellationToken cancellationToken) { Interlocked.Increment(ref _asyncOperations); try { await base.WriteAsync(array, offset, count, cancellationToken).ConfigureAwait(continueOnCapturedContext: false); } finally { Interlocked.Decrement(ref _asyncOperations); } } public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback asyncCallback, object asyncState) { return System.Threading.Tasks.TaskToApm.Begin(WriteAsync(buffer, offset, count, CancellationToken.None), asyncCallback, asyncState); } public override void EndWrite(IAsyncResult asyncResult) { System.Threading.Tasks.TaskToApm.End(asyncResult); } } internal sealed class DeflaterManaged : IDisposable { private enum DeflaterState { NotStarted, SlowDownForIncompressible1, SlowDownForIncompressible2, StartingSmallData, CompressThenCheck, CheckingForIncompressible, HandlingSmallData } private const int MinBlockSize = 256; private const int MaxHeaderFooterGoo = 120; private const int CleanCopySize = 8072; private const double BadCompressionThreshold = 1.0; private readonly FastEncoder _deflateEncoder; private readonly CopyEncoder _copyEncoder; private readonly DeflateInput _input; private readonly OutputBuffer _output; private DeflaterState _processingState; private DeflateInput _inputFromHistory; internal DeflaterManaged() { _deflateEncoder = new FastEncoder(); _copyEncoder = new CopyEncoder(); _input = new DeflateInput(); _output = new OutputBuffer(); _processingState = DeflaterState.NotStarted; } internal bool NeedsInput() { if (_input.Count == 0) { return _deflateEncoder.BytesInHistory == 0; } return false; } internal void SetInput(byte[] inputBuffer, int startIndex, int count) { _input.Buffer = inputBuffer; _input.Count = count; _input.StartIndex = startIndex; if (count > 0 && count < 256) { switch (_processingState) { case DeflaterState.NotStarted: case DeflaterState.CheckingForIncompressible: _processingState = DeflaterState.StartingSmallData; break; case DeflaterState.CompressThenCheck: _processingState = DeflaterState.HandlingSmallData; break; } } } internal int GetDeflateOutput(byte[] outputBuffer) { _output.UpdateBuffer(outputBuffer); switch (_processingState) { case DeflaterState.NotStarted: { DeflateInput.InputState state3 = _input.DumpState(); OutputBuffer.BufferState state4 = _output.DumpState(); _deflateEncoder.GetBlockHeader(_output); _deflateEncoder.GetCompressedData(_input, _output); if (!UseCompressed(_deflateEncoder.LastCompressionRatio)) { _input.RestoreState(state3); _output.RestoreState(state4); _copyEncoder.GetBlock(_input, _output, isFinal: false); FlushInputWindows(); _processingState = DeflaterState.CheckingForIncompressible; } else { _processingState = DeflaterState.CompressThenCheck; } break; } case DeflaterState.CompressThenCheck: _deflateEncoder.GetCompressedData(_input, _output); if (!UseCompressed(_deflateEncoder.LastCompressionRatio)) { _processingState = DeflaterState.SlowDownForIncompressible1; _inputFromHistory = _deflateEncoder.UnprocessedInput; } break; case DeflaterState.SlowDownForIncompressible1: _deflateEncoder.GetBlockFooter(_output); _processingState = DeflaterState.SlowDownForIncompressible2; goto case DeflaterState.SlowDownForIncompressible2; case DeflaterState.SlowDownForIncompressible2: if (_inputFromHistory.Count > 0) { _copyEncoder.GetBlock(_inputFromHistory, _output, isFinal: false); } if (_inputFromHistory.Count == 0) { _deflateEncoder.FlushInput(); _processingState = DeflaterState.CheckingForIncompressible; } break; case DeflaterState.CheckingForIncompressible: { DeflateInput.InputState state = _input.DumpState(); OutputBuffer.BufferState state2 = _output.DumpState(); _deflateEncoder.GetBlock(_input, _output, 8072); if (!UseCompressed(_deflateEncoder.LastCompressionRatio)) { _input.RestoreState(state); _output.RestoreState(state2); _copyEncoder.GetBlock(_input, _output, isFinal: false); FlushInputWindows(); } break; } case DeflaterState.StartingSmallData: _deflateEncoder.GetBlockHeader(_output); _processingState = DeflaterState.HandlingSmallData; goto case DeflaterState.HandlingSmallData; case DeflaterState.HandlingSmallData: _deflateEncoder.GetCompressedData(_input, _output); break; } return _output.BytesWritten; } internal bool Finish(byte[] outputBuffer, out int bytesRead) { if (_processingState == DeflaterState.NotStarted) { bytesRead = 0; return true; } _output.UpdateBuffer(outputBuffer); if (_processingState == DeflaterState.CompressThenCheck || _processingState == DeflaterState.HandlingSmallData || _processingState == DeflaterState.SlowDownForIncompressible1) { _deflateEncoder.GetBlockFooter(_output); } WriteFinal(); bytesRead = _output.BytesWritten; return true; } private bool UseCompressed(double ratio) { return ratio <= 1.0; } private void FlushInputWindows() { _deflateEncoder.FlushInput(); } private void WriteFinal() { _copyEncoder.GetBlock(null, _output, isFinal: true); } public void Dispose() { } } internal sealed class FastEncoder { private readonly FastEncoderWindow _inputWindow; private readonly Match _currentMatch; private double _lastCompressionRatio; internal int BytesInHistory => _inputWindow.BytesAvailable; internal DeflateInput UnprocessedInput => _inputWindow.UnprocessedInput; internal double LastCompressionRatio => _lastCompressionRatio; public FastEncoder() { _inputWindow = new FastEncoderWindow(); _currentMatch = new Match(); } internal void FlushInput() { _inputWindow.FlushWindow(); } internal void GetBlock(DeflateInput input, OutputBuffer output, int maxBytesToCopy) { WriteDeflatePreamble(output); GetCompressedOutput(input, output, maxBytesToCopy); WriteEndOfBlock(output); } internal void GetCompressedData(DeflateInput input, OutputBuffer output) { GetCompressedOutput(input, output, -1); } internal void GetBlockHeader(OutputBuffer output) { WriteDeflatePreamble(output); } internal void GetBlockFooter(OutputBuffer output) { WriteEndOfBlock(output); } private void GetCompressedOutput(DeflateInput input, OutputBuffer output, int maxBytesToCopy) { int bytesWritten = output.BytesWritten; int num = 0; int num2 = BytesInHistory + input.Count; do { int num3 = ((input.Count < _inputWindow.FreeWindowSpace) ? input.Count : _inputWindow.FreeWindowSpace); if (maxBytesToCopy >= 1) { num3 = Math.Min(num3, maxBytesToCopy - num); } if (num3 > 0) { _inputWindow.CopyBytes(input.Buffer, input.StartIndex, num3); input.ConsumeBytes(num3); num += num3; } GetCompressedOutput(output); } while (SafeToWriteTo(output) && InputAvailable(input) && (maxBytesToCopy < 1 || num < maxBytesToCopy)); int num4 = output.BytesWritten - bytesWritten; int num5 = BytesInHistory + input.Count; int num6 = num2 - num5; if (num4 != 0) { _lastCompressionRatio = (double)num4 / (double)num6; } } private void GetCompressedOutput(OutputBuffer output) { while (_inputWindow.BytesAvailable > 0 && SafeToWriteTo(output)) { _inputWindow.GetNextSymbolOrMatch(_currentMatch); if (_currentMatch.State == MatchState.HasSymbol) { WriteChar(_currentMatch.Symbol, output); continue; } if (_currentMatch.State == MatchState.HasMatch) { WriteMatch(_currentMatch.Length, _currentMatch.Position, output); continue; } WriteChar(_currentMatch.Symbol, output); WriteMatch(_currentMatch.Length, _currentMatch.Position, output); } } private bool InputAvailable(DeflateInput input) { if (input.Count <= 0) { return BytesInHistory > 0; } return true; } private bool SafeToWriteTo(OutputBuffer output) { return output.FreeBytes > 16; } private void WriteEndOfBlock(OutputBuffer output) { uint num = FastEncoderStatics.FastEncoderLiteralCodeInfo[256]; int n = (int)(num & 0x1F); output.WriteBits(n, num >> 5); } internal static void WriteMatch(int matchLen, int matchPos, OutputBuffer output) { uint num = FastEncoderStatics.FastEncoderLiteralCodeInfo[254 + matchLen]; int num2 = (int)(num & 0x1F); if (num2 <= 16) { output.WriteBits(num2, num >> 5); } else { output.WriteBits(16, (num >> 5) & 0xFFFFu); output.WriteBits(num2 - 16, num >> 21); } num = FastEncoderStatics.FastEncoderDistanceCodeInfo[FastEncoderStatics.GetSlot(matchPos)]; output.WriteBits((int)(num & 0xF), num >> 8); int num3 = (int)((num >> 4) & 0xF); if (num3 != 0) { output.WriteBits(num3, (uint)matchPos & FastEncoderStatics.BitMask[num3]); } } internal static void WriteChar(byte b, OutputBuffer output) { uint num = FastEncoderStatics.FastEncoderLiteralCodeInfo[b]; output.WriteBits((int)(num & 0x1F), num >> 5); } internal static void WriteDeflatePreamble(OutputBuffer output) { output.WriteBytes(FastEncoderStatics.FastEncoderTreeStructureData, 0, FastEncoderStatics.FastEncoderTreeStructureData.Length); output.WriteBits(9, 34u); } } internal static class FastEncoderStatics { internal static readonly byte[] FastEncoderTreeStructureData = new byte[98] { 236, 189, 7, 96, 28, 73, 150, 37, 38, 47, 109, 202, 123, 127, 74, 245, 74, 215, 224, 116, 161, 8, 128, 96, 19, 36, 216, 144, 64, 16, 236, 193, 136, 205, 230, 146, 236, 29, 105, 71, 35, 41, 171, 42, 129, 202, 101, 86, 101, 93, 102, 22, 64, 204, 237, 157, 188, 247, 222, 123, 239, 189, 247, 222, 123, 239, 189, 247, 186, 59, 157, 78, 39, 247, 223, 255, 63, 92, 102, 100, 1, 108, 246, 206, 74, 218, 201, 158, 33, 128, 170, 200, 31, 63, 126, 124, 31, 63 }; internal static readonly byte[] BFinalFastEncoderTreeStructureData = new byte[98] { 237, 189, 7, 96, 28, 73, 150, 37, 38, 47, 109, 202, 123, 127, 74, 245, 74, 215, 224, 116, 161, 8, 128, 96, 19, 36, 216, 144, 64, 16, 236, 193, 136, 205, 230, 146, 236, 29, 105, 71, 35, 41, 171, 42, 129, 202, 101, 86, 101, 93, 102, 22, 64, 204, 237, 157, 188, 247, 222, 123, 239, 189, 247, 222, 123, 239, 189, 247, 186, 59, 157, 78, 39, 247, 223, 255, 63, 92, 102, 100, 1, 108, 246, 206, 74, 218, 201, 158, 33, 128, 170, 200, 31, 63, 126, 124, 31, 63 }; internal static readonly uint[] FastEncoderLiteralCodeInfo = new uint[513] { 55278u, 317422u, 186350u, 448494u, 120814u, 382958u, 251886u, 514030u, 14318u, 51180u, 294u, 276462u, 145390u, 407534u, 79854u, 341998u, 210926u, 473070u, 47086u, 309230u, 178158u, 440302u, 112622u, 374766u, 243694u, 505838u, 30702u, 292846u, 161774u, 423918u, 6125u, 96238u, 1318u, 358382u, 9194u, 116716u, 227310u, 489454u, 137197u, 25578u, 2920u, 3817u, 23531u, 5098u, 1127u, 7016u, 3175u, 12009u, 1896u, 5992u, 3944u, 7913u, 8040u, 16105u, 21482u, 489u, 232u, 8681u, 4585u, 4328u, 12777u, 13290u, 2280u, 63470u, 325614u, 6376u, 2537u, 1256u, 10729u, 5352u, 6633u, 29674u, 56299u, 3304u, 15339u, 194542u, 14825u, 3050u, 1513u, 19434u, 9705u, 10220u, 5609u, 13801u, 3561u, 11242u, 75756u, 48107u, 456686u, 129006u, 42988u, 31723u, 391150u, 64491u, 260078u, 522222u, 4078u, 806u, 615u, 2663u, 1639u, 1830u, 7400u, 744u, 3687u, 166u, 108524u, 11753u, 1190u, 359u, 2407u, 678u, 1383u, 71661u, 1702u, 422u, 1446u, 3431u, 4840u, 2792u, 7657u, 6888u, 2027u, 202733u, 26604u, 38893u, 169965u, 266222u, 135150u, 397294u, 69614u, 331758u, 200686u, 462830u, 36846u, 298990u, 167918u, 430062u, 102382u, 364526u, 233454u, 495598u, 20462u, 282606u, 151534u, 413678u, 85998u, 348142u, 217070u, 479214u, 53230u, 315374u, 184302u, 446446u, 118766u, 380910u, 249838u, 511982u, 12270u, 274414u, 143342u, 405486u, 77806u, 339950u, 208878u, 471022u, 45038u, 307182u, 176110u, 438254u, 110574u, 372718u, 241646u, 503790u, 28654u, 290798u, 159726u, 421870u, 94190u, 356334u, 225262u, 487406u, 61422u, 323566u, 192494u, 454638u, 126958u, 389102u, 258030u, 520174u, 8174u, 270318u, 139246u, 401390u, 73710u, 335854u, 204782u, 466926u, 40942u, 303086u, 172014u, 434158u, 106478u, 368622u, 237550u, 499694u, 24558u, 286702u, 155630u, 417774u, 90094u, 352238u, 221166u, 483310u, 57326u, 319470u, 188398u, 450542u, 122862u, 385006u, 253934u, 516078u, 16366u, 278510u, 147438u, 409582u, 81902u, 344046u, 212974u, 475118u, 49134u, 311278u, 180206u, 442350u, 114670u, 376814u, 245742u, 507886u, 32750u, 294894u, 163822u, 425966u, 98286u, 104429u, 235501u, 22509u, 360430u, 153581u, 229358u, 88045u, 491502u, 219117u, 65518u, 327662u, 196590u, 458734u, 131054u, 132u, 3u, 388u, 68u, 324u, 197u, 709u, 453u, 966u, 1990u, 38u, 1062u, 935u, 2983u, 1959u, 4007u, 551u, 1575u, 2599u, 3623u, 104u, 2152u, 4200u, 6248u, 873u, 4969u, 9065u, 13161u, 1770u, 9962u, 18154u, 26346u, 5867u, 14059u, 22251u, 30443u, 38635u, 46827u, 55019u, 63211u, 15852u, 32236u, 48620u, 65004u, 81388u, 97772u, 114156u, 130540u, 27629u, 60397u, 93165u, 125933u, 158701u, 191469u, 224237u, 257005u, 1004u, 17388u, 33772u, 50156u, 66540u, 82924u, 99308u, 115692u, 7150u, 39918u, 72686u, 105454u, 138222u, 170990u, 203758u, 236526u, 269294u, 302062u, 334830u, 367598u, 400366u, 433134u, 465902u, 498670u, 92144u, 223216u, 354288u, 485360u, 616432u, 747504u, 878576u, 1009648u, 1140720u, 1271792u, 1402864u, 1533936u, 1665008u, 1796080u, 1927152u, 2058224u, 34799u, 100335u, 165871u, 231407u, 296943u, 362479u, 428015u, 493551u, 559087u, 624623u, 690159u, 755695u, 821231u, 886767u, 952303u, 1017839u, 59376u, 190448u, 321520u, 452592u, 583664u, 714736u, 845808u, 976880u, 1107952u, 1239024u, 1370096u, 1501168u, 1632240u, 1763312u, 1894384u, 2025456u, 393203u, 917491u, 1441779u, 1966067u, 2490355u, 3014643u, 3538931u, 4063219u, 4587507u, 5111795u, 5636083u, 6160371u, 6684659u, 7208947u, 7733235u, 8257523u, 8781811u, 9306099u, 9830387u, 10354675u, 10878963u, 11403251u, 11927539u, 12451827u, 12976115u, 13500403u, 14024691u, 14548979u, 15073267u, 15597555u, 16121843u, 16646131u, 262131u, 786419u, 1310707u, 1834995u, 2359283u, 2883571u, 3407859u, 3932147u, 4456435u, 4980723u, 5505011u, 6029299u, 6553587u, 7077875u, 7602163u, 8126451u, 8650739u, 9175027u, 9699315u, 10223603u, 10747891u, 11272179u, 11796467u, 12320755u, 12845043u, 13369331u, 13893619u, 14417907u, 14942195u, 15466483u, 15990771u, 16515059u, 524275u, 1048563u, 1572851u, 2097139u, 2621427u, 3145715u, 3670003u, 4194291u, 4718579u, 5242867u, 5767155u, 6291443u, 6815731u, 7340019u, 7864307u, 8388595u, 8912883u, 9437171u, 9961459u, 10485747u, 11010035u, 11534323u, 12058611u, 12582899u, 13107187u, 13631475u, 14155763u, 14680051u, 15204339u, 15728627u, 16252915u, 16777203u, 124913u, 255985u, 387057u, 518129u, 649201u, 780273u, 911345u, 1042417u, 1173489u, 1304561u, 1435633u, 1566705u, 1697777u, 1828849u, 1959921u, 2090993u, 2222065u, 2353137u, 2484209u, 2615281u, 2746353u, 2877425u, 3008497u, 3139569u, 3270641u, 3401713u, 3532785u, 3663857u, 3794929u, 3926001u, 4057073u, 18411u }; internal static readonly uint[] FastEncoderDistanceCodeInfo = new uint[32] { 3846u, 130826u, 261899u, 524043u, 65305u, 16152u, 48936u, 32552u, 7991u, 24375u, 3397u, 12102u, 84u, 7509u, 2148u, 869u, 1140u, 4981u, 3204u, 644u, 2708u, 1684u, 3748u, 420u, 2484u, 2997u, 1476u, 7109u, 2005u, 6101u, 0u, 256u }; internal static readonly uint[] BitMask = new uint[16] { 0u, 1u, 3u, 7u, 15u, 31u, 63u, 127u, 255u, 511u, 1023u, 2047u, 4095u, 8191u, 16383u, 32767u }; internal static readonly byte[] ExtraLengthBits = new byte[29] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0 }; internal static readonly byte[] ExtraDistanceBits = new byte[32] { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 0, 0 }; internal const int NumChars = 256; internal const int NumLengthBaseCodes = 29; internal const int NumDistBaseCodes = 30; internal const uint FastEncoderPostTreeBitBuf = 34u; internal const int FastEncoderPostTreeBitCount = 9; internal const uint NoCompressionHeader = 0u; internal const int NoCompressionHeaderBitCount = 3; internal const uint BFinalNoCompressionHeader = 1u; internal const int BFinalNoCompressionHeaderBitCount = 3; internal const int MaxCodeLen = 16; private static readonly byte[] s_distLookup = CreateDistanceLookup(); private static byte[] CreateDistanceLookup() { byte[] array = new byte[512]; int num = 0; int i; for (i = 0; i < 16; i++) { for (int j = 0; j < 1 << (int)ExtraDistanceBits[i]; j++) { array[num++] = (byte)i; } } num >>= 7; for (; i < 30; i++) { for (int k = 0; k < 1 << ExtraDistanceBits[i] - 7; k++) { array[256 + num++] = (byte)i; } } return array; } internal static int GetSlot(int pos) { return s_distLookup[(pos < 256) ? pos : (256 + (pos >> 7))]; } public static uint BitReverse(uint code, int length) { uint num = 0u; do { num |= code & 1u; num <<= 1; code >>= 1; } while (--length > 0); return num >> 1; } } internal sealed class FastEncoderWindow { private byte[] _window; private int _bufPos; private int _bufEnd; private const int FastEncoderHashShift = 4; private const int FastEncoderHashtableSize = 2048; private const int FastEncoderHashMask = 2047; private const int FastEncoderWindowSize = 8192; private const int FastEncoderWindowMask = 8191; private const int FastEncoderMatch3DistThreshold = 16384; internal const int MaxMatch = 258; internal const int MinMatch = 3; private const int SearchDepth = 32; private const int GoodLength = 4; private const int NiceLength = 32; private const int LazyMatchThreshold = 6; private ushort[] _prev; private ushort[] _lookup; public int BytesAvailable => _bufEnd - _bufPos; public DeflateInput UnprocessedInput => new DeflateInput { Buffer = _window, StartIndex = _bufPos, Count = _bufEnd - _bufPos }; public int FreeWindowSpace => 16384 - _bufEnd; public FastEncoderWindow() { ResetWindow(); } public void FlushWindow() { ResetWindow(); } private void ResetWindow() { _window = new byte[16646]; _prev = new ushort[8450]; _lookup = new ushort[2048]; _bufPos = 8192; _bufEnd = _bufPos; } public void CopyBytes(byte[] inputBuffer, int startIndex, int count) { Array.Copy(inputBuffer, startIndex, _window, _bufEnd, count); _bufEnd += count; } public void MoveWindows() { Array.Copy(_window, _bufPos - 8192, _window, 0, 8192); for (int i = 0; i < 2048; i++) { int num = _lookup[i] - 8192; if (num <= 0) { _lookup[i] = 0; } else { _lookup[i] = (ushort)num; } } for (int i = 0; i < 8192; i++) { long num2 = (long)_prev[i] - 8192L; if (num2 <= 0) { _prev[i] = 0; } else { _prev[i] = (ushort)num2; } } _bufPos = 8192; _bufEnd = _bufPos; } private uint HashValue(uint hash, byte b) { return (hash << 4) ^ b; } private uint InsertString(ref uint hash) { hash = HashValue(hash, _window[_bufPos + 2]); uint num = _lookup[hash & 0x7FF]; _lookup[hash & 0x7FF] = (ushort)_bufPos; _prev[_bufPos & 0x1FFF] = (ushort)num; return num; } private void InsertStrings(ref uint hash, int matchLen) { if (_bufEnd - _bufPos <= matchLen) { _bufPos += matchLen - 1; return; } while (--matchLen > 0) { InsertString(ref hash); _bufPos++; } } internal bool GetNextSymbolOrMatch(Match match) { uint hash = HashValue(0u, _window[_bufPos]); hash = HashValue(hash, _window[_bufPos + 1]); int matchPos = 0; int num; if (_bufEnd - _bufPos <= 3) { num = 0; } else { int num2 = (int)InsertString(ref hash); if (num2 != 0) { num = FindMatch(num2, out matchPos, 32, 32); if (_bufPos + num > _bufEnd) { num = _bufEnd - _bufPos; } } else { num = 0; } } if (num < 3) { match.State = MatchState.HasSymbol; match.Symbol = _window[_bufPos]; _bufPos++; } else { _bufPos++; if (num <= 6) { int matchPos2 = 0; int num3 = (int)InsertString(ref hash); int num4; if (num3 != 0) { num4 = FindMatch(num3, out matchPos2, (num < 4) ? 32 : 8, 32); if (_bufPos + num4 > _bufEnd) { num4 = _bufEnd - _bufPos; } } else { num4 = 0; } if (num4 > num) { match.State = MatchState.HasSymbolAndMatch; match.Symbol = _window[_bufPos - 1]; match.Position = matchPos2; match.Length = num4; _bufPos++; num = num4; InsertStrings(ref hash, num); } else { match.State = MatchState.HasMatch; match.Position = matchPos; match.Length = num; num--; _bufPos++; InsertStrings(ref hash, num); } } else { match.State = MatchState.HasMatch; match.Position = matchPos; match.Length = num; InsertStrings(ref hash, num); } } if (_bufPos == 16384) { MoveWindows(); } return true; } private int FindMatch(int search, out int matchPos, int searchDepth, int niceLength) { int num = 0; int num2 = 0; int num3 = _bufPos - 8192; byte b = _window[_bufPos]; while (search > num3) { if (_window[search + num] == b) { int i; for (i = 0; i < 258 && _window[_bufPos + i] == _window[search + i]; i++) { } if (i > num) { num = i; num2 = search; if (i > 32) { break; } b = _window[_bufPos + i]; } } if (--searchDepth == 0) { break; } search = _prev[search & 0x1FFF]; } matchPos = _bufPos - num2 - 1; if (num == 3 && matchPos >= 16384) { return 0; } return num; } [Conditional("DEBUG")] private void DebugAssertVerifyHashes() { } [Conditional("DEBUG")] private void DebugAssertRecalculatedHashesAreEqual(int position1, int position2, string message = "") { } } internal interface IFileFormatWriter { byte[] GetHeader(); void UpdateWithBytesRead(byte[] buffer, int offset, int bytesToCopy); byte[] GetFooter(); } internal interface IFileFormatReader { bool ReadHeader(System.IO.Compression.InputBuffer input); bool ReadFooter(System.IO.Compression.InputBuffer input); void UpdateWithBytesRead(byte[] buffer, int offset, int bytesToCopy); void Validate(); } internal sealed class HuffmanTree { internal const int MaxLiteralTreeElements = 288; internal const int MaxDistTreeElements = 32; internal const int EndOfBlockCode = 256; internal const int NumberOfCodeLengthTreeElements = 19; private readonly int _tableBits; private readonly short[] _table; private readonly short[] _left; private readonly short[] _right; private readonly byte[] _codeLengthArray; private readonly int _tableMask; public static System.IO.Compression.HuffmanTree StaticLiteralLengthTree { get; } = new System.IO.Compression.HuffmanTree(GetStaticLiteralTreeLength()); public static System.IO.Compression.HuffmanTree StaticDistanceTree { get; } = new System.IO.Compression.HuffmanTree(GetStaticDistanceTreeLength()); public HuffmanTree(byte[] codeLengths) { _codeLengthArray = codeLengths; if (_codeLengthArray.Length == 288) { _tableBits = 9; } else { _tableBits = 7; } _tableMask = (1 << _tableBits) - 1; _table = new short[1 << _tableBits]; _left = new short[2 * _codeLengthArray.Length]; _right = new short[2 * _codeLengthArray.Length]; CreateTable(); } private static byte[] GetStaticLiteralTreeLength() { byte[] array = new byte[288]; for (int i = 0; i <= 143; i++) { array[i] = 8; } for (int j = 144; j <= 255; j++) { array[j] = 9; } for (int k = 256; k <= 279; k++) { array[k] = 7; } for (int l = 280; l <= 287; l++) { array[l] = 8; } return array; } private static byte[] GetStaticDistanceTreeLength() { byte[] array = new byte[32]; for (int i = 0; i < 32; i++) { array[i] = 5; } return array; } private uint[] CalculateHuffmanCode() { uint[] array = new uint[17]; byte[] codeLengthArray = _codeLengthArray; foreach (int num in codeLengthArray) { array[num]++; } array[0] = 0u; uint[] array2 = new uint[17]; uint num2 = 0u; for (int j = 1; j <= 16; j++) { num2 = (array2[j] = num2 + array[j - 1] << 1); } uint[] array3 = new uint[288]; for (int k = 0; k < _codeLengthArray.Length; k++) { int num3 = _codeLengthArray[k]; if (num3 > 0) { array3[k] = FastEncoderStatics.BitReverse(array2[num3], num3); array2[num3]++; } } return array3; } private void CreateTable() { uint[] array = CalculateHuffmanCode(); short num = (short)_codeLengthArray.Length; for (int i = 0; i < _codeLengthArray.Length; i++) { int num2 = _codeLengthArray[i]; if (num2 <= 0) { continue; } int num3 = (int)array[i]; if (num2 <= _tableBits) { int num4 = 1 << num2; if (num3 >= num4) { throw new InvalidDataException("Failed to construct a huffman tree using the length array. The stream might be corrupted."); } int num5 = 1 << _tableBits - num2; for (int j = 0; j < num5; j++) { _table[num3] = (short)i; num3 += num4; } continue; } int num6 = num2 - _tableBits; int num7 = 1 << _tableBits; int num8 = num3 & ((1 << _tableBits) - 1); short[] array2 = _table; do { short num9 = array2[num8]; if (num9 == 0) { array2[num8] = (short)(-num); num9 = (short)(-num); num++; } if (num9 > 0) { throw new InvalidDataException("Failed to construct a huffman tree using the length array. The stream might be corrupted."); } array2 = (((num3 & num7) != 0) ? _right : _left); num8 = -num9; num7 <<= 1; num6--; } while (num6 != 0); array2[num8] = (short)i; } } public int GetNextSymbol(System.IO.Compression.InputBuffer input) { uint num = input.TryLoad16Bits(); if (input.AvailableBits == 0) { return -1; } int num2 = _table[num & _tableMask]; if (num2 < 0) { uint num3 = (uint)(1 << _tableBits); do { num2 = -num2; num2 = (((num & num3) != 0) ? _right[num2] : _left[num2]); num3 <<= 1; } while (num2 < 0); } int num4 = _codeLengthArray[num2]; if (num4 <= 0) { throw new InvalidDataException("Failed to construct a huffman tree using the length array. The stream might be corrupted."); } if (num4 > input.AvailableBits) { return -1; } input.SkipBits(num4); return num2; } } internal sealed class InflaterManaged { private static readonly byte[] s_extraLengthBits = new byte[29] { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 16 }; private static readonly int[] s_lengthBase = new int[29] { 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 3 }; private static readonly int[] s_distanceBasePosition = new int[32] { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153 }; private static readonly byte[] s_codeOrder = new byte[19] { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; private static readonly byte[] s_staticDistanceTreeTable = new byte[32] { 0, 16, 8, 24, 4, 20, 12, 28, 2, 18, 10, 26, 6, 22, 14, 30, 1, 17, 9, 25, 5, 21, 13, 29, 3, 19, 11, 27, 7, 23, 15, 31 }; private readonly System.IO.Compression.OutputWindow _output; private readonly System.IO.Compression.InputBuffer _input; private System.IO.Compression.HuffmanTree _literalLengthTree; private System.IO.Compression.HuffmanTree _distanceTree; private System.IO.Compression.InflaterState _state; private bool _hasFormatReader; private int _bfinal; private System.IO.Compression.BlockType _blockType; private readonly byte[] _blockLengthBuffer = new byte[4]; private int _blockLength; private int _length; private int _distanceCode; private int _extraBits; private int _loopCounter; private int _literalLengthCodeCount; private int _distanceCodeCount; private int _codeLengthCodeCount; private int _codeArraySize; private int _lengthCode; private readonly byte[] _codeList; private readonly byte[] _codeLengthTreeCodeLength; private readonly bool _deflate64; private System.IO.Compression.HuffmanTree _codeLengthTree; private IFileFormatReader _formatReader; public int AvailableOutput => _output.AvailableBytes; internal InflaterManaged(IFileFormatReader reader, bool deflate64) { _output = new System.IO.Compression.OutputWindow(); _input = new System.IO.Compression.InputBuffer(); _codeList = new byte[320]; _codeLengthTreeCodeLength = new byte[19]; _deflate64 = deflate64; if (reader != null) { _formatReader = reader; _hasFormatReader = true; } Reset(); } private void Reset() { _state = ((!_hasFormatReader) ? System.IO.Compression.InflaterState.ReadingBFinal : System.IO.Compression.InflaterState.ReadingHeader); } public void SetInput(byte[] inputBytes, int offset, int length) { _input.SetInput(inputBytes, offset, length); } public bool Finished() { if (_state != System.IO.Compression.InflaterState.Done) { return _state == System.IO.Compression.InflaterState.VerifyingFooter; } return true; } public int Inflate(byte[] bytes, int offset, int length) { int num = 0; do { int num2 = _output.CopyTo(bytes, offset, length); if (num2 > 0) { if (_hasFormatReader) { _formatReader.UpdateWithBytesRead(bytes, offset, num2); } offset += num2; num += num2; length -= num2; } } while (length != 0 && !Finished() && Decode()); if (_state == System.IO.Compression.InflaterState.VerifyingFooter && _output.AvailableBytes == 0) { _formatReader.Validate(); } return num; } private bool Decode() { bool end_of_block_code_seen = false; bool flag = false; if (Finished()) { return true; } if (_hasFormatReader) { if (_state == System.IO.Compression.InflaterState.ReadingHeader) { if (!_formatReader.ReadHeader(_input)) { return false; } _state = System.IO.Compression.InflaterState.ReadingBFinal; } else if (_state == System.IO.Compression.InflaterState.StartReadingFooter || _state == System.IO.Compression.InflaterState.ReadingFooter) { if (!_formatReader.ReadFooter(_input)) { return false; } _state = System.IO.Compression.InflaterState.VerifyingFooter; return true; } } if (_state == System.IO.Compression.InflaterState.ReadingBFinal) { if (!_input.EnsureBitsAvailable(1)) { return false; } _bfinal = _input.GetBits(1); _state = System.IO.Compression.InflaterState.ReadingBType; } if (_state == System.IO.Compression.InflaterState.ReadingBType) { if (!_input.EnsureBitsAvailable(2)) { _state = System.IO.Compression.InflaterState.ReadingBType; return false; } _blockType = (System.IO.Compression.BlockType)_input.GetBits(2); if (_blockType == System.IO.Compression.BlockType.Dynamic) { _state = System.IO.Compression.InflaterState.ReadingNumLitCodes; } else if (_blockType == System.IO.Compression.BlockType.Static) { _literalLengthTree = System.IO.Compression.HuffmanTree.StaticLiteralLengthTree; _distanceTree = System.IO.Compression.HuffmanTree.
System.IO.Compression.FileSystem.dll
Decompiled 3 months agousing System.Buffers; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using System.Text; [assembly: AssemblyFileVersion("4.6.57.0")] [assembly: AssemblyInformationalVersion("4.6.57.0")] [assembly: AssemblyCopyright("(c) Various Mono authors")] [assembly: AssemblyProduct("Mono Common Language Infrastructure")] [assembly: AssemblyCompany("Mono development team")] [assembly: AssemblyDefaultAlias("System.IO.Compression.FileSystem.dll")] [assembly: AssemblyDescription("System.IO.Compression.FileSystem.dll")] [assembly: AssemblyTitle("System.IO.Compression.FileSystem.dll")] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: CompilationRelaxations(8)] [assembly: AssemblyDelaySign(true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("4.0.0.0")] [module: UnverifiableCode] internal static class Consts { public const string MonoCorlibVersion = "1A5E0066-58DC-428A-B21C-0AD6CDAE2789"; public const string MonoVersion = "6.13.0.0"; public const string MonoCompany = "Mono development team"; public const string MonoProduct = "Mono Common Language Infrastructure"; public const string MonoCopyright = "(c) Various Mono authors"; public const string FxVersion = "4.0.0.0"; public const string FxFileVersion = "4.6.57.0"; public const string EnvironmentVersion = "4.0.30319.42000"; public const string VsVersion = "0.0.0.0"; public const string VsFileVersion = "11.0.0.0"; private const string PublicKeyToken = "b77a5c561934e089"; public const string AssemblyI18N = "I18N, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMicrosoft_JScript = "Microsoft.JScript, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=0.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblyMono_Http = "Mono.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Posix = "Mono.Posix, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Security = "Mono.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=4.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; public const string AssemblyCorlib = "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem = "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Data = "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Design = "System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing = "System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Messaging = "System.Messaging, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Security = "System.Security, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Web = "System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_2_0 = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystemCore_3_5 = "System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string AssemblySystem_Core = "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; public const string WindowsBase_3_0 = "WindowsBase, Version=3.0.0.0, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyWindowsBase = "WindowsBase, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_3_5 = "PresentationCore, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationCore_4_0 = "PresentationCore, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblyPresentationFramework_3_5 = "PresentationFramework, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"; public const string AssemblySystemServiceModel_3_0 = "System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; } internal class SR { public const string IO_DirectoryNameWithData = "Zip entry name ends in directory separator character but contains data."; public const string IO_ExtractingResultsInOutside = "Extracting Zip entry would have resulted in a file outside the specified destination directory."; } namespace System.IO { internal static class PathInternal { private static readonly bool s_isCaseSensitive = GetIsCaseSensitive(); internal static StringComparison StringComparison { get { if (!s_isCaseSensitive) { return StringComparison.OrdinalIgnoreCase; } return StringComparison.Ordinal; } } internal static bool IsCaseSensitive => s_isCaseSensitive; private static bool GetIsCaseSensitive() { try { string text = Path.Combine(Path.GetTempPath(), "CASESENSITIVETEST" + Guid.NewGuid().ToString("N")); using (new FileStream(text, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None, 4096, FileOptions.DeleteOnClose)) { return !File.Exists(text.ToLowerInvariant()); } } catch (Exception) { return false; } } } } namespace System.IO.Compression { public static class ZipFile { private const char PathSeparator = '/'; public static ZipArchive OpenRead(string archiveFileName) { return Open(archiveFileName, ZipArchiveMode.Read); } public static ZipArchive Open(string archiveFileName, ZipArchiveMode mode) { return Open(archiveFileName, mode, null); } public static ZipArchive Open(string archiveFileName, ZipArchiveMode mode, Encoding entryNameEncoding) { FileMode mode2; FileAccess access; FileShare share; switch (mode) { case ZipArchiveMode.Read: mode2 = FileMode.Open; access = FileAccess.Read; share = FileShare.Read; break; case ZipArchiveMode.Create: mode2 = FileMode.CreateNew; access = FileAccess.Write; share = FileShare.None; break; case ZipArchiveMode.Update: mode2 = FileMode.OpenOrCreate; access = FileAccess.ReadWrite; share = FileShare.None; break; default: throw new ArgumentOutOfRangeException("mode"); } FileStream fileStream = new FileStream(archiveFileName, mode2, access, share, 4096, useAsync: false); try { return new ZipArchive(fileStream, mode, leaveOpen: false, entryNameEncoding); } catch { fileStream.Dispose(); throw; } } public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName) { DoCreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, null, includeBaseDirectory: false, null); } public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel compressionLevel, bool includeBaseDirectory) { DoCreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, compressionLevel, includeBaseDirectory, null); } public static void CreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel compressionLevel, bool includeBaseDirectory, Encoding entryNameEncoding) { DoCreateFromDirectory(sourceDirectoryName, destinationArchiveFileName, compressionLevel, includeBaseDirectory, entryNameEncoding); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName) { ExtractToDirectory(sourceArchiveFileName, destinationDirectoryName, null); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, bool overwrite) { ExtractToDirectory(sourceArchiveFileName, destinationDirectoryName, null, overwrite); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding entryNameEncoding) { ExtractToDirectory(sourceArchiveFileName, destinationDirectoryName, entryNameEncoding, overwrite: false); } public static void ExtractToDirectory(string sourceArchiveFileName, string destinationDirectoryName, Encoding entryNameEncoding, bool overwrite) { if (sourceArchiveFileName == null) { throw new ArgumentNullException("sourceArchiveFileName"); } using ZipArchive source = Open(sourceArchiveFileName, ZipArchiveMode.Read, entryNameEncoding); source.ExtractToDirectory(destinationDirectoryName, overwrite); } private static void DoCreateFromDirectory(string sourceDirectoryName, string destinationArchiveFileName, CompressionLevel? compressionLevel, bool includeBaseDirectory, Encoding entryNameEncoding) { sourceDirectoryName = Path.GetFullPath(sourceDirectoryName); destinationArchiveFileName = Path.GetFullPath(destinationArchiveFileName); using ZipArchive zipArchive = Open(destinationArchiveFileName, ZipArchiveMode.Create, entryNameEncoding); bool flag = true; DirectoryInfo directoryInfo = new DirectoryInfo(sourceDirectoryName); string fullName = directoryInfo.FullName; if (includeBaseDirectory && directoryInfo.Parent != null) { fullName = directoryInfo.Parent.FullName; } char[] buffer = ArrayPool<char>.Shared.Rent(260); try { foreach (FileSystemInfo item in directoryInfo.EnumerateFileSystemInfos("*", SearchOption.AllDirectories)) { flag = false; int length = item.FullName.Length - fullName.Length; if (item is FileInfo) { string entryName = EntryFromPath(item.FullName, fullName.Length, length, ref buffer); ZipFileExtensions.DoCreateEntryFromFile(zipArchive, item.FullName, entryName, compressionLevel); } else if (item is DirectoryInfo possiblyEmptyDir && IsDirEmpty(possiblyEmptyDir)) { string entryName2 = EntryFromPath(item.FullName, fullName.Length, length, ref buffer, appendPathSeparator: true); zipArchive.CreateEntry(entryName2); } } if (includeBaseDirectory && flag) { zipArchive.CreateEntry(EntryFromPath(directoryInfo.Name, 0, directoryInfo.Name.Length, ref buffer, appendPathSeparator: true)); } } finally { ArrayPool<char>.Shared.Return(buffer, false); } } private static string EntryFromPath(string entry, int offset, int length, ref char[] buffer, bool appendPathSeparator = false) { while (length > 0 && (entry[offset] == Path.DirectorySeparatorChar || entry[offset] == Path.AltDirectorySeparatorChar)) { offset++; length--; } if (length == 0) { if (!appendPathSeparator) { return string.Empty; } return '/'.ToString(); } int num = (appendPathSeparator ? (length + 1) : length); EnsureCapacity(ref buffer, num); entry.CopyTo(offset, buffer, 0, length); for (int i = 0; i < length; i++) { char c = buffer[i]; if (c == Path.DirectorySeparatorChar || c == Path.AltDirectorySeparatorChar) { buffer[i] = '/'; } } if (appendPathSeparator) { buffer[length] = '/'; } return new string(buffer, 0, num); } private static void EnsureCapacity(ref char[] buffer, int min) { if (buffer.Length < min) { int num = buffer.Length * 2; if (num < min) { num = min; } ArrayPool<char>.Shared.Return(buffer, false); buffer = ArrayPool<char>.Shared.Rent(num); } } private static bool IsDirEmpty(DirectoryInfo possiblyEmptyDir) { using IEnumerator<string> enumerator = Directory.EnumerateFileSystemEntries(possiblyEmptyDir.FullName).GetEnumerator(); return !enumerator.MoveNext(); } } [EditorBrowsable(EditorBrowsableState.Never)] public static class ZipFileExtensions { public static ZipArchiveEntry CreateEntryFromFile(this ZipArchive destination, string sourceFileName, string entryName) { return DoCreateEntryFromFile(destination, sourceFileName, entryName, null); } public static ZipArchiveEntry CreateEntryFromFile(this ZipArchive destination, string sourceFileName, string entryName, CompressionLevel compressionLevel) { return DoCreateEntryFromFile(destination, sourceFileName, entryName, compressionLevel); } public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName) { source.ExtractToDirectory(destinationDirectoryName, overwrite: false); } public static void ExtractToDirectory(this ZipArchive source, string destinationDirectoryName, bool overwrite) { if (source == null) { throw new ArgumentNullException("source"); } if (destinationDirectoryName == null) { throw new ArgumentNullException("destinationDirectoryName"); } string text = Directory.CreateDirectory(destinationDirectoryName).FullName; if (!text.EndsWith(Path.DirectorySeparatorChar)) { text += Path.DirectorySeparatorChar; } foreach (ZipArchiveEntry entry in source.Entries) { string fullPath = Path.GetFullPath(Path.Combine(text, entry.FullName)); if (!fullPath.StartsWith(text, System.IO.PathInternal.StringComparison)) { throw new IOException("Extracting Zip entry would have resulted in a file outside the specified destination directory."); } if (Path.GetFileName(fullPath).Length == 0) { if (entry.Length != 0L) { throw new IOException("Zip entry name ends in directory separator character but contains data."); } Directory.CreateDirectory(fullPath); } else { Directory.CreateDirectory(Path.GetDirectoryName(fullPath)); entry.ExtractToFile(fullPath, overwrite); } } } internal static ZipArchiveEntry DoCreateEntryFromFile(ZipArchive destination, string sourceFileName, string entryName, CompressionLevel? compressionLevel) { if (destination == null) { throw new ArgumentNullException("destination"); } if (sourceFileName == null) { throw new ArgumentNullException("sourceFileName"); } if (entryName == null) { throw new ArgumentNullException("entryName"); } using Stream stream = new FileStream(sourceFileName, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, useAsync: false); ZipArchiveEntry zipArchiveEntry = (compressionLevel.HasValue ? destination.CreateEntry(entryName, compressionLevel.Value) : destination.CreateEntry(entryName)); DateTime dateTime = File.GetLastWriteTime(sourceFileName); if (dateTime.Year < 1980 || dateTime.Year > 2107) { dateTime = new DateTime(1980, 1, 1, 0, 0, 0); } zipArchiveEntry.LastWriteTime = dateTime; using (Stream destination2 = zipArchiveEntry.Open()) { stream.CopyTo(destination2); } return zipArchiveEntry; } public static void ExtractToFile(this ZipArchiveEntry source, string destinationFileName) { source.ExtractToFile(destinationFileName, overwrite: false); } public static void ExtractToFile(this ZipArchiveEntry source, string destinationFileName, bool overwrite) { if (source == null) { throw new ArgumentNullException("source"); } if (destinationFileName == null) { throw new ArgumentNullException("destinationFileName"); } FileMode mode = ((!overwrite) ? FileMode.CreateNew : FileMode.Create); using (Stream destination = new FileStream(destinationFileName, mode, FileAccess.Write, FileShare.None, 4096, useAsync: false)) { using Stream stream = source.Open(); stream.CopyTo(destination); } File.SetLastWriteTime(destinationFileName, source.LastWriteTime.DateTime); } } }