Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Chief v1.1.0
ChiefMod.dll
Decompiled 6 months agousing System; using System.Collections.Generic; 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.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HG; using HarmonyLib; using HunkMod.Modules.Components; using HunkMod.Modules.Survivors; using HunkMod.Modules.Weapons; using Microsoft.CodeAnalysis; using On.RoR2; using RoR2; using RoR2.Skills; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("ChiefMod")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+29c14c552bfd6d957281881d04e96ab7fa47d42e")] [assembly: AssemblyProduct("ChiefMod")] [assembly: AssemblyTitle("ChiefMod")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] [module: UnverifiableCode] 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 ChiefMod { [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.LONK.ChiefMod", "ChiefMod", "1.1.0")] public class ChiefPlugin : BaseUnityPlugin { public const string PluginGUID = "com.LONK.ChiefMod"; public const string PluginAuthor = "LONK"; public const string PluginName = "ChiefMod"; public const string PluginVersion = "1.1.0"; internal static Harmony Harm; public static ChiefPlugin Instance { get; private set; } internal static ConfigEntry<bool> UseGlobalSkins { get; private set; } public void Awake() { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Expected O, but got Unknown Instance = this; Harm = new Harmony("com.LONK.ChiefMod"); Harm.CreateClassProcessor(typeof(PickupPrefabFix)).Patch(); UseGlobalSkins = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Use Global Weapon Skins", false, "If disabled, only Hunk's Chief skin will use Halo's weapon reskins"); Log.Init(((BaseUnityPlugin)this).Logger); ChiefSkin.Init(); WeaponManager.Init(); ChiefSkin.OnChiefSkinLoaded += AddWeapons; ApplySoundReplacements(); } public static void AddWeapons(SkinDef chiefSkin) { WeaponManager.AddWeapon<SMGBehavior>(((BaseWeapon)BaseWeapon<SMG>.instance).weaponDef, "mdlSMGHalo", chiefSkin); WeaponManager.AddWeapon<MUPBehavior>(((BaseWeapon)BaseWeapon<MUP>.instance).weaponDef, "mdlMUPHalo", chiefSkin); WeaponManager.AddWeapon<ARBehavior>(((BaseWeapon)BaseWeapon<AssaultRifle>.instance).weaponDef, "mdlAssaultRifleHalo", chiefSkin); WeaponManager.AddWeapon(((BaseWeapon)BaseWeapon<Shotgun>.instance).weaponDef, "mdlShotgunHalo", chiefSkin); } private void ApplySoundReplacements() { } } internal static class ChiefSkin { [CompilerGenerated] private static class <>O { public static Action <0>__AddRobHunkBodyChiefSkin; public static hook_LoadStrings <1>__Language_LoadStrings; } internal static string skinName = "Master Chief"; internal static string skinNameToken = "LONK_SKIN_CHIEF_NAME"; internal static event Action<SkinDef> OnChiefSkinLoaded; public static void Init() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown ((ResourceAvailability)(ref BodyCatalog.availability)).CallWhenAvailable((Action)AddRobHunkBodyChiefSkin); object obj = <>O.<1>__Language_LoadStrings; if (obj == null) { hook_LoadStrings val = Language_LoadStrings; <>O.<1>__Language_LoadStrings = val; obj = (object)val; } Language.LoadStrings += (hook_LoadStrings)obj; } private static void Language_LoadStrings(orig_LoadStrings orig, Language self) { orig.Invoke(self); self.SetStringByToken(skinNameToken, skinName); } public static void AddRobHunkBodyChiefSkin() { GameObject val = BodyCatalog.FindBodyPrefab("RobHunkBody"); if (!Object.op_Implicit((Object)(object)val)) { Log.Warning("Failed to add \"" + skinName + "\" skin because \"RobHunkBody\" doesn't exist"); return; } ModelLocator component = val.GetComponent<ModelLocator>(); if (!Object.op_Implicit((Object)(object)component)) { Log.Warning("Failed to add \"" + skinName + "\" skin to \"RobHunkBody\" because it doesn't have \"ModelLocator\" component"); return; } GameObject gameObject = ((Component)component.modelTransform).gameObject; ModelSkinController val2 = (Object.op_Implicit((Object)(object)gameObject) ? gameObject.GetComponent<ModelSkinController>() : null); if (!Object.op_Implicit((Object)(object)val2)) { Log.Warning("Failed to add \"" + skinName + "\" skin to \"RobHunkBody\" because it doesn't have \"ModelSkinController\" component"); return; } CharacterModel component2 = gameObject.GetComponent<CharacterModel>(); if (!Object.op_Implicit((Object)(object)component2)) { Log.Warning("Failed to add \"" + skinName + "\" skin to \"RobHunkBody\" because it doesn't have \"CharacterModel\" component"); return; } Renderer[] source = component2.baseRendererInfos.Select((RendererInfo info) => info.renderer).ToArray(); SkinDefParams val3 = ScriptableObject.CreateInstance<SkinDefParams>(); SkinDef val4 = ScriptableObject.CreateInstance<SkinDef>(); ((Object)val4).name = skinNameToken; val4.nameToken = skinNameToken; val4.skinDefParams = val3; val4.rootObject = gameObject; val4.icon = WeaponManager.LoadAsset<Sprite>("Assets/Chief/Skin/Icons/ChiefIcon.png"); val4.baseSkins = Array.Empty<SkinDef>(); val3.rendererInfos = ArrayUtils.Clone<RendererInfo>(component2.baseRendererInfos); val3.rendererInfos[0].defaultMaterial = WeaponManager.LoadAsset<Material>("Assets/Chief/Skin/Materials/Bodu.mat"); val3.rendererInfos[1].defaultMaterial = WeaponManager.LoadAsset<Material>("Assets/Chief/Skin/Materials/Head.mat"); val3.meshReplacements = source.Select(delegate(Renderer r) { //IL_0002: 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) MeshReplacement result = default(MeshReplacement); result.mesh = null; result.renderer = r; return result; }).ToArray(); val3.meshReplacements[0].mesh = WeaponManager.LoadAsset<Mesh>("Assets/Chief/Skin/Meshes/body.asset"); val3.meshReplacements[1].mesh = WeaponManager.LoadAsset<Mesh>("Assets/Chief/Skin/Meshes/head.asset"); ArrayUtils.ArrayAppend<SkinDef>(ref val2.skins, ref val4); ChiefSkin.OnChiefSkinLoaded?.Invoke(ChiefPlugin.UseGlobalSkins.Value ? null : val4); } } internal static class Log { internal 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 ErrorAsset(string assetName) { Error("failed to load asset, " + assetName + ", because it does not exist in any asset bundle"); } internal static void ErrorAssetBundle(string assetName) { Error("failed to load asset bundle " + assetName); } internal static void ErrorTargetMethod(string typeName) { Error("failed to find target property modelPrefab because it does not exist in the class " + typeName); } 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); } } [HarmonyPatch] internal class EscapeSequence { [HarmonyPatch(typeof(HunkController), "StartBGM")] [HarmonyPrefix] public static bool MusicReplacement(HunkController __instance) { return false; } } [HarmonyPatch] internal class PickupPrefabFix { public static readonly Dictionary<ushort, (GameObject oldPrefab, GameObject newPrefab)> prefabsByWeaponIndex = new Dictionary<ushort, (GameObject, GameObject)>(); public static void AddPair(HunkWeaponDef weaponDef, GameObject newPrefab) { prefabsByWeaponIndex[weaponDef.index] = (weaponDef.itemDef.pickupModelPrefab, newPrefab); } [HarmonyPatch(typeof(HunkController), "Start")] [HarmonyPostfix] public static void ReplacePickupModel(HunkController __instance) { //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: 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_008c: 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_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: 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) if (Hunk.gunSkins.Count == 0 || !Object.op_Implicit((Object)(object)__instance.modelSkinController) || !Object.op_Implicit((Object)(object)__instance.characterBody) || !__instance.characterBody.isPlayerControlled || !__instance.characterBody.hasEffectiveAuthority) { return; } SkinDef safe = ArrayUtils.GetSafe<SkinDef>(__instance.modelSkinController.skins, __instance.modelSkinController.currentSkinIndex); foreach (HunkGunSkin gunSkin in Hunk.gunSkins) { if (prefabsByWeaponIndex.TryGetValue(gunSkin.weaponDef.index, out (GameObject, GameObject) value)) { GameObject obj; if (Object.op_Implicit((Object)(object)gunSkin.skinDef) && !((Object)(object)gunSkin.skinDef == (Object)(object)safe)) { (obj, _) = value; } else { obj = value.Item2; } GameObject val = obj; gunSkin.weaponDef.itemDef.pickupModelPrefab = val; PickupCatalog.GetPickupDef(PickupCatalog.FindPickupIndex(gunSkin.weaponDef.itemDef.itemIndex)).displayPrefab = val; } } } } internal static class WeaponManager { internal static readonly Dictionary<string, AssetBundle> loadedBundles = new Dictionary<string, AssetBundle>(); internal static readonly Dictionary<string, IEnumerable<string>> loadedBundleAssetNames = new Dictionary<string, IEnumerable<string>>(); internal static event Action OnLoadCompleted; internal static void Init() { IEnumerable<string> enumerable = from p in Directory.EnumerateFiles(Path.GetDirectoryName(((BaseUnityPlugin)ChiefPlugin.Instance).Info.Location), "*", SearchOption.AllDirectories) where !Path.HasExtension(p) select p; int bundleCount = 0; foreach (string bundleName in enumerable) { int num = bundleCount; bundleCount = num + 1; ((AsyncOperation)AssetBundle.LoadFromFileAsync(bundleName)).completed += delegate(AsyncOperation o) { AssetBundle assetBundle = ((AssetBundleCreateRequest)((o is AssetBundleCreateRequest) ? o : null)).assetBundle; if ((Object)(object)assetBundle != (Object)null) { Log.Debug("Loading assetbundle " + ((Object)assetBundle).name + "..."); loadedBundles[((Object)assetBundle).name] = assetBundle; loadedBundleAssetNames[((Object)assetBundle).name] = assetBundle.GetAllAssetNames().AsEnumerable(); if (loadedBundles.Count == bundleCount) { WeaponManager.OnLoadCompleted?.Invoke(); } } else { Log.ErrorAssetBundle(bundleName); } }; } } public static T LoadAsset<T>(string path) where T : Object { foreach (KeyValuePair<string, IEnumerable<string>> loadedBundleAssetName in loadedBundleAssetNames) { if (loadedBundleAssetName.Value.Contains(path.ToLower())) { return loadedBundles[loadedBundleAssetName.Key].LoadAsset<T>(path); } } Log.ErrorAsset(path); Log.Warning("Current asset paths"); foreach (string item in loadedBundleAssetNames.SelectMany((KeyValuePair<string, IEnumerable<string>> kvp) => kvp.Value)) { Log.Error(item); } return default(T); } public static void AddWeapon<T>(HunkWeaponDef weaponDef, string prefabReplacementName, SkinDef chiefSkin = null) where T : MonoBehaviour { if (!prefabReplacementName.StartsWith("Assets/Chief/Weapons/")) { prefabReplacementName = "Assets/Chief/Weapons/" + prefabReplacementName; } GameObject val = WeaponManager.LoadAsset<GameObject>(prefabReplacementName + ".prefab"); if (!Object.op_Implicit((Object)(object)val)) { Log.ErrorAsset(prefabReplacementName); return; } val.AddComponent<T>(); Log.Info("Replacing " + ((Object)weaponDef).name + " with " + prefabReplacementName); Hunk.AddGunSkin(chiefSkin, weaponDef, val); AddPickupPrefab(weaponDef, prefabReplacementName); } public static void AddWeapon(HunkWeaponDef weaponDef, string prefabReplacementName, SkinDef chiefSkin = null) { if (!prefabReplacementName.StartsWith("Assets/Chief/Weapons/")) { prefabReplacementName = "Assets/Chief/Weapons/" + prefabReplacementName; } GameObject val = WeaponManager.LoadAsset<GameObject>(prefabReplacementName + ".prefab"); if (!Object.op_Implicit((Object)(object)val)) { Log.ErrorAsset(prefabReplacementName); return; } Log.Info("Replacing " + ((Object)weaponDef).name + " with " + prefabReplacementName); Hunk.AddGunSkin(chiefSkin, weaponDef, val); AddPickupPrefab(weaponDef, prefabReplacementName); } private static void AddPickupPrefab(HunkWeaponDef weaponDef, string prefabReplacementName) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) GameObject val = WeaponManager.LoadAsset<GameObject>(prefabReplacementName + "Pickup.prefab"); if (!Object.op_Implicit((Object)(object)val)) { Log.ErrorAsset(prefabReplacementName); return; } ModelPanelParameters val2 = default(ModelPanelParameters); if (!val.TryGetComponent<ModelPanelParameters>(ref val2)) { val2 = val.AddComponent<ModelPanelParameters>(); } Transform transform = val.transform; if (!Object.op_Implicit((Object)(object)val2.focusPointTransform)) { val2.focusPointTransform = transform.Find("FocusPoint") ?? new GameObject("FocusPoint").transform; val2.focusPointTransform.SetParent(transform); } if (!Object.op_Implicit((Object)(object)val2.cameraPositionTransform)) { val2.cameraPositionTransform = transform.Find("CameraPosition") ?? new GameObject("CameraPosition").transform; val2.cameraPositionTransform.SetParent(val.transform); } PickupPrefabFix.AddPair(weaponDef, val); } } } namespace ChiefMod.Modules { internal class PlasmaRifle : BaseWeapon<PlasmaRifle> { private SkillDef _primarySkillDef; private GameObject _crosshairPrefab; public override string weaponNameToken => ""; public override string weaponNameTokenFull => ((BaseWeapon)this).weaponNameTokenFull; public override string weaponDescToken => ((BaseWeapon)this).weaponDescToken; public override string weaponName => ""; public override string weaponDesc => ""; public override string iconName => ""; public override GameObject crosshairPrefab => _crosshairPrefab; public override int magSize => 0; public override float magPickupMultiplier => 0f; public override int startingMags => 0; public override float reloadDuration => 0f; public override string ammoName => ""; public override SkillDef primarySkillDef => _primarySkillDef; public override GameObject modelPrefab => WeaponManager.LoadAsset<GameObject>("mdlPlasmaRifle"); public override AnimationSet animationSet => (AnimationSet)1; public override bool storedOnBack => false; public override bool storedOnHolster => true; public override float damageFillValue => 0f; public override float rangefillValue => 0f; public override float fireRateFillValue => 0f; public override float reloadFillValue => 0f; public override float accuracyFillValue => 0f; public override string aimSoundString => ""; public override string equipSoundString => ""; public override void Init() { ((BaseWeapon)this).Init(); } } [HarmonyPatch(typeof(HunkDialogue))] internal class Sound_replacement { public static bool Replacestep1() { return false; } } }