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 YosukeCommando v1.0.1
YosukeCommando.dll
Decompiled 7 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using MonoMod.RuntimeDetour.HookGen; using On.RoR2; using R2API.Networking; using R2API.Networking.Interfaces; using RoR2; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.Rendering; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] namespace YosukeCommando; internal static class SoundBanks { private static bool initialized = false; public static string SoundBankDirectory => Path.Combine(Path.GetDirectoryName(YosukeCommandoPlugin.pluginInfo.Location)); public static void Init() { //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_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Invalid comparison between Unknown and I4 //IL_0056: 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_007a: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Invalid comparison between Unknown and I4 //IL_009e: Unknown result type (might be due to invalid IL or missing references) if (!initialized) { initialized = true; AKRESULT val = AkSoundEngine.AddBasePath(SoundBankDirectory); if ((int)val == 1) { Log.Info("Added bank base path : " + SoundBankDirectory); } else { Log.Error("Error adding base path : " + SoundBankDirectory + " " + $"Error code : {val}"); } uint num = default(uint); AkSoundEngine.LoadBank("yosuke.bnk", ref num); if ((int)val == 1) { Log.Info("Added bank : yosuke.bnk"); } else { Log.Error("Error loading bank : yosuke.bnk " + $"Error code : {val}"); } } } } 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("com.Miyowi.YosukeCommando", "YosukeCommando", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class YosukeCommandoPlugin : BaseUnityPlugin { private class FieldException : Exception { public FieldException(string message, Exception innerException) : base(message, innerException) { } } private static AssetBundle assetBundle; private static readonly List<Material> materialsWithRoRShader = new List<Material>(); public static PluginInfo pluginInfo; public static List<SkinDef> voiceSkins = new List<SkinDef>(); public static readonly uint[] tpStartSounds = new uint[4] { 3565520639u, 3855392950u, 3901822998u, 3937490629u }; public static readonly uint[] deathSounds = new uint[6] { 1152865269u, 2282714723u, 2328593888u, 2568338457u, 2605661822u, 2918565797u }; public static readonly uint[] tpCompleteSounds = new uint[7] { 1761906986u, 126719480u, 1894428945u, 2584319992u, 2657769444u, 3678394344u, 3746141353u }; public static Random rnd = new Random(); internal static YosukeCommandoPlugin Instance { get; private set; } internal static ManualLogSource InstanceLogger { get { YosukeCommandoPlugin instance = Instance; return (instance != null) ? ((BaseUnityPlugin)instance).Logger : null; } } public static ConfigEntry<bool> voiceEnabled { get; set; } public void Awake() { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Expected O, but got Unknown voiceEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("Audio", "Voice Enabled", true, "Play voice lines during certain events when someone has the skin on."); Log.Init(((BaseUnityPlugin)this).Logger); pluginInfo = ((BaseUnityPlugin)this).Info; TeleporterInteraction.OnInteractionBegin += new hook_OnInteractionBegin(TPStart); CharacterBody.OnDeathStart += new hook_OnDeathStart(Death); TeleporterInteraction.onTeleporterChargedGlobal += TPCharged; NetworkingAPI.RegisterMessageType<SyncSound>(); } private void Start() { Instance = this; using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("YosukeCommando.miyowiyosukecommando")) { assetBundle = AssetBundle.LoadFromStream(stream); } ((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)BodyCatalogInit); HookEndpointManager.Add((MethodBase)typeof(Language).GetMethod("LoadStrings"), (Delegate)new Action<Action<Language>, Language>(LanguageLoadStrings)); ReplaceShaders(); } private static void TPStart(orig_OnInteractionBegin orig, TeleporterInteraction self, Interactor activator) { //IL_007c: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, activator); if (!NetworkServer.active) { return; } TeleporterInteraction instance = TeleporterInteraction.instance; if (instance != null && !instance.isCharged) { SkinDef item = SkinCatalog.FindCurrentSkinDefForBodyInstance(((Component)activator).gameObject); if (voiceSkins.Contains(item)) { int num = rnd.Next(0, tpStartSounds.Length); uint soundID = tpStartSounds[num]; NetMessageExtensions.Send((INetMessage)(object)new SyncSound(((Component)activator).GetComponent<CharacterBody>().master.networkIdentity.netId, soundID), (NetworkDestination)1); } } } private static void Death(orig_OnDeathStart orig, CharacterBody self) { //IL_0053: Unknown result type (might be due to invalid IL or missing references) if (NetworkServer.active) { SkinDef item = SkinCatalog.FindCurrentSkinDefForBodyInstance(((Component)self).gameObject); if (voiceSkins.Contains(item)) { int num = rnd.Next(0, deathSounds.Length); uint soundID = deathSounds[num]; NetMessageExtensions.Send((INetMessage)(object)new SyncSound(self.master.networkIdentity.netId, soundID), (NetworkDestination)1); } orig.Invoke(self); } } private static void TPCharged(TeleporterInteraction teleporterInteraction) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { return; } foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { try { SkinDef item = SkinCatalog.FindCurrentSkinDefForBodyInstance(((Component)instance.master.GetBody()).gameObject); if (voiceSkins.Contains(item)) { int num = rnd.Next(0, tpCompleteSounds.Length); uint soundID = tpCompleteSounds[num]; NetMessageExtensions.Send((INetMessage)(object)new SyncSound(instance.master.networkIdentity.netId, soundID), (NetworkDestination)1); } } catch (Exception data) { Log.Error(data); } } } private static void ReplaceShaders() { LoadMaterialsWithReplacedShader("RoR2/Base/Shaders/HGStandard.shader", "Assets/Resources/Yosuke/YosukeMat.mat", "Assets/Resources/Yosuke/YosukePS2Mat.mat"); } private static void LoadMaterialsWithReplacedShader(string shaderPath, params string[] materialPaths) { //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) Shader shader = Addressables.LoadAssetAsync<Shader>((object)shaderPath).WaitForCompletion(); foreach (string text in materialPaths) { Material val = assetBundle.LoadAsset<Material>(text); val.shader = shader; materialsWithRoRShader.Add(val); } } private static void LanguageLoadStrings(Action<Language> orig, Language self) { orig(self); self.SetStringByToken("MIYOWI_SKIN_YOSUKE_NAME", "Yosuke"); self.SetStringByToken("MIYOWI_SKIN_YOSUKEPS2_NAME", "YosukePS2"); } private static void Nothing(Action<SkinDef> orig, SkinDef self) { } private static void BodyCatalogInit() { MethodInfo method = typeof(SkinDef).GetMethod("Awake", BindingFlags.Instance | BindingFlags.NonPublic); HookEndpointManager.Add((MethodBase)method, (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing)); SoundBanks.Init(); AddCommandoBodyYosukePS2Skin(); HookEndpointManager.Remove((MethodBase)method, (Delegate)new Action<Action<SkinDef>, SkinDef>(Nothing)); } private static void AddCommandoBodyYosukeSkin() { //IL_0273: Unknown result type (might be due to invalid IL or missing references) string text = "CommandoBody"; string text2 = "Yosuke"; try { GameObject val = BodyCatalog.FindBodyPrefab(text); if (!Object.op_Implicit((Object)(object)val)) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist")); return; } ModelLocator component = val.GetComponent<ModelLocator>(); if (!Object.op_Implicit((Object)(object)component)) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component")); return; } GameObject gameObject = ((Component)component.modelTransform).gameObject; ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null); if (!Object.op_Implicit((Object)(object)skinController)) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component")); return; } Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true); SkinDef skin = ScriptableObject.CreateInstance<SkinDef>(); TryCatchThrow("Icon", delegate { skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\YosukeCommando\\Icons\\YosukeIcon.png"); }); ((Object)skin).name = text2; skin.nameToken = "MIYOWI_SKIN_YOSUKE_NAME"; skin.rootObject = gameObject; TryCatchThrow("Base Skins", delegate { skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { skinController.skins[0] }; }); TryCatchThrow("Unlockable Name", delegate { skin.unlockableDef = null; }); TryCatchThrow("Game Object Activations", delegate { skin.gameObjectActivations = Array.Empty<GameObjectActivation>(); }); TryCatchThrow("Renderer Infos", delegate { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_004d: Unknown result type (might be due to invalid IL or missing references) skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[1] { new RendererInfo { defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Yosuke/YosukeMat.mat"), defaultShadowCastingMode = (ShadowCastingMode)1, ignoreOverlays = false, renderer = renderers[6] } }; }); TryCatchThrow("Mesh Replacements", delegate { //IL_0011: 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_003d: Unknown result type (might be due to invalid IL or missing references) skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1] { new MeshReplacement { mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\YosukeCommando\\Meshes\\5_part1-eyebrow_1_0_0.005.mesh"), renderer = renderers[6] } }; }); TryCatchThrow("Minion Skin Replacements", delegate { skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>(); }); TryCatchThrow("Projectile Ghost Replacements", delegate { skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>(); }); Array.Resize(ref skinController.skins, skinController.skins.Length + 1); skinController.skins[skinController.skins.Length - 1] = skin; BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = skinController.skins; voiceSkins.Add(skin); } catch (FieldException ex) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\"")); InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message)); InstanceLogger.LogError((object)ex.InnerException); } catch (Exception ex2) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\"")); InstanceLogger.LogError((object)ex2); } } private static void AddCommandoBodyYosukePS2Skin() { //IL_0273: Unknown result type (might be due to invalid IL or missing references) string text = "CommandoBody"; string text2 = "YosukePS2"; try { GameObject val = BodyCatalog.FindBodyPrefab(text); if (!Object.op_Implicit((Object)(object)val)) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin because \"" + text + "\" doesn't exist")); return; } ModelLocator component = val.GetComponent<ModelLocator>(); if (!Object.op_Implicit((Object)(object)component)) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelLocator\" component")); return; } GameObject gameObject = ((Component)component.modelTransform).gameObject; ModelSkinController skinController = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null); if (!Object.op_Implicit((Object)(object)skinController)) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\" because it doesn't have \"ModelSkinController\" component")); return; } Renderer[] renderers = gameObject.GetComponentsInChildren<Renderer>(true); SkinDef skin = ScriptableObject.CreateInstance<SkinDef>(); TryCatchThrow("Icon", delegate { skin.icon = assetBundle.LoadAsset<Sprite>("Assets\\SkinMods\\YosukeCommando\\Icons\\YosukePS2Icon.png"); }); ((Object)skin).name = text2; skin.nameToken = "MIYOWI_SKIN_YOSUKEPS2_NAME"; skin.rootObject = gameObject; TryCatchThrow("Base Skins", delegate { skin.baseSkins = (SkinDef[])(object)new SkinDef[1] { skinController.skins[0] }; }); TryCatchThrow("Unlockable Name", delegate { skin.unlockableDef = null; }); TryCatchThrow("Game Object Activations", delegate { skin.gameObjectActivations = Array.Empty<GameObjectActivation>(); }); TryCatchThrow("Renderer Infos", delegate { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_004d: Unknown result type (might be due to invalid IL or missing references) skin.rendererInfos = (RendererInfo[])(object)new RendererInfo[1] { new RendererInfo { defaultMaterial = assetBundle.LoadAsset<Material>("Assets/Resources/Yosuke/YosukePS2Mat.mat"), defaultShadowCastingMode = (ShadowCastingMode)1, ignoreOverlays = false, renderer = renderers[6] } }; }); TryCatchThrow("Mesh Replacements", delegate { //IL_0011: 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_003d: Unknown result type (might be due to invalid IL or missing references) skin.meshReplacements = (MeshReplacement[])(object)new MeshReplacement[1] { new MeshReplacement { mesh = assetBundle.LoadAsset<Mesh>("Assets\\SkinMods\\YosukeCommando\\Meshes\\yousuke_body_4_split_4_Part.mesh"), renderer = renderers[6] } }; }); TryCatchThrow("Minion Skin Replacements", delegate { skin.minionSkinReplacements = Array.Empty<MinionSkinReplacement>(); }); TryCatchThrow("Projectile Ghost Replacements", delegate { skin.projectileGhostReplacements = Array.Empty<ProjectileGhostReplacement>(); }); Array.Resize(ref skinController.skins, skinController.skins.Length + 1); skinController.skins[skinController.skins.Length - 1] = skin; BodyCatalog.skins[BodyCatalog.FindBodyIndex(val)] = skinController.skins; voiceSkins.Add(skin); } catch (FieldException ex) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\"")); InstanceLogger.LogWarning((object)("Field causing issue: " + ex.Message)); InstanceLogger.LogError((object)ex.InnerException); } catch (Exception ex2) { InstanceLogger.LogWarning((object)("Failed to add \"" + text2 + "\" skin to \"" + text + "\"")); InstanceLogger.LogError((object)ex2); } } private static void TryCatchThrow(string message, Action action) { try { action?.Invoke(); } catch (Exception innerException) { throw new FieldException(message, innerException); } } } public class SyncSound : INetMessage, ISerializableObject { private NetworkInstanceId sourceId; private uint soundID; public SyncSound() { } public SyncSound(NetworkInstanceId sourceId, uint soundID) { //IL_0009: 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) this.sourceId = sourceId; this.soundID = soundID; } public void Serialize(NetworkWriter writer) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) writer.Write(sourceId); writer.Write(soundID); } public void Deserialize(NetworkReader reader) { //IL_0003: 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) sourceId = reader.ReadNetworkId(); soundID = reader.ReadUInt32(); } public void OnReceived() { if (YosukeCommandoPlugin.voiceEnabled.Value) { CharacterMaster val = CharacterMaster.instancesList.Find((CharacterMaster x) => x.networkIdentity.netId == sourceId); AkSoundEngine.PostEvent(soundID, ((Component)val.GetBody()).gameObject); } } }