Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of ShbonesVariants v1.0.0
plugins/shbones-ShbonesVariants/ShbonesVariants.dll
Decompiled 6 months agousing System; using System.Collections; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using EntityStates; using EntityStates.BeetleQueenMonster; using EntityStates.LemurianBruiserMonster; using HG.Reflection; using MSU; using MSU.Config; using R2API.Utils; using RoR2; using RoR2.CharacterAI; using RoR2.ContentManagement; using RoR2.Projectile; using ShbonesVariants; using UnityEngine; using VAPI; using VAPI.Components; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace ShbonesVariants { internal class Log { private static ManualLogSource logger; internal Log(ManualLogSource logger_) { logger = logger_; } internal static void Debug(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { logger.LogDebug((object)logString(data, i, member)); } internal static void Error(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { logger.LogError((object)logString(data, i, member)); } internal static void Fatal(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { logger.LogFatal((object)logString(data, i, member)); } internal static void Info(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { logger.LogInfo(data); } internal static void Message(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { logger.LogMessage(data); } internal static void Warning(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { logger.LogWarning(data); } private static string logString(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { return $"{data} :: Line: {i}, Method {member}"; } } public static class ShbonesVariantsAssets { private const string ASSET_BUNDLE_NAME = "shbonesvariantsassets"; private const string ASSET_BUNDLE_FOLDER_NAME = "assetbundles"; private static AssetBundle _assetBundle; public static ResourceAvailability assetsAvailability; private static string assetBundleFolderPath => Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)ShbonesVariantsMain.instance).Info.Location), "assetbundles"); public static TAsset LoadAsset<TAsset>(string name) where TAsset : Object { return _assetBundle.LoadAsset<TAsset>(name); } public static SVAssetRequest<TAsset> LoadAssetAsync<TAsset>(string name) where TAsset : Object { return new SVAssetRequest<TAsset>(_assetBundle.LoadAssetAsync(name)); } public static TAsset[] LoadAssets<TAsset>() where TAsset : Object { return _assetBundle.LoadAllAssets<TAsset>(); } public static SVAssetRequest<TAsset> LoadAssetsAsync<TAsset>() where TAsset : Object { return new SVAssetRequest<TAsset>(_assetBundle.LoadAllAssetsAsync<TAsset>()); } internal static IEnumerator Initialize() { if (!((ResourceAvailability)(ref assetsAvailability)).available) { IEnumerator loadRoutine = LoadAssetBundle(); while (!MSUtil.IsDone(loadRoutine)) { yield return null; } ParallelCoroutine coroutine = new ParallelCoroutine(); coroutine.Add(SwapShaders()); coroutine.Add(SwapAddressableShaders()); coroutine.Add(FinishMaterialVariants()); while (!coroutine.isDone) { yield return null; } ((ResourceAvailability)(ref assetsAvailability)).MakeAvailable(); } } private static IEnumerator FinishMaterialVariants() { SVAssetRequest<MaterialVariant> request = ShbonesVariantsAssets.LoadAssetsAsync<MaterialVariant>(); while (!request.isDone) { yield return null; } ParallelCoroutine routine = new ParallelCoroutine(); MaterialVariant[] assets = request.assets; foreach (MaterialVariant val in assets) { routine.Add(val.ApplyOverrides()); } while (!MSUtil.IsDone((IEnumerator)routine)) { yield return null; } } private static IEnumerator LoadAssetBundle() { AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(Path.Combine(assetBundleFolderPath, "shbonesvariantsassets")); while (!((AsyncOperation)request).isDone) { yield return null; } _assetBundle = request.assetBundle; } private static IEnumerator SwapShaders() { return ShaderUtil.SwapStubbedShadersAsync(_assetBundle); } private static IEnumerator SwapAddressableShaders() { return ShaderUtil.LoadAddressableMaterialShadersAsync(_assetBundle); } } public class SVAssetRequest<TAsset> : IEnumerator where TAsset : Object { private AssetBundleRequest _request; public TAsset asset => (TAsset)(object)_request.asset; public TAsset[] assets => _request.allAssets.OfType<TAsset>().ToArray(); public bool isDone => ((AsyncOperation)_request).isDone; public float progress => ((AsyncOperation)_request).progress; object IEnumerator.Current => _request.asset; internal SVAssetRequest(AssetBundleRequest request) { _request = request; } bool IEnumerator.MoveNext() { return !((AsyncOperation)_request).isDone; } void IEnumerator.Reset() { throw new NotSupportedException(); } } public class ShbonesVariantsConfig { public const string PREFIX = "ShbonesVariants."; internal static ConfigFactory configFactory { get; private set; } internal ShbonesVariantsConfig(BaseUnityPlugin plugin) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown configFactory = new ConfigFactory(plugin); } } public class ShbonesVariantsContent : IContentPackProvider { internal static ParallelCoroutine _parallelPreLoadDispatchers; private static Func<IEnumerator>[] _loadDispatchers; internal static ParallelCoroutine _parallelPostLoadDispatchers; private static Action[] _fieldAssignDispatchers; private bool _initialized; private static VariantPackDef _variantPack; public string identifier => "com.Shbones.ShbonesVariants"; public static ReadOnlyContentPack readOnlyContentPack => new ReadOnlyContentPack(contentPack); internal static ContentPack contentPack { get; } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { if (_initialized) { yield break; } IEnumerator enumerator2 = ShbonesVariantsAssets.Initialize(); while (!MSUtil.IsDone(enumerator2)) { yield return null; } while (!_parallelPreLoadDispatchers.isDone) { yield return null; } for (int i = 0; i < _loadDispatchers.Length; i++) { args.ReportProgress(Util.Remap((float)(i + 1), 0f, (float)_loadDispatchers.Length, 0.1f, 0.2f)); enumerator2 = _loadDispatchers[i](); while (enumerator2?.MoveNext() ?? false) { yield return null; } } while (!_parallelPostLoadDispatchers.isDone) { yield return null; } for (int j = 0; j < _fieldAssignDispatchers.Length; j++) { args.ReportProgress(Util.Remap((float)(j + 1), 0f, (float)_fieldAssignDispatchers.Length, 0.95f, 0.99f)); _fieldAssignDispatchers[j](); } } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield return null; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } private static IEnumerator AddVariantPack() { SVAssetRequest<VariantPackDef> variantPackRequest = ShbonesVariantsAssets.LoadAssetAsync<VariantPackDef>("ShbonesVariantPack"); SVAssetRequest<VariantDef> variantDefsRequest = ShbonesVariantsAssets.LoadAssetsAsync<VariantDef>(); ParallelCoroutine coroutine = new ParallelCoroutine(); coroutine.Add((IEnumerator)variantPackRequest); coroutine.Add((IEnumerator)variantDefsRequest); while (!MSUtil.IsDone((IEnumerator)coroutine)) { yield return null; } _variantPack = variantPackRequest.asset; _variantPack.variants = variantDefsRequest.assets; VariantPackCatalog.AddVariantPack(_variantPack, ((BaseUnityPlugin)ShbonesVariantsMain.instance).Config); } private static IEnumerator AddStates() { yield return null; contentPack.entityStateTypes.Add((from t in typeof(ShbonesVariantsMain).Assembly.GetTypes() where t.IsSubclassOf(typeof(EntityState)) && !t.IsAbstract select t).ToArray()); } private IEnumerator CallAsyncLoadAttributes() { ParallelMultiStartCoroutine routine = AsyncAssetLoadAttribute.CreateCoroutineForMod((BaseUnityPlugin)(object)ShbonesVariantsMain.instance); routine.Start(); while (!routine.isDone) { yield return null; } } private void AddSelf(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); } public ShbonesVariantsContent() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(AddSelf); ((ResourceAvailability)(ref ShbonesVariantsAssets.assetsAvailability)).CallWhenAvailable((Action)delegate { _parallelPostLoadDispatchers.Add((IEnumerator)AsyncAssetLoadAttribute.CreateParallelCoroutineForMod((BaseUnityPlugin)(object)ShbonesVariantsMain.instance)); }); } static ShbonesVariantsContent() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown contentPack = new ContentPack(); _parallelPreLoadDispatchers = new ParallelCoroutine(); _parallelPostLoadDispatchers = new ParallelCoroutine(); _fieldAssignDispatchers = Array.Empty<Action>(); ShbonesVariantsMain main = ShbonesVariantsMain.instance; _loadDispatchers = new Func<IEnumerator>[3] { () => LanguageFileLoader.AddLanguageFilesFromModAsync((BaseUnityPlugin)(object)main, "languages"), AddStates, AddVariantPack }; } } [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Shbones.ShbonesVariants", "Shbones Variants", "1.0.0")] public class ShbonesVariantsMain : BaseUnityPlugin { public const string GUID = "com.Shbones.ShbonesVariants"; public const string MODNAME = "Shbones Variants"; public const string VERSION = "1.0.0"; public static ShbonesVariantsMain instance { get; private set; } private void Awake() { instance = this; new Log(((BaseUnityPlugin)this).Logger); new ShbonesVariantsConfig((BaseUnityPlugin)(object)this); new ShbonesVariantsContent(); Log.Info("Loaded ShbonesVariants", 32, "Awake"); } } } namespace ShbonesVariants.Components { public class ExtendAdultLemurianRange : VariantComponent { public void Awake() { AISkillDriver[] skillDrivers = ((Component)this).gameObject.GetComponent<BaseAI>().skillDrivers; foreach (AISkillDriver val in skillDrivers) { if (val.customName.Equals("StrafeAndShoot") || val.customName.Equals("StrafeIdley")) { val.maxDistance *= 2f; } } Object.Destroy((Object)(object)this); } } public class MoveAdultLemurianAimOrigin : VariantComponent { public void Awake() { Transform val = ((Component)this).gameObject.GetComponentInChildren<ChildLocator>().FindChild("MuzzleMouth"); ((Component)this).gameObject.GetComponent<CharacterBody>().aimOriginTransform.SetParent(val, false); Object.Destroy((Object)(object)this); } } } namespace EntityStates.LemurianMonster.Adult { public class AdultLemurianChargeFireball : ChargeFireball { public override void FixedUpdate() { ((ChargeFireball)this).FixedUpdate(); if (((EntityState)this).fixedAge >= base.duration && ((EntityState)this).isAuthority) { AdultLemurianFireMegaFireball nextState = new AdultLemurianFireMegaFireball(); ((EntityState)this).outer.SetNextState((EntityState)(object)nextState); } } } public class AdultLemurianFireMegaFireball : BaseState { public static int projectileCount = 3; public static float totalYawSpread = 5f; public static float baseDuration = 2f; public static float baseFireDuration = 0.2f; public static float damageCoefficient = 1.2f; public static float projectileSpeed = FireMegaFireball.projectileSpeed; public static float force = 20f; public static string attackString; private float duration; private float fireDuration; private int projectilesFired; public override void OnEnter() { ((BaseState)this).OnEnter(); duration = FireMegaFireball.baseDuration / base.attackSpeedStat; fireDuration = FireMegaFireball.baseFireDuration / base.attackSpeedStat; ((EntityState)this).PlayAnimation("Gesture, Additive", FireMegaFireball.FireMegaFireballStateHash, FireMegaFireball.FireMegaFireballParamHash, duration); Util.PlaySound(FireMegaFireball.attackString, ((EntityState)this).gameObject); } public override void FixedUpdate() { //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: 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_00dd: Unknown result type (might be due to invalid IL or missing references) ((EntityState)this).FixedUpdate(); if (((EntityState)this).isAuthority) { int num = Mathf.FloorToInt(((EntityState)this).fixedAge / fireDuration * (float)projectileCount); if (projectilesFired <= num && projectilesFired < projectileCount) { if (Object.op_Implicit((Object)(object)FireMegaFireball.muzzleflashEffectPrefab)) { EffectManager.SimpleMuzzleFlash(FireMegaFireball.muzzleflashEffectPrefab, ((EntityState)this).gameObject, "MuzzleMouth", false); } Ray aimRay = ((BaseState)this).GetAimRay(); float num2 = projectileSpeed; float num3 = (float)Mathf.FloorToInt((float)projectilesFired - (float)(projectileCount - 1) / 2f) / (float)(projectileCount - 1) * totalYawSpread; Vector3 val = Util.ApplySpread(((Ray)(ref aimRay)).direction, 0f, 0f, 1f, 1f, num3, 0f); ProjectileManager.instance.FireProjectileWithoutDamageType(FireMegaFireball.projectilePrefab, ((Ray)(ref aimRay)).origin, Util.QuaternionSafeLookRotation(val), ((EntityState)this).gameObject, base.damageStat * damageCoefficient, force, Util.CheckRoll(base.critStat, ((EntityState)this).characterBody.master), (DamageColorIndex)0, (GameObject)null, num2); projectilesFired++; } } if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { projectilesFired = 0; ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)1; } } } namespace EntityStates.FlyingVermin.Broodmother { public class BroodlingSummon : BaseState { public static SpawnCard blindPestSpawnCard = Resources.Load<SpawnCard>("SpawnCards/CharacterSpawnCards/cscFlyingVermin"); public static VariantDef broodling = ShbonesVariantsAssets.LoadAsset<VariantDef>("BroodlingPest"); public static VariantDef[] variantBroodlings = (VariantDef[])(object)new VariantDef[1] { broodling }; public bool isSummoning; public int summonsPerActivation = 3; public float baseDuration = 3f; private float duration; private int summonsForThisUsage; private float summonInterval; private int activationNumber; public override void OnEnter() { int num = ++activationNumber; Log.Info("Start Summoning Pests " + num, 27, "OnEnter"); ((BaseState)this).OnEnter(); summonsForThisUsage = 0; duration = baseDuration / base.attackSpeedStat; summonInterval = duration / (float)summonsPerActivation; isSummoning = true; } public override void OnExit() { Log.Info("Exiting Summon " + activationNumber, 37, "OnExit"); ((EntityState)this).OnExit(); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); if (((EntityState)this).fixedAge >= duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } else if (((EntityState)this).fixedAge > summonInterval * (float)summonsForThisUsage) { summonsForThisUsage++; Util.PlaySound(ChargeSpit.attackSoundString, ((EntityState)this).gameObject); ((BaseState)this).AddRecoil(-5f, 5f, -5f, 5f); summonMob(); } } public void summonMob() { //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_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_002b: 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_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_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) new VariantSummon { masterPrefab = blindPestSpawnCard.prefab, position = ((EntityState)this).transform.position + Vector3.down * 3f, rotation = ((EntityState)this).transform.rotation, summonerBodyObject = ((EntityState)this).gameObject, ignoreTeamMemberLimit = true, variantDefs = variantBroodlings, supressRewards = true, teamIndexOverride = ((EntityState)this).teamComponent.teamIndex, inventoryToCopy = ((EntityState)this).characterBody.inventory }.PerformSummon(); } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)7; } } }