using 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 System.Text; using BepInEx; using BepInEx.Bootstrap; using ChatCommands; using ChatCommands.Attributes; using ComputerysModdingUtilities; using HarmonyLib; using Microsoft.CodeAnalysis; using MyceliumNetworking; using Newtonsoft.Json; using SpawnRemap; using UnityEngine; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: StraftatMod(false)] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Koki")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+32a84bb9f23238789d5c6522a326f35230b78285")] [assembly: AssemblyProduct("SpawnRemap")] [assembly: AssemblyTitle("SpawnRemap")] [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; } } } [CommandCategory("SpawnRemap")] internal class SpawnRemapCommands { private const CommandFlags _spawnEditFlags = 7; [Command(/*Could not decode attribute arguments.*/)] [CommandAliases(new string[] { "srps" })] private static string PlaceSpawn(int spawnPointIndex, bool twovtwo = false) { //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_0025: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: 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_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) if (!twovtwo && spawnPointIndex != 0 && spawnPointIndex != 1) { throw new CommandException("Input a spawn # from 0-1!"); } if (twovtwo && (spawnPointIndex < 0 || spawnPointIndex > 3)) { throw new CommandException("Input a spawn # from 0-3!"); } FirstPersonController localPlayer = Settings.Instance.localPlayer; Scene activeScene = SceneManager.GetActiveScene(); string name = ((Scene)(ref activeScene)).name; if (!SaveData.spawnRemaps.TryGetValue(name, out var value)) { value = new List(6); value.AddRange(new <>z__ReadOnlyArray(new SpawnData[6])); } if (twovtwo) { spawnPointIndex += 2; } List list = value; int index = spawnPointIndex; SpawnData value2 = new SpawnData { position = ((Component)localPlayer).transform.position }; float rotationX = localPlayer.rotationX; Quaternion rotation = ((Component)localPlayer).transform.rotation; value2.rotation = (SerializableVector3)new Vector3(rotationX, ((Quaternion)(ref rotation)).eulerAngles.y, localPlayer.rotationZ); list[index] = value2; SaveData.spawnRemaps[name] = value; SaveData.Save(); RemapSpawnLocal.SendSpawnPoints(value); if (twovtwo) { return $"Set spawnpoint {spawnPointIndex - 2} for 2v2"; } return $"Set spawnpoint {spawnPointIndex} for 1v1"; } [Command(/*Could not decode attribute arguments.*/)] [CommandAliases(new string[] { "srrs" })] private static string ResetSpawn(string spawnPointIndex, bool twovtwo = false) { //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) //IL_0022: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: 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) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); string name = ((Scene)(ref activeScene)).name; if (!SaveData.spawnRemaps.TryGetValue(name, out var value)) { throw new CommandException("No spawn remaps have been set for this map."); } if (spawnPointIndex == "all") { if (twovtwo) { value.RemoveRange(2, 4); value.AddRange(new <>z__ReadOnlyArray(new SpawnData[4])); } else { value[0] = default(SpawnData); value[1] = default(SpawnData); } } else { if (!int.TryParse(spawnPointIndex, out var result)) { throw new CommandException("Input a spawn # from 0-3, or the word \"all\"!"); } if (!twovtwo && result != 0 && result != 1) { throw new CommandException("Input a spawn # from 0-1!"); } if (twovtwo && (result < 0 || result > 3)) { throw new CommandException("Input a spawn # from 0-3!"); } int num = (twovtwo ? 2 : 0); if ((Vector3)value[result + num].rotation == default(Vector3)) { throw new CommandException($"Spawn #{result} has no remap!"); } value[result + num] = default(SpawnData); } SaveData.spawnRemaps[name] = value; SaveData.Save(); RemapSpawnLocal.SendSpawnPoints(value); return "Removed spawnpoint " + spawnPointIndex; } [Command(/*Could not decode attribute arguments.*/)] [CommandAliases(new string[] { "srexp" })] private static string ExportSpawns() { GUIUtility.systemCopyBuffer = SaveData.Compress(JsonConvert.SerializeObject((object)SaveData.spawnRemaps)); return "Exported spawn data to clipboard!"; } [Command(/*Could not decode attribute arguments.*/)] [CommandAliases(new string[] { "srimp" })] private static string ImportSpawns() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) try { SaveData.spawnRemaps = JsonConvert.DeserializeObject>>(SaveData.Decompress(GUIUtility.systemCopyBuffer)); SaveData.Save(); } catch (Exception) { throw new CommandException("Invalid code!"); } return "Imported spawn data!"; } } internal class RemapSpawnLocal : MonoBehaviour { private const int MyceliumID = 239487836; internal static List originalSpawnLocations; private void Awake() { MyceliumNetwork.RegisterNetworkObject((object)this, 239487836u, 0); originalSpawnLocations = new List(6) { default(SpawnData), default(SpawnData), default(SpawnData), default(SpawnData), default(SpawnData), default(SpawnData) }; } internal static void SendSpawnPoints(List spawns) { MyceliumNetwork.RPC(239487836u, "MoveSpawnPoints", (ReliableType)1, new object[1] { JsonConvert.SerializeObject((object)spawns) }); } [CustomRPC] private void MoveSpawnPoints(string spawnJSON) { //IL_00eb: 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_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0111: 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: Unknown result type (might be due to invalid IL or missing references) //IL_0218: Unknown result type (might be due to invalid IL or missing references) //IL_0230: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: 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_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: 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_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_013c: 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) List list; try { list = JsonConvert.DeserializeObject>(spawnJSON); } catch (Exception arg) { Debug.LogError((object)$"SpawnRemapper: Failed to decode JSON from host: {arg}"); return; } List source = (from s in Object.FindObjectsByType((FindObjectsSortMode)0) select ((Component)s).transform into t orderby ((Object)t).name select t).ToList(); List list2 = new List(); list2.AddRange(source.Where((Transform t) => ((Component)t.parent).tag != "Spawnpoints4Player")); list2.AddRange(source.Where((Transform t) => ((Component)t.parent).tag == "Spawnpoints4Player")); source = list2; for (int i = 0; i < list.Count; i++) { Transform val = source[i]; if ((Vector3)list[i].position == default(Vector3)) { if ((Vector3)originalSpawnLocations[i].position != default(Vector3)) { val.position = originalSpawnLocations[i].position; val.eulerAngles = originalSpawnLocations[i].rotation; } continue; } if ((Vector3)originalSpawnLocations[i].position == default(Vector3)) { SpawnData value = originalSpawnLocations[i]; value.position = val.position; Quaternion rotation = val.rotation; float x = ((Quaternion)(ref rotation)).eulerAngles.x; rotation = val.rotation; float y = ((Quaternion)(ref rotation)).eulerAngles.y; rotation = val.rotation; value.rotation = (SerializableVector3)new Vector3(x, y, ((Quaternion)(ref rotation)).eulerAngles.z); originalSpawnLocations[i] = value; } val.position = list[i].position; val.eulerAngles = list[i].rotation; } } } internal static class ApplyRemap { internal static void Init() { SceneManager.sceneLoaded += DetermineRemapping; } private static void DetermineRemapping(Scene s, LoadSceneMode mode) { RemapSpawnLocal.originalSpawnLocations = new List(6) { default(SpawnData), default(SpawnData), default(SpawnData), default(SpawnData), default(SpawnData), default(SpawnData) }; if (SaveData.spawnRemaps.ContainsKey(((Scene)(ref s)).name)) { RemapSpawnLocal.SendSpawnPoints(SaveData.spawnRemaps[((Scene)(ref s)).name]); } } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.koki.spawnremap", "Spawn Remapper", "1.1.1")] public class SRPlugin : BaseUnityPlugin { private Harmony _harmony = new Harmony("com.koki.spawnremap"); private void Awake() { ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; SaveData.Init(); ApplyRemap.Init(); ((Component)this).gameObject.AddComponent(); if (Chainloader.PluginInfos.ContainsKey("kestrel.straftat.chatcommands")) { RegisterCommands(); } } private void OnDestroy() { _harmony.UnpatchSelf(); } private void RegisterCommands() { CommandRegistry.RegisterCommandsFromAssembly(); } } namespace SpawnRemap { [Serializable] internal struct SpawnData { public SerializableVector3 position; public SerializableVector3 rotation; } internal static class SaveData { private const string _saveFilename = "com.koki.spawnremap_spawnpoint_data.json"; private static string _savePath; internal static Dictionary> spawnRemaps; internal static void Init() { _savePath = Path.Combine(Paths.ConfigPath, "com.koki.spawnremap_spawnpoint_data.json"); try { if (File.Exists(_savePath)) { spawnRemaps = JsonConvert.DeserializeObject>>(File.ReadAllText(_savePath)); } if (spawnRemaps == null) { spawnRemaps = new Dictionary>(); Save(); } } catch (Exception arg) { Debug.LogError((object)$"SpawnRemapper: Failed to read save data: {arg}"); } } internal static void Save() { try { File.WriteAllText(_savePath, JsonConvert.SerializeObject((object)spawnRemaps, (Formatting)1)); } catch (Exception arg) { Debug.LogError((object)$"SpawnRemapper: Failed to save data {arg}"); } } internal static string Compress(string text) { if (string.IsNullOrEmpty(text)) { return text; } byte[] bytes = Encoding.UTF8.GetBytes(text); using MemoryStream memoryStream = new MemoryStream(); using (DeflateStream deflateStream = new DeflateStream(memoryStream, CompressionMode.Compress, leaveOpen: true)) { deflateStream.Write(bytes, 0, bytes.Length); } memoryStream.Position = 0L; return Convert.ToBase64String(memoryStream.ToArray()); } internal static string Decompress(string compressedText) { if (string.IsNullOrEmpty(compressedText)) { return compressedText; } using MemoryStream stream = new MemoryStream(Convert.FromBase64String(compressedText)); using DeflateStream deflateStream = new DeflateStream(stream, CompressionMode.Decompress); using MemoryStream memoryStream = new MemoryStream(); deflateStream.CopyTo(memoryStream); return Encoding.UTF8.GetString(memoryStream.ToArray()); } } [Serializable] internal struct SerializableVector3 { public float x; public float y; public float z; public SerializableVector3(float x, float y, float z) { this.x = x; this.y = y; this.z = z; } public static implicit operator Vector3(SerializableVector3 sVec) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) return new Vector3(sVec.x, sVec.y, sVec.z); } public static implicit operator SerializableVector3(Vector3 uVec) { //IL_0000: 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_000c: Unknown result type (might be due to invalid IL or missing references) return new SerializableVector3(uVec.x, uVec.y, uVec.z); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "com.koki.spawnremap"; public const string PLUGIN_NAME = "Spawn Remapper"; public const string PLUGIN_VERSION = "1.1.1"; } } [CompilerGenerated] internal sealed class <>z__ReadOnlyArray : IEnumerable, ICollection, IList, IEnumerable, IReadOnlyCollection, IReadOnlyList, ICollection, IList { int ICollection.Count => _items.Length; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection.Count => _items.Length; T IReadOnlyList.this[int index] => _items[index]; int ICollection.Count => _items.Length; bool ICollection.IsReadOnly => true; T IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyArray(T[] items) { _items = items; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { ((ICollection)_items).CopyTo(array, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return ((IList)_items).Contains(value); } int IList.IndexOf(object value) { return ((IList)_items).IndexOf(value); } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.Add(T item) { throw new NotSupportedException(); } void ICollection.Clear() { throw new NotSupportedException(); } bool ICollection.Contains(T item) { return ((ICollection)_items).Contains(item); } void ICollection.CopyTo(T[] array, int arrayIndex) { ((ICollection)_items).CopyTo(array, arrayIndex); } bool ICollection.Remove(T item) { throw new NotSupportedException(); } int IList.IndexOf(T item) { return ((IList)_items).IndexOf(item); } void IList.Insert(int index, T item) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } }