Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of RoR2MumbleLink v1.0.1
RoR2MumbleLink.dll
Decompiled 2 months agousing System; using System.Diagnostics; using System.IO.MemoryMappedFiles; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using R2API.Utils; using RoR2; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("RoR2MumbleLink")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+4758294539069c38548e1869e460d71b083607d3")] [assembly: AssemblyProduct("RoR2MumbleLink")] [assembly: AssemblyTitle("RoR2MumbleLink")] [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 RoR2MumbleLink { [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode, Pack = 4)] public struct LinkedMem { public uint uiVersion; public uint uiTick; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public float[] fAvatarPosition; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public float[] fAvatarFront; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public float[] fAvatarTop; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string name; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public float[] fCameraPosition; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public float[] fCameraFront; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public float[] fCameraTop; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)] public string identity; public uint context_len; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public byte[] context; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2048)] public string description; } internal static class Log { private static ManualLogSource _logSource; internal static void Init(ManualLogSource logSource) { _logSource = logSource; } internal static void Debug(object data) { _logSource.LogDebug(data); } internal static void Error(object data) { _logSource.LogError(data); } internal static void Fatal(object data) { _logSource.LogFatal(data); } internal static void Info(object data) { _logSource.LogInfo(data); } internal static void Message(object data) { _logSource.LogMessage(data); } internal static void Warning(object data) { _logSource.LogWarning(data); } } [BepInPlugin("Zyrex.RoR2MumbleLink", "RoR2MumbleLink", "1.0.1")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class MumbleLink : BaseUnityPlugin { public const string PluginGUID = "Zyrex.RoR2MumbleLink"; public const string PluginAuthor = "Zyrex"; public const string PluginName = "RoR2MumbleLink"; public const string PluginVersion = "1.0.1"; private MumbleLinkFile _mumble; private PlayerTracker _playerTracker; public void Awake() { Log.Init(((BaseUnityPlugin)this).Logger); Log.Message("Loaded Mumble Link!"); _mumble = new MumbleLinkFile(); _playerTracker = new PlayerTracker(); } private void Update() { _playerTracker.Update(_mumble); } private void OnDestroy() { _mumble?.Dispose(); } } public sealed class MumbleLinkFile : IDisposable { private const string FILE_NAME = "MumbleLink"; private readonly MemoryMappedFile _file; private readonly MemoryMappedViewAccessor _accessor; private bool _disposed; public MumbleLinkFile() { _file = MemoryMappedFile.CreateOrOpen("MumbleLink", Marshal.SizeOf<LinkedMem>(), MemoryMappedFileAccess.ReadWrite); _accessor = _file.CreateViewAccessor(); } public void Write(LinkedMem lm) { if (_disposed) { throw new ObjectDisposedException(GetType().FullName); } int num = Marshal.SizeOf<LinkedMem>(); IntPtr intPtr = Marshal.AllocHGlobal(num); try { Marshal.StructureToPtr(lm, intPtr, fDeleteOld: false); byte[] array = new byte[num]; Marshal.Copy(intPtr, array, 0, num); _accessor.WriteArray(0L, array, 0, num); } finally { Marshal.FreeHGlobal(intPtr); } } public void Dispose() { if (!_disposed) { _disposed = true; _accessor.Dispose(); _file.Dispose(); } } } internal class PlayerTracker { private CharacterBody _localPlayerBody; private LinkedMem lm; private bool initialized = false; internal PlayerTracker() { CharacterBody.onBodyStartGlobal += OnBodyStart; CharacterBody.onBodyDestroyGlobal += OnBodyDestroy; lm.uiVersion = 2u; lm.name = "Risk of Rain 2"; lm.description = "RoR2 Mumble Link Positional Audio"; lm.context = new byte[256]; byte[] bytes = Encoding.ASCII.GetBytes("RoR2ServerContext"); Array.Copy(bytes, lm.context, bytes.Length); lm.context_len = (uint)bytes.Length; } private void OnBodyStart(CharacterBody body) { if (body.isPlayerControlled && body.hasEffectiveAuthority) { _localPlayerBody = body; } } private void OnBodyDestroy(CharacterBody body) { if ((Object)(object)body == (Object)(object)_localPlayerBody) { _localPlayerBody = null; } } public void Update(MumbleLinkFile file) { //IL_00cd: 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_00e9: 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_0116: Unknown result type (might be due to invalid IL or missing references) //IL_0124: 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) //IL_0151: 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_0185: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) Camera main = Camera.main; if (PlayerCharacterMasterController.instances.Count > 1 && !((Object)(object)_localPlayerBody == (Object)null) && file != null && !((Object)(object)main == (Object)null)) { if (!initialized) { lm.identity = ((Object)_localPlayerBody).name; initialized = true; } if (string.IsNullOrEmpty(lm.identity)) { lm.identity = ((Object)_localPlayerBody).name; } lm.uiTick++; Transform transform = _localPlayerBody.transform; lm.fAvatarPosition = new float[3] { transform.position.x, transform.position.y, transform.position.z }; lm.fAvatarFront = new float[3] { transform.forward.x, transform.forward.y, transform.forward.z }; lm.fAvatarTop = new float[3] { transform.up.x, transform.up.y, transform.up.z }; Transform transform2 = ((Component)main).transform; lm.fCameraPosition = new float[3] { transform2.position.x, transform2.position.y, transform2.position.z }; lm.fCameraFront = new float[3] { transform2.forward.x, transform2.forward.y, transform2.forward.z }; lm.fCameraTop = new float[3] { transform2.up.x, transform2.up.y, transform2.up.z }; file.Write(lm); } } } }