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 Chief v1.1.0
ChiefMod.dll
Decompiled 11 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; } } }