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 Rulers of the Red Plane v0.1.8
plugins/RulersOfTheRedPlane.dll
Decompiled 2 years ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using HG; using HG.Reflection; using IEye.RRP.ItemTiers; using IEye.RRP.Orbs; using MSU; using MSU.Config; using MonoMod.RuntimeDetour; using On.RoR2; using R2API; using R2API.Networking; using R2API.ScriptableObjects; using R2API.Utils; using RoR2; using RoR2.Achievements.Artifacts; using RoR2.ContentManagement; using RoR2.ExpansionManagement; using RoR2.Items; using RoR2.Networking; using RoR2.Orbs; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.ResourceManagement.AsyncOperations; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Rulers of the Red Plan")] [assembly: AssemblyDescription("Gaming")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Rulers of the Red Plane")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("0.0.1.0")] [assembly: OptIn] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.1.0")] [module: UnverifiableCode] namespace EntityStates.Wlurm { public class SpawnState : BaseState { private float stopwatch; public static float duration = 4f; public override void OnEnter() { ((BaseState)this).OnEnter(); ((EntityState)this).PlayAnimation("Body", "Spawn", "Spawn.playbackRate", duration, 0f); } public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); stopwatch += Time.fixedDeltaTime; if (stopwatch > duration && ((EntityState)this).isAuthority) { ((EntityState)this).outer.SetNextStateToMain(); } } public override InterruptPriority GetMinimumInterruptPriority() { return (InterruptPriority)7; } } public class Laser : BaseSkillState { public static GameObject laserProjectile; public static GameObject[] tentacleEnds; public static float duration; public static float baseTimeBetweenShots; private float timer; private float timeBetweenShots; private Animator animator; private int tentacleAmount; public override void OnEnter() { ((BaseState)this).OnEnter(); timeBetweenShots = baseTimeBetweenShots / ((BaseState)this).attackSpeedStat; animator = ((EntityState)this).GetModelAnimator(); tentacleAmount = tentacleEnds.Length; } public override void FixedUpdate() { timer += Time.fixedDeltaTime; if (timer >= timeBetweenShots) { Transform transform = tentacleEnds[Random.Range(0, tentacleAmount)].transform; FireProjectile(transform); } ((EntityState)this).FixedUpdate(); } public void FireProjectile(Transform location) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) Util.GetEnemyEasyTarget(((EntityState)this).characterBody, ((BaseState)this).GetAimRay(), 60f, 180f); } } } namespace IEye.RRP { internal class RRPLog { private static ManualLogSource logger; public static void Fatal(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)1, data, i, member); } public static void Error(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)2, data, i, member); } public static void Warning(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)4, data, i, member); } public static void Message(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)8, data, i, member); } public static void Info(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)16, data, i, member); } public static void Debug(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)32, data, i, member); } private static void Log(LogLevel level, object data, int i, string member) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) LogRuntime(level, data, i, member); } private static void LogEditor(LogLevel level, object data, int i, string member) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Invalid comparison between Unknown and I4 if ((int)level <= 4) { if (level - 1 > 1) { if ((int)level == 4) { Debug.LogWarning((object)Format(data, i, member)); } } else { Debug.LogError((object)Format(data, i, member)); } } else if ((int)level == 8 || (int)level == 16 || (int)level == 32) { Debug.Log((object)Format(data, i, member)); } } private static void LogRuntime(LogLevel level, object data, int i, string member) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) object obj = ((((Enum)level).HasFlag((Enum)(object)(LogLevel)4) || ((Enum)level).HasFlag((Enum)(object)(LogLevel)2) || ((Enum)level).HasFlag((Enum)(object)(LogLevel)1)) ? Format(data, i, member) : data); logger.Log(level, obj); } public static string Format(object data, int i, string member) { return $"{data} | Line={i} : Member={member}"; } internal RRPLog(ManualLogSource logger_) { logger = logger_; } } public class AnimatorDebugger : MonoBehaviour { private Animator animator; private int pitchIndex; private int yawIndex; public void Start() { animator = ((Component)this).GetComponent<Animator>(); pitchIndex = animator.GetLayerIndex("AimPitch"); yawIndex = animator.GetLayerIndex("AimYaw"); } public void Update() { //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) RRPLog.Message("aimYawCycle is " + animator.GetFloat("aimYawCycle"), 21, "Update"); RRPLog.Message("aimPitchCycle is " + animator.GetFloat("aimPitchCycle"), 22, "Update"); AnimatorStateInfo currentAnimatorStateInfo = animator.GetCurrentAnimatorStateInfo(yawIndex); RRPLog.Message("aimYawCycle State is " + ((AnimatorStateInfo)(ref currentAnimatorStateInfo)).shortNameHash, 23, "Update"); RRPLog.Message("real aimYawCycle is " + Animator.StringToHash("YawControl"), 24, "Update"); } } public abstract class RRPArtifact : IArtifactContentPiece, IContentPiece<ArtifactDef>, IContentPiece, IContentPackModifier { public NullableRef<ArtifactAssetCollection> assetCollection { get; private set; } public NullableRef<ArtifactCode> artifactCode { get; protected set; } public ArtifactDef artifactDef { get; protected set; } NullableRef<ArtifactCode> IArtifactContentPiece.artifactCode => artifactCode; ArtifactDef IContentPiece<ArtifactDef>.asset => artifactDef; public abstract RRPAssetRequest LoadAssetRequest(); public abstract void Initialize(); public abstract bool IsAvailable(ContentPack contentPack); public virtual IEnumerator LoadContentAsync() { RRPAssetRequest request = LoadAssetRequest(); request.StartLoad(); while (!request.isComplete) { yield return null; } if (request.boxedAsset is ArtifactAssetCollection artifactAssetCollection) { assetCollection = NullableRef<ArtifactAssetCollection>.op_Implicit(artifactAssetCollection); artifactDef = artifactAssetCollection.artifactDef; artifactCode = NullableRef<ArtifactCode>.op_Implicit(artifactAssetCollection.artifactCode); yield break; } Object boxedAsset = request.boxedAsset; ArtifactDef val = (ArtifactDef)(object)((boxedAsset is ArtifactDef) ? boxedAsset : null); if (val != null) { artifactDef = val; } else { RRPLog.Error($"Invalid AssetRequest {request.assetName} of type {((object)request.boxedAsset).GetType()}", 65, "LoadContentAsync"); } } public abstract void OnArtifactDisabled(); public abstract void OnArtifactEnabled(); public void ModifyContentPack(ContentPack contentPack) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (NullableRef<ArtifactAssetCollection>.op_Implicit(assetCollection)) { ContentUtil.AddContentFromAssetCollection(contentPack, (AssetCollection)(object)NullableRef<ArtifactAssetCollection>.op_Implicit(assetCollection)); } } } public abstract class RRPInteractable : IInteractableContentPiece, IGameObjectContentPiece<IInteractable>, IContentPiece<GameObject>, IContentPiece, IContentPackModifier { public InteractableAssetCollection AssetCollection { get; private set; } public InteractableCardProvider CardProvider { get; protected set; } IInteractable IGameObjectContentPiece<IInteractable>.component => InteractablePrefab.GetComponent<IInteractable>(); GameObject IContentPiece<GameObject>.asset => InteractablePrefab; public GameObject InteractablePrefab { get; protected set; } public abstract RRPAssetRequest<InteractableAssetCollection> AssetRequest { get; } NullableRef<InteractableCardProvider> IInteractableContentPiece.cardProvider => NullableRef<InteractableCardProvider>.op_Implicit(CardProvider); public abstract void Initialize(); public abstract bool IsAvailable(ContentPack contentPack); public virtual IEnumerator LoadContentAsync() { RRPAssetRequest<InteractableAssetCollection> request = AssetRequest; request.StartLoad(); while (!request.isComplete) { yield return null; } AssetCollection = request.asset; CardProvider = AssetCollection.interactableCardProvider; InteractablePrefab = AssetCollection.interactablePrefab; } public void ModifyContentPack(ContentPack contentPack) { ContentUtil.AddContentFromAssetCollection(contentPack, (AssetCollection)(object)AssetCollection); } } public abstract class RRPItem : IItemContentPiece, IContentPiece<ItemDef>, IContentPiece, IContentPackModifier { public ItemAssetCollection AssetCollection { get; private set; } public NullableRef<List<GameObject>> ItemDisplayPrefabs { get; protected set; } = NullableRef<List<GameObject>>.op_Implicit(new List<GameObject>()); public ItemDef ItemDef { get; protected set; } ItemDef IContentPiece<ItemDef>.asset => ItemDef; NullableRef<List<GameObject>> IItemContentPiece.itemDisplayPrefabs => ItemDisplayPrefabs; public abstract RRPAssetRequest AssetRequest { get; } public abstract void Initialize(); public abstract bool IsAvailable(ContentPack contentPack); public virtual IEnumerator LoadContentAsync() { RRPAssetRequest request = AssetRequest; request.StartLoad(); while (!request.isComplete) { yield return null; } if (request.boxedAsset is ItemAssetCollection assetCollection) { AssetCollection = assetCollection; ItemDef = AssetCollection.itemDef; ItemDisplayPrefabs = NullableRef<List<GameObject>>.op_Implicit(AssetCollection.itemDisplayPrefabs); yield break; } Object boxedAsset = request.boxedAsset; ItemDef val = (ItemDef)(object)((boxedAsset is ItemDef) ? boxedAsset : null); if (val != null) { ItemDef = val; } else { RRPLog.Error("Invalid AssetRequest " + NullableRef<string>.op_Implicit(request.assetName) + " of type " + ((object)request.boxedAsset).GetType(), 47, "LoadContentAsync"); } } public virtual void ModifyContentPack(ContentPack contentPack) { if (Object.op_Implicit((Object)(object)AssetCollection)) { ContentUtil.AddContentFromAssetCollection(contentPack, (AssetCollection)(object)AssetCollection); } } } public abstract class RRPItemTier : IItemTierContentPiece, IContentPiece<ItemTierDef>, IContentPiece, IContentPackModifier { public ItemTierAssetCollection AssetCollection { get; private set; } public NullableRef<SerializableColorCatalogEntry> colorIndex { get; protected set; } public NullableRef<SerializableColorCatalogEntry> darkColorIndex { get; protected set; } public GameObject pickupDisplayVFX { get; protected set; } public List<ItemIndex> itemsWithThisTier { get; set; } = new List<ItemIndex>(); public List<PickupIndex> availableTierDropList { get; set; } = new List<PickupIndex>(); ItemTierDef IContentPiece<ItemTierDef>.asset => ItemTierDef; public ItemTierDef ItemTierDef { get; protected set; } public abstract RRPAssetRequest<ItemTierAssetCollection> AssetRequest { get; } public abstract void Initialize(); public abstract bool IsAvailable(ContentPack contentPack); public virtual IEnumerator LoadContentAsync() { RRPAssetRequest<ItemTierAssetCollection> request = AssetRequest; request.StartLoad(); while (!request.isComplete) { yield return null; } AssetCollection = request.asset; ItemTierDef = AssetCollection.itemTierDef; if (Object.op_Implicit((Object)(object)AssetCollection.colorIndex)) { colorIndex = NullableRef<SerializableColorCatalogEntry>.op_Implicit(AssetCollection.colorIndex); } if (Object.op_Implicit((Object)(object)AssetCollection.darkColorIndex)) { darkColorIndex = NullableRef<SerializableColorCatalogEntry>.op_Implicit(AssetCollection.darkColorIndex); } pickupDisplayVFX = AssetCollection.pickupDisplayVFX; } public void ModifyContentPack(ContentPack contentPack) { ContentUtil.AddContentFromAssetCollection(contentPack, (AssetCollection)(object)AssetCollection); } } public abstract class RRPMonster : IMonsterContentPiece, ICharacterContentPiece, IGameObjectContentPiece<CharacterBody>, IContentPiece<GameObject>, IContentPiece, IContentPackModifier { public NullableRef<MonsterCardProvider> CardProvider { get; protected set; } public NullableRef<DirectorCardHolderExtended> DissonanceCard { get; protected set; } public MonsterAssetCollection AssetCollection { get; private set; } public NullableRef<GameObject> masterPrefab { get; protected set; } NullableRef<DirectorCardHolderExtended> IMonsterContentPiece.dissonanceCard => DissonanceCard; CharacterBody IGameObjectContentPiece<CharacterBody>.component => CharacterPrefab.GetComponent<CharacterBody>(); NullableRef<MonsterCardProvider> IMonsterContentPiece.cardProvider => CardProvider; GameObject IContentPiece<GameObject>.asset => CharacterPrefab; public GameObject CharacterPrefab { get; private set; } public abstract RRPAssetRequest<MonsterAssetCollection> AssetRequest { get; } public abstract void Initialize(); public abstract bool IsAvailable(ContentPack contentPack); public virtual IEnumerator LoadContentAsync() { RRPAssetRequest<MonsterAssetCollection> request = AssetRequest; request.StartLoad(); while (!request.isComplete) { yield return null; } AssetCollection = request.asset; CharacterPrefab = AssetCollection.bodyPrefab; masterPrefab = NullableRef<GameObject>.op_Implicit(AssetCollection.masterPrefab); CardProvider = NullableRef<MonsterCardProvider>.op_Implicit(AssetCollection.monsterCardProvider); DissonanceCard = NullableRef<DirectorCardHolderExtended>.op_Implicit(AssetCollection.dissonanceCardHolder); } public virtual void ModifyContentPack(ContentPack contentPack) { ContentUtil.AddContentFromAssetCollection(contentPack, (AssetCollection)(object)AssetCollection); } } public abstract class RRPScene : ISceneContentPiece, IContentPiece<SceneDef>, IContentPiece, IContentPackModifier { public SceneAssetCollection assetCollection { get; private set; } public abstract RRPAssetRequest<SceneAssetCollection> assetRequest { get; } NullableRef<MusicTrackDef> ISceneContentPiece.mainTrack => NullableRef<MusicTrackDef>.op_Implicit(mainTrack); NullableRef<MusicTrackDef> ISceneContentPiece.bossTrack => NullableRef<MusicTrackDef>.op_Implicit(bossTrack); public MusicTrackDef mainTrack { get; protected set; } public MusicTrackDef bossTrack { get; protected set; } public NullableRef<Texture2D> bazaarTextureBase { get; protected set; } SceneDef IContentPiece<SceneDef>.asset => sceneDef; public SceneDef sceneDef { get; protected set; } public virtual float? weightRelativeToSiblings { get; protected set; } = 1f; public virtual bool? preLoop { get; protected set; } = true; public virtual bool? postLoop { get; protected set; } = true; public abstract void Initialize(); public abstract bool IsAvailable(ContentPack contentPack); public virtual IEnumerator LoadContentAsync() { RRPAssetRequest<SceneAssetCollection> request = assetRequest; request.StartLoad(); while (!request.isComplete) { yield return null; } assetCollection = request.asset; sceneDef = assetCollection.sceneDef; if (Object.op_Implicit((Object)(object)mainTrack)) { mainTrack = NullableRef<MusicTrackDef>.op_Implicit(assetCollection.mainTrack); } if (Object.op_Implicit((Object)(object)bossTrack)) { bossTrack = NullableRef<MusicTrackDef>.op_Implicit(assetCollection.bossTrack); } weightRelativeToSiblings = assetCollection.stageWeightRelativeToSiblings; preLoop = assetCollection.appearsPreLoop; postLoop = assetCollection.appearsPostLoop; } public virtual void ModifyContentPack(ContentPack contentPack) { ContentUtil.AddContentFromAssetCollection(contentPack, (AssetCollection)(object)assetCollection); } public virtual void OnServerStageComplete(Stage stage) { } public virtual void OnServerStageBegin(Stage stage) { } } public enum RRPBundle { Invalid, All, Main, Base, Artifacts, Interactables, Items, StreamedScene, Indev } public class RRPAssets { private const string ASSET_BUNDLE_FOLDER_NAME = "assetbundles"; private const string MAIN = "rrpmain"; private const string BASE = "rrpbase"; private const string ARTIFACTS = "rrpartifacts"; private const string EQUIPS = "rrpequipments"; private const string INTERACTS = "rrpinteractables"; private const string ITEMS = "rrpitems"; private const string MONSTERS = "rrpmonsters"; private const string VANILLA = "rrpvanilla"; private const string STAGES = "rrpstages"; private const string INDEV = "rrpindev"; private const string SHARED = "rrpshared"; private static Dictionary<RRPBundle, AssetBundle> _assetBundles = new Dictionary<RRPBundle, AssetBundle>(); private static AssetBundle[] _streamedSceneBundles = Array.Empty<AssetBundle>(); private static Action _onRRPAssetsInitialized; private static string AssetBundleFolderPath => Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)RRPMain.instance).Info.Location), "assetbundles"); public static event Action onRRPAssetsInitialized { add { _onRRPAssetsInitialized = (Action)Delegate.Remove(_onRRPAssetsInitialized, value); _onRRPAssetsInitialized = (Action)Delegate.Combine(_onRRPAssetsInitialized, value); } remove { _onRRPAssetsInitialized = (Action)Delegate.Remove(_onRRPAssetsInitialized, value); } } public static AssetBundle GetAssetBundle(RRPBundle bundle) { if (bundle == RRPBundle.All || bundle == RRPBundle.Invalid || bundle == RRPBundle.StreamedScene) { return null; } return _assetBundles[bundle]; } public static TAsset LoadAsset<TAsset>(string name, RRPBundle bundle) where TAsset : Object { if (bundle == RRPBundle.All) { return FindAsset<TAsset>(name); } return _assetBundles[bundle].LoadAsset<TAsset>(name); } public static RRPAssetRequest<TAsset> LoadAssetAsync<TAsset>(string name, RRPBundle bundle) where TAsset : Object { return new RRPAssetRequest<TAsset>(name, bundle); } public static TAsset[] LoadAllAssets<TAsset>(RRPBundle bundle) where TAsset : Object { if (bundle == RRPBundle.All) { return FindAssets<TAsset>(); } return _assetBundles[bundle].LoadAllAssets<TAsset>(); } public static RRPAssetRequest<TAsset> LoadAllAssetsAsync<TAsset>(RRPBundle bundle) where TAsset : Object { return new RRPAssetRequest<TAsset>(bundle); } internal static IEnumerator Initialize() { RRPLog.Info("Initializing Assets...", 181, "Initialize"); IEnumerator loadRoutine = LoadAssetBundles(); while (!MSUtil.IsDone(loadRoutine)) { yield return null; } RRPLog.Info("Initializing Shader Swap...", 190, "Initialize"); ParallelMultiStartCoroutine multiStartCoroutine = new ParallelMultiStartCoroutine(); multiStartCoroutine.Add((Func<IEnumerator>)SwapShaders); multiStartCoroutine.Add((Func<IEnumerator>)SwapAddressableShaders); multiStartCoroutine.Start(); while (!MSUtil.IsDone((IEnumerator)multiStartCoroutine)) { yield return null; } RRPLog.Info("Invoking onRRPAssetsInitialized...", 202, "Initialize"); _onRRPAssetsInitialized?.Invoke(); } private static IEnumerator LoadAssetBundles() { ParallelMultiStartCoroutine helper = new ParallelMultiStartCoroutine(); List<(string path, RRPBundle bundleEnum, AssetBundle loadedBundle)> pathsAndBundles = new List<(string, RRPBundle, AssetBundle)>(); string[] assetBundlePaths = GetAssetBundlePaths(); for (int i = 0; i < assetBundlePaths.Length; i++) { string text = assetBundlePaths[i]; helper.Add<List<(string, RRPBundle, AssetBundle)>, string, int, int>((Func<List<(string, RRPBundle, AssetBundle)>, string, int, int, IEnumerator>)LoadFromPath, pathsAndBundles, text, i, assetBundlePaths.Length); } helper.Start(); while (!MSUtil.IsDone((IEnumerator)helper)) { yield return null; } foreach (var item3 in pathsAndBundles) { RRPBundle item = item3.bundleEnum; AssetBundle item2 = item3.loadedBundle; if (item == RRPBundle.StreamedScene) { ArrayUtils.ArrayAppend<AssetBundle>(ref _streamedSceneBundles, ref item2); } else { _assetBundles[item] = item2; } } } private static IEnumerator LoadFromPath(List<(string path, RRPBundle bundleEnum, AssetBundle loadedBundle)> list, string path, int index, int totalPaths) { RRPBundle? rrpbundle = Path.GetFileName(path) switch { "rrpmain" => RRPBundle.Main, "rrpitems" => RRPBundle.Items, "rrpbase" => RRPBundle.Base, "rrpartifacts" => RRPBundle.Artifacts, "rrpinteractables" => RRPBundle.Interactables, "rrpindev" => RRPBundle.Indev, "rrpstages" => RRPBundle.StreamedScene, _ => RRPBundle.StreamedScene, }; AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(path); while (!((AsyncOperation)request).isDone) { yield return null; } AssetBundle assetBundle = request.assetBundle; if (!Object.op_Implicit((Object)(object)assetBundle)) { throw new FileLoadException("AssetBundle.LoadFromFile did not return an asset bundle. (Path=" + path + ")"); } if (rrpbundle == RRPBundle.StreamedScene) { if (!assetBundle.isStreamedSceneAssetBundle) { throw new Exception("AssetBundle in specified path is not a streamed scene bundle, but its file name was not found in the Switch statement. have you forgotten to setup the enum and file name in your assets class? (Path=" + path + ")"); } list.Add((path, RRPBundle.StreamedScene, assetBundle)); } else { list.Add((path, rrpbundle.Value, assetBundle)); } } private static string[] GetAssetBundlePaths() { return (from filePath in Directory.GetFiles(AssetBundleFolderPath) where !filePath.EndsWith(".manifest") select filePath).ToArray(); } private static IEnumerator SwapShaders() { RRPLog.Info("Swapping Stubbed Shaders", 304, "SwapShaders"); return ShaderUtil.SwapStubbedShadersAsync(_assetBundles.Values.ToArray()); } private static IEnumerator SwapAddressableShaders() { return ShaderUtil.LoadAddressableMaterialShadersAsync(_assetBundles.Values.ToArray()); } private static TAsset FindAsset<TAsset>(string name) where TAsset : Object { TAsset val = default(TAsset); foreach (KeyValuePair<RRPBundle, AssetBundle> assetBundle in _assetBundles) { assetBundle.Deconstruct(out var key, out var value); RRPBundle rRPBundle = key; val = value.LoadAsset<TAsset>(name); if (Object.op_Implicit((Object)(object)val)) { break; } } return val; } private static TAsset[] FindAssets<TAsset>() where TAsset : Object { List<TAsset> list = new List<TAsset>(); foreach (var (_, val2) in _assetBundles) { list.AddRange(val2.LoadAllAssets<TAsset>()); } return list.ToArray(); } } public abstract class RRPAssetRequest { private RRPBundle _targetBundle; private NullableRef<string> _assetName; protected IEnumerator internalCoroutine; protected string assetTypeName; public abstract Object boxedAsset { get; } public abstract IEnumerable<Object> boxedAssets { get; } public RRPBundle targetBundle => _targetBundle; public NullableRef<string> assetName => _assetName; public bool singleAssetLoad { get; private set; } public bool isComplete { get { if (internalCoroutine == null) { StartLoad(); } return !internalCoroutine.MoveNext(); } } public void StartLoad() { if (singleAssetLoad) { internalCoroutine = LoadSingleAsset(); } else { internalCoroutine = LoadMultipleAsset(); } } protected abstract IEnumerator LoadSingleAsset(); protected abstract IEnumerator LoadMultipleAsset(); public RRPAssetRequest(string assetName, RRPBundle bundleEnum) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) _assetName = NullableRef<string>.op_Implicit(assetName); _targetBundle = bundleEnum; singleAssetLoad = true; assetTypeName = "UnityEngine.Object"; } public RRPAssetRequest(RRPBundle bundleEnum) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) _assetName = NullableRef<string>.op_Implicit(string.Empty); _targetBundle = bundleEnum; singleAssetLoad = false; assetTypeName = "UnityEngine.Object"; } } public class RRPAssetRequest<TAsset> : RRPAssetRequest where TAsset : Object { private TAsset _asset; private List<TAsset> _assets; public override Object boxedAsset => (Object)(object)_asset; public TAsset asset => _asset; public override IEnumerable<Object> boxedAssets => (IEnumerable<Object>)_assets; public IEnumerable<TAsset> assets => _assets; protected override IEnumerator LoadSingleAsset() { AssetBundleRequest request = RRPAssets.GetAssetBundle(base.targetBundle).LoadAssetAsync<TAsset>(NullableRef<string>.op_Implicit(base.assetName)); while (!((AsyncOperation)request).isDone) { yield return null; } _asset = (TAsset)(object)request.asset; } protected override IEnumerator LoadMultipleAsset() { _assets.Clear(); if (base.targetBundle == RRPBundle.All) { foreach (RRPBundle value in Enum.GetValues(typeof(RRPBundle))) { if (value != RRPBundle.All && value != 0 && value != RRPBundle.StreamedScene) { AssetBundleRequest request2 = RRPAssets.GetAssetBundle(value).LoadAllAssetsAsync<TAsset>(); while (!((AsyncOperation)request2).isDone) { yield return null; } _assets.AddRange(request2.allAssets.OfType<TAsset>()); } } } else { AssetBundleRequest request2 = RRPAssets.GetAssetBundle(base.targetBundle).LoadAllAssetsAsync<TAsset>(); while (!((AsyncOperation)request2).isDone) { yield return null; } _assets.AddRange(request2.allAssets.OfType<TAsset>()); } } internal RRPAssetRequest(string name, RRPBundle bundle) : base(name, bundle) { assetTypeName = typeof(TAsset).Name; } internal RRPAssetRequest(RRPBundle bundle) : base(bundle) { _assets = new List<TAsset>(); assetTypeName = typeof(TAsset).Name; } } public class RRPConfig { public const string PREFIX = "RRP."; internal const string IDMain = "RRP.Main"; internal const string IDItem = "RRP.Items"; internal const string IDInteractable = "RRP.Interactables"; internal const string IDItemTier = "RRP.Item Tier"; internal static ConfigFactory configFactory { get; private set; } public static ConfigFile ConfigMain { get; private set; } public static ConfigFile ConfigItem { get; private set; } public static ConfigFile ConfigInteractable { get; private set; } public static ConfigFile ConfigItemTier { get; private set; } internal RRPConfig(BaseUnityPlugin bup) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown configFactory = new ConfigFactory(bup, true); ConfigMain = configFactory.CreateConfigFile("RRP.Main", true); ConfigItem = configFactory.CreateConfigFile("RRP.Items", true); ConfigInteractable = configFactory.CreateConfigFile("RRP.Interactables", true); ConfigItemTier = configFactory.CreateConfigFile("RRP.Item Tier", true); } } public static class SoundBankManager { public static string soundBankDirectory => Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)RRPMain.instance).Info.Location), "soundbanks"); public static void Init() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) new Hook((MethodBase)Reflection.GetMethodCached(typeof(AkSoundEngineInitialization), "InitializeSoundEngine"), Reflection.GetMethodCached(typeof(SoundBankManager), "AddBanks")); } private static bool AddBanks(Func<AkSoundEngineInitialization, bool> orig, AkSoundEngineInitialization self) { bool result = orig(self); LoadBanks(); return result; } private static void LoadBanks() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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) AkSoundEngine.AddBasePath(soundBankDirectory); uint num = default(uint); AkSoundEngine.LoadFilePackage("RRP_Soundbank.pck", ref num); uint num2 = default(uint); AkSoundEngine.LoadBank("RRP_Soundbank", ref num2); } } public class RRPContent : IContentPackProvider { public static class Artifacts { public static ArtifactDef Loop; } public static class Items { public static ItemDef FourDimensionalDagger; public static ItemDef IntrospectiveInsect; public static ItemDef PoisonIvy; public static ItemDef Strawberry; public static ItemDef DoubleSidedSword; public static ItemDef Leech; public static ItemDef AgressiveInsect; public static ItemDef AdrenalineFrenzy; public static ItemDef FocusedHemorrhage; public static ItemDef PredatorySavagery; public static ItemDef BloodyIvy; public static ItemDef SacrificialHelper; public static ItemDef Kamikaze; } public static class Scenes { public static SceneDef ProvidenceGarden; } public static class Buffs { public static BuffDef InsectPoison; public static BuffDef InsectBloody; public static BuffDef AdrenalineOnGettingHit; public static BuffDef AdrenalineOnKill; public static BuffDef PredatoryRush; public static BuffDef IvyPower; public static BuffDef IvyBlight; } public static class ItemTierDefs { public static ItemTierDef Sacrificial; } internal static ParallelMultiStartCoroutine _parallelPreLoadDispatchers; private static Func<IEnumerator>[] _loadDispatchers; internal static ParallelMultiStartCoroutine _parallelPostLoadDispatchers; private static Action[] _fieldAssignDispatchers; public string identifier => "com.I_Eye.RulersOfTheRedPlane"; public static ReadOnlyContentPack readOnlyContentPack => new ReadOnlyContentPack(RRPContentPack); internal static ContentPack RRPContentPack { get; } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { IEnumerator enumerator2 = RRPAssets.Initialize(); while (enumerator2.MoveNext()) { yield return null; } _parallelPreLoadDispatchers.Start(); while (!MSUtil.IsDone((IEnumerator)_parallelPreLoadDispatchers)) { 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; } } _parallelPostLoadDispatchers.Start(); while (!MSUtil.IsDone((IEnumerator)_parallelPostLoadDispatchers)) { 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(RRPContentPack, args.output); args.ReportProgress(1f); yield return null; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } private void AddSelf(AddContentPackProviderDelegate addContentPackProvider) { addContentPackProvider.Invoke((IContentPackProvider)(object)this); } private static IEnumerator LoadFromAssetBundles() { RRPLog.Info("Populating EntityStateTypes array...", 75, "LoadFromAssetBundles"); RRPContentPack.entityStateTypes.Clear(); RRPContentPack.entityStateTypes.Add((from type in typeof(RRPContent).Assembly.GetTypes() where typeof(EntityState).IsAssignableFrom(type) select type).ToArray()); RRPLog.Info("Populating EntityStateConfiguration array...", 79, "LoadFromAssetBundles"); RRPAssetRequest<EntityStateConfiguration> escRequest = new RRPAssetRequest<EntityStateConfiguration>(RRPBundle.All); escRequest.StartLoad(); while (!escRequest.isComplete) { yield return null; } RRPContentPack.entityStateConfigurations.Clear(); RRPContentPack.entityStateConfigurations.Add(escRequest.assets.ToArray()); RRPLog.Info("Populating EffectDefs array...", 86, "LoadFromAssetBundles"); RRPAssetRequest<GameObject> gameObjectRequest = new RRPAssetRequest<GameObject>(RRPBundle.All); gameObjectRequest.StartLoad(); while (!gameObjectRequest.isComplete) { yield return null; } RRPContentPack.effectDefs.Clear(); RRPContentPack.effectDefs.Add(gameObjectRequest.assets.Where((GameObject go) => Object.op_Implicit((Object)(object)go.GetComponent<EffectComponent>())).Select((Func<GameObject, EffectDef>)((GameObject go) => new EffectDef(go))).ToArray()); RRPLog.Info("Calling AsyncAssetLoad Attribute Methods...", 93, "LoadFromAssetBundles"); ParallelMultiStartCoroutine asyncAssetLoadCoroutines = AsyncAssetLoadAttribute.CreateCoroutineForMod((BaseUnityPlugin)(object)RRPMain.instance); asyncAssetLoadCoroutines.Start(); while (!MSUtil.IsDone((IEnumerator)asyncAssetLoadCoroutines)) { yield return null; } } private IEnumerator AddRRPExpansionDef() { RRPAssetRequest<ExpansionDef> expansionRequest = RRPAssets.LoadAssetAsync<ExpansionDef>("RRPExpansionDef", RRPBundle.Main); expansionRequest.StartLoad(); while (!expansionRequest.isComplete) { yield return null; } ContentUtil.AddSingle<ExpansionDef>(RRPContentPack.expansionDefs, expansionRequest.asset); } internal RRPContent() { //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); RRPAssets.onRRPAssetsInitialized += delegate { _parallelPreLoadDispatchers.Add((Func<IEnumerator>)AddRRPExpansionDef); }; } static RRPContent() { //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 RRPContentPack = new ContentPack(); _parallelPreLoadDispatchers = new ParallelMultiStartCoroutine(); _parallelPostLoadDispatchers = new ParallelMultiStartCoroutine(); RRPMain main = RRPMain.instance; _loadDispatchers = new Func<IEnumerator>[7] { delegate { ItemModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGenericContentPieceProvider<ItemDef>((BaseUnityPlugin)(object)main, RRPContentPack)); return ItemModule.InitializeItems((BaseUnityPlugin)(object)main); }, delegate { ItemTierModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGenericContentPieceProvider<ItemTierDef>((BaseUnityPlugin)(object)main, RRPContentPack)); return ItemTierModule.InitializeTiers((BaseUnityPlugin)(object)main); }, delegate { CharacterModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGameObjectGenericContentPieceProvider<CharacterBody>((BaseUnityPlugin)(object)main, RRPContentPack)); return CharacterModule.InitializeCharacters((BaseUnityPlugin)(object)main); }, delegate { ArtifactModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGenericContentPieceProvider<ArtifactDef>((BaseUnityPlugin)(object)main, RRPContentPack)); return ArtifactModule.InitializeArtifacts((BaseUnityPlugin)(object)main); }, delegate { SceneModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGenericContentPieceProvider<SceneDef>((BaseUnityPlugin)(object)main, RRPContentPack)); return SceneModule.InitializeScenes((BaseUnityPlugin)(object)main); }, delegate { InteractableModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGameObjectGenericContentPieceProvider<IInteractable>((BaseUnityPlugin)(object)main, RRPContentPack)); return InteractableModule.InitializeInteractables((BaseUnityPlugin)(object)main); }, LoadFromAssetBundles }; _fieldAssignDispatchers = new Action[5] { delegate { ContentUtil.PopulateTypeFields<ItemDef>(typeof(Items), RRPContentPack.itemDefs); }, delegate { ContentUtil.PopulateTypeFields<ItemTierDef>(typeof(ItemTierDefs), RRPContentPack.itemTierDefs); }, delegate { ContentUtil.PopulateTypeFields<ArtifactDef>(typeof(Artifacts), RRPContentPack.artifactDefs); }, delegate { ContentUtil.PopulateTypeFields<BuffDef>(typeof(Buffs), RRPContentPack.buffDefs); }, delegate { ContentUtil.PopulateTypeFields<SceneDef>(typeof(Scenes), RRPContentPack.sceneDefs); } }; } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.I_Eye.RulersOfTheRedPlane", "Rulers of the Red Plane", "0.1.7")] public class RRPMain : BaseUnityPlugin { public const string GUID = "com.I_Eye.RulersOfTheRedPlane"; public const string MODNAME = "Rulers of the Red Plane"; public const string VERSION = "0.1.7"; public static RRPMain instance; public static PluginInfo pluginInfo; private void Awake() { instance = this; pluginInfo = ((BaseUnityPlugin)this).Info; new RRPLog(((BaseUnityPlugin)this).Logger); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Logger created"); new RRPConfig((BaseUnityPlugin)(object)this); ((BaseUnityPlugin)this).Logger.LogInfo((object)"About to do content"); new RRPContent(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"RRP loading for MSU 2.0"); LanguageFileLoader.AddLanguageFilesFromMod((BaseUnityPlugin)(object)this, "languages"); } private void Start() { SoundBankManager.Init(); } } [CreateAssetMenu(fileName = "ArtifactAssetCollection", menuName = "RRP/AssetCollections/ArtifactAssetCollection")] public class ArtifactAssetCollection : ExtendedAssetCollection { public ArtifactCode artifactCode; public ArtifactDef artifactDef; } [CreateAssetMenu(fileName = "BodyAssetCollection", menuName = "RRP/AssetCollections/BodyAssetCollection")] public class BodyAssetCollection : ExtendedAssetCollection { public GameObject bodyPrefab; public GameObject masterPrefab; } public class ExtendedAssetCollection : AssetCollection { } [CreateAssetMenu(fileName = "InteractableAssetCollection", menuName = "RRP/AssetCollections/InteractableAssetCollection")] public class InteractableAssetCollection : ExtendedAssetCollection { public GameObject interactablePrefab; public InteractableCardProvider interactableCardProvider; } [CreateAssetMenu(fileName = "ItemAssetCollection", menuName = "RRP/AssetCollections/ItemAssetCollection")] public class ItemAssetCollection : ExtendedAssetCollection { public List<GameObject> itemDisplayPrefabs; public ItemDef itemDef; } [CreateAssetMenu(fileName = "ItemTierAssetCollection", menuName = "RRP/AssetCollections/ItemTierAssetCollection")] public class ItemTierAssetCollection : ExtendedAssetCollection { public SerializableColorCatalogEntry colorIndex; public SerializableColorCatalogEntry darkColorIndex; public GameObject pickupDisplayVFX; public ItemTierDef itemTierDef; } [CreateAssetMenu(fileName = "MonsterAssetCollection", menuName = "RRP/AssetCollections/MonsterAssetCollection")] public class MonsterAssetCollection : BodyAssetCollection { public MonsterCardProvider monsterCardProvider; public DirectorCardHolderExtended dissonanceCardHolder; } [CreateAssetMenu(fileName = "SceneAssetCollection", menuName = "RRP/AssetCollections/SceneAssetCollection")] public class SceneAssetCollection : ExtendedAssetCollection { public SceneDef sceneDef; public NullableRef<MusicTrackDef> mainTrack; public NullableRef<MusicTrackDef> bossTrack; [Header("Stage Registration Metadata")] public float stageWeightRelativeToSiblings; public bool appearsPreLoop; public bool appearsPostLoop; } } namespace IEye.RRP.Unlocks.Artifacts { public sealed class LoopUnlockable : BaseObtainArtifactAchievement { public override ArtifactDef artifactDef => RRPContent.Artifacts.Loop; } } namespace IEye.RRP.Scenes { public sealed class ProvidenceGarden : RRPScene { public override RRPAssetRequest<SceneAssetCollection> assetRequest => RRPAssets.LoadAssetAsync<SceneAssetCollection>("acProvidenceGarden", RRPBundle.Indev); public static MusicTrackDef musicBoss { get; } = Addressables.LoadAssetAsync<MusicTrackDef>((object)"RoR2/Base/Common/muSong23.asset").WaitForCompletion(); public static MusicTrackDef musicReg { get; } = Addressables.LoadAssetAsync<MusicTrackDef>((object)"RoR2/Base/Common/muFULLSong19.asset").WaitForCompletion(); public override void Initialize() { base.sceneDef.mainTrack = musicReg; base.sceneDef.bossTrack = musicBoss; Stage.onStageStartGlobal += Stage_onStageStartGlobal; } private void Stage_onStageStartGlobal(Stage obj) { if ((Object)(object)obj.sceneDef == (Object)(object)base.sceneDef) { SceneDirector.onPostPopulateSceneServer += SceneDirector_onPostPopulateSceneServer; } } private void SceneDirector_onPostPopulateSceneServer(SceneDirector obj) { } public override bool IsAvailable(ContentPack contentPack) { return false; } } } namespace IEye.RRP.Items { public class Kamikaze : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnKilledServerReceiver { private GameObject explodeOnDeathPrefab = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/ExplodeOnDeath/WilloWispDelay.prefab").WaitForCompletion(); [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.Kamikaze; } public void OnKilledServer(DamageReport damageReport) { //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_002a: 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_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: 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_0070: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: 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) //IL_00fc: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) Vector3 val = Vector3.zero; if (Object.op_Implicit((Object)(object)damageReport.victim)) { val = ((Component)damageReport.victim).transform.position; } DelayBlast component = Object.Instantiate<GameObject>(explodeOnDeathPrefab, val, Quaternion.identity).GetComponent<DelayBlast>(); float num = 4f + 2.5f * (float)(base.stack - 1); float baseDamage = Util.OnKillProcDamage(damageReport.victimBody.damage, num); if (Object.op_Implicit((Object)(object)component)) { component.position = val; component.baseDamage = baseDamage; component.baseForce = 2000f; component.bonusForce = Vector3.up * 1000f; component.radius = 25f + (float)(base.stack - 1); component.attacker = ((Component)damageReport.victim).gameObject; component.inflictor = ((Component)damageReport.victim).gameObject; component.crit = Util.CheckRoll(damageReport.victimBody.crit, damageReport.victimMaster); component.maxTimer = 1f; component.damageColorIndex = (DamageColorIndex)3; component.falloffModel = (FalloffModel)1; } } } public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acKamikaze", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return false; } } public class SacrificialHelper : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnKilledOtherServerReceiver { private int num1; private int num1Bloody; private int num1KillCount; private bool count1Going; private int num2; private int num2Bloody; private int num2KillCount; private bool count2Going; private int num3one; private int num3two; private int num3Bloody; private int num3KillCount; private bool count3Going; private int num4; private int num4Bloody; private int num4KillCount; private bool count4Going; [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.SacrificialHelper; } private void Start() { ((BaseItemBodyBehavior)this).body.onInventoryChanged += CheckForSacrifice; CheckForSacrifice(); if (num1 > 0 && num1Bloody > 0) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(1)); } if (num2 > 0 && num2Bloody > 0) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(2)); } if (num3one > 0 && num3two > 0 && num3Bloody > 0) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(3)); } if (num4 > 0 && num4Bloody > 0) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(4)); } } private void CheckForSacrifice() { num1 = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.IntrospectiveInsect); num1Bloody = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.AgressiveInsect); num2 = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(Items.SprintBonus); num2Bloody = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.AdrenalineFrenzy); num3one = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(Items.BleedOnHit); num3two = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.FourDimensionalDagger); num3Bloody = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.FocusedHemorrhage); num4 = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(Items.AttackSpeedOnCrit); num4Bloody = ((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.PredatorySavagery); if (num1 > 0 && num1Bloody > 0 && !count1Going) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(1)); } if (num2 > 0 && num2Bloody > 0 && !count2Going) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(2)); } if (num3one > 0 && num3two > 0 && num3Bloody > 0 && !count3Going) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(3)); } if (num4 > 0 && num4Bloody > 0 && !count4Going) { ((MonoBehaviour)this).StartCoroutine(SacrificeItem(4)); } } public void OnKilledOtherServer(DamageReport report) { if (num1 > 0 && num1Bloody > 0) { num1KillCount++; } if (num2 > 0 && num2Bloody > 0) { num2KillCount++; } if (num3one > 0 && num3two > 0 && num3Bloody > 0) { num3KillCount++; } if (num4 > 0 && num4Bloody > 0) { num4KillCount++; } } private IEnumerator SacrificeItem(int num) { int numSacrifice = calcSacrifices(); RRPLog.Message("Starting Sacrifice, int = " + num + " and kills needed = " + numSacrifice, 185, "SacrificeItem"); switch (num) { case 1: count1Going = true; yield return (object)new WaitUntil((Func<bool>)(() => num1KillCount == numSacrifice)); ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.AgressiveInsect, 1); ((BaseItemBodyBehavior)this).body.inventory.RemoveItem(RRPContent.Items.IntrospectiveInsect, 1); SacrificeChat(RRPContent.Items.IntrospectiveInsect, RRPContent.Items.AgressiveInsect); count1Going = false; num1KillCount = 0; CheckForSacrifice(); break; case 2: count2Going = true; yield return (object)new WaitUntil((Func<bool>)(() => num2KillCount == numSacrifice)); ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.AdrenalineFrenzy, 1); ((BaseItemBodyBehavior)this).body.inventory.RemoveItem(Items.SprintBonus, 1); SacrificeChat(Items.SprintBonus, RRPContent.Items.AdrenalineFrenzy); count2Going = false; num2KillCount = 0; CheckForSacrifice(); break; case 3: count3Going = true; yield return (object)new WaitUntil((Func<bool>)(() => num3KillCount == numSacrifice)); ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.FocusedHemorrhage, 2); ((BaseItemBodyBehavior)this).body.inventory.RemoveItem(Items.BleedOnHit, 1); ((BaseItemBodyBehavior)this).body.inventory.RemoveItem(RRPContent.Items.FourDimensionalDagger, 1); SacrificeChat(Items.BleedOnHit, RRPContent.Items.FourDimensionalDagger, RRPContent.Items.FocusedHemorrhage); num3KillCount = 0; count3Going = false; CheckForSacrifice(); break; case 4: count4Going = true; yield return (object)new WaitUntil((Func<bool>)(() => num4KillCount == numSacrifice)); ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.PredatorySavagery, 1); ((BaseItemBodyBehavior)this).body.inventory.RemoveItem(Items.AttackSpeedOnCrit, 1); SacrificeChat(Items.AttackSpeedOnCrit, RRPContent.Items.PredatorySavagery); num4KillCount = 0; count4Going = false; CheckForSacrifice(); break; } } private int calcSacrifices() { float difficultyCoefficient = Run.instance.difficultyCoefficient; int num = (int)(Sacrificial.multiplier * difficultyCoefficient); if (num > Sacrificial.cap) { return Sacrificial.cap; } return num; } private void SacrificeChat(ItemDef one, ItemDef two) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) CharacterMasterNotificationQueue.SendTransformNotification(((BaseItemBodyBehavior)this).body.master, one.itemIndex, two.itemIndex, (TransformationType)0); } private void SacrificeChat(ItemDef one, ItemDef two, ItemDef three) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) CharacterMasterNotificationQueue.SendTransformNotification(((BaseItemBodyBehavior)this).body.master, one.itemIndex, three.itemIndex, (TransformationType)0); CharacterMasterNotificationQueue.SendTransformNotification(((BaseItemBodyBehavior)this).body.master, two.itemIndex, three.itemIndex, (TransformationType)0); } } public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acHelper", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class DoubleSidedSword : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnTakeDamageServerReceiver { private SphereSearch search; public float baseRange = radiusBase; [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.DoubleSidedSword; } public void OnTakeDamageServer(DamageReport report) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Invalid comparison between Unknown and I4 //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) if (!(report.damageInfo.procCoefficient > 0f) || !((object)(DotIndex)(ref report.damageInfo.dotIndex)).Equals((object)(DotIndex)(-1)) || (int)report.damageInfo.damageType.damageType == 66) { return; } HealthComponent victim = report.victim; InflictDotInfo val = default(InflictDotInfo); val.attackerObject = ((Component)victim).gameObject; val.victimObject = ((Component)victim).gameObject; val.dotIndex = (DotIndex)0; val.duration = duration * report.damageInfo.procCoefficient; val.damageMultiplier = damage * playerCoef * (float)base.stack * 0.01f; InflictDotInfo val2 = val; DotController.InflictDot(ref val2); HealthComponent[] array = PickNextTarget(report.victimBody.corePosition, victim); if (array != null) { HealthComponent[] array2 = array; foreach (HealthComponent val3 in array2) { val = default(InflictDotInfo); val.attackerObject = ((Component)victim).gameObject; val.victimObject = ((Component)val3).gameObject; val.dotIndex = (DotIndex)0; val.duration = duration * report.damageInfo.procCoefficient; val.damageMultiplier = damage * (float)base.stack; InflictDotInfo val4 = val; DotController.InflictDot(ref val4); } } } public HealthComponent[] PickNextTarget(Vector3 position, HealthComponent currentVictim) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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_008f: Unknown result type (might be due to invalid IL or missing references) if (search == null) { search = new SphereSearch(); } float num = baseRange; if (Object.op_Implicit((Object)(object)currentVictim) && Object.op_Implicit((Object)(object)currentVictim.body)) { num += currentVictim.body.radius; } TeamMask val = TeamMask.AllExcept((TeamIndex)1); search.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask; search.radius = num; search.origin = position; search.queryTriggerInteraction = (QueryTriggerInteraction)0; search.RefreshCandidates(); search.FilterCandidatesByHurtBoxTeam(val); search.FilterCandidatesByDistinctHurtBoxEntities(); HurtBox[] hurtBoxes = search.GetHurtBoxes(); HealthComponent[] array = (HealthComponent[])(object)new HealthComponent[hurtBoxes.Length]; for (int i = 0; i < hurtBoxes.Length; i++) { array[i] = hurtBoxes[i].healthComponent; } if (array.Length == 0 || array == null) { return null; } return array; } } private const string token = "RRP_ITEM_DOUBLESWORD_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base radius for bleed effect(default 50m).")] [FormatToken("RRP_ITEM_DOUBLESWORD_DESC", 0)] public static int radiusBase = 50; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Damage Coefficient for bleed damage(default 2).")] [FormatToken(/*Could not decode attribute arguments.*/)] public static float damage = 2f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Duration of bleed(default 3).")] [FormatToken("RRP_ITEM_DOUBLESWORD_DESC", 2)] public static float duration = 3f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percentage of base damage done to the player(default 20%).")] [FormatToken("RRP_ITEM_DOUBLESWORD_DESC", 3)] public static float playerCoef = 20f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acDoubleSword", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class AdrenalineFrenzy : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnTakeDamageServerReceiver, IOnKilledOtherServerReceiver { [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.AdrenalineFrenzy; } private void Start() { if (((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.SacrificialHelper) == 0) { ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.SacrificialHelper, 1); } } public void OnKilledOtherServer(DamageReport report) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Invalid comparison between Unknown and I4 //IL_0054: Unknown result type (might be due to invalid IL or missing references) if (report.damageInfo.procCoefficient > 0f && ((object)(DotIndex)(ref report.damageInfo.dotIndex)).Equals((object)(DotIndex)(-1)) && (int)report.damageInfo.damageType.damageType != 66) { report.attacker.GetComponent<CharacterBody>().AddTimedBuffAuthority(RRPContent.Buffs.AdrenalineOnKill.buffIndex, killSpeedDuration); } } public void OnTakeDamageServer(DamageReport report) { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Invalid comparison between Unknown and I4 //IL_0054: Unknown result type (might be due to invalid IL or missing references) if (report.damageInfo.procCoefficient > 0f && ((object)(DotIndex)(ref report.damageInfo.dotIndex)).Equals((object)(DotIndex)(-1)) && (int)report.damageInfo.damageType.damageType != 66) { ((Component)report.victim).GetComponent<CharacterBody>().AddTimedBuffAuthority(RRPContent.Buffs.AdrenalineOnGettingHit.buffIndex, onHitSpeedDuration); } } } public sealed class OnKillBehavior : BaseBuffBehaviour, IBodyStatArgModifier { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.AdrenalineOnKill; } public void ModifyStatArguments(StatHookEventArgs args) { if (((BaseBuffBehaviour)this).hasAnyStacks) { int itemCount = ((BaseBuffBehaviour)this).characterBody.inventory.GetItemCount(RRPContent.Items.AdrenalineFrenzy); args.sprintSpeedAdd += (killSpeed / 100f + killSpeedStack / 100f * (float)(itemCount - 1)) * (float)((BaseBuffBehaviour)this).buffCount; } } } public sealed class OnHitBehavior : BaseBuffBehaviour, IBodyStatArgModifier { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.AdrenalineOnGettingHit; } public void ModifyStatArguments(StatHookEventArgs args) { if (((BaseBuffBehaviour)this).hasAnyStacks) { int itemCount = ((BaseBuffBehaviour)this).characterBody.inventory.GetItemCount(RRPContent.Items.AdrenalineFrenzy); args.moveSpeedMultAdd += (onHitSpeed / 100f + onHitSpeedStack / 100f * (float)(itemCount - 1)) * (float)((BaseBuffBehaviour)this).buffCount; } } } public const string token = "RRP_ITEM_ADRFRENZY_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base percentage speed added on kill(default 6%).")] [FormatToken("RRP_ITEM_ADRFRENZY_DESC", 0)] public static float killSpeed = 6f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base percentage speed added on kill per stack(default 4%).")] [FormatToken("RRP_ITEM_ADRFRENZY_DESC", 1)] public static float killSpeedStack = 4f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base time for on kill speed boost(default 10s).")] [FormatToken("RRP_ITEM_ADRFRENZY_DESC", 2)] public static float killSpeedDuration = 10f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base percentage speed added on getting hit(default 12%).")] [FormatToken("RRP_ITEM_ADRFRENZY_DESC", 3)] public static float onHitSpeed = 12f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base percentage speed added on getting hit per stack(default(7%).")] [FormatToken("RRP_ITEM_ADRFRENZY_DESC", 4)] public static float onHitSpeedStack = 7f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base time for on getting hit speed boost(default 8s).")] [FormatToken("RRP_ITEM_ADRFRENZY_DESC", 5)] public static float onHitSpeedDuration = 8f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acFrenzy", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class AgressiveInsect : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnDamageDealtServerReceiver, IOnTakeDamageServerReceiver { [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.AgressiveInsect; } private void Start() { if (((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.SacrificialHelper) == 0) { ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.SacrificialHelper, 1); } } public void OnDamageDealtServer(DamageReport damageReport) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)damageReport.victimBody) && damageReport.victimBody.GetBuffCount(RRPContent.Buffs.InsectBloody) > 0 && !((ProcChainMask)(ref damageReport.damageInfo.procChainMask)).HasProc(basedProc)) { SpawnMissile(damageReport); } } private void SpawnMissile(DamageReport damageReport) { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0075: 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_0085: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) float num = (float)(bloodyInsectExtraDamage * base.stack) / 100f; DamageInfo damageInfo = damageReport.damageInfo; AgressiveInsectMissileOrb agressiveInsectMissileOrb = new AgressiveInsectMissileOrb(); ((Orb)agressiveInsectMissileOrb).origin = ((BaseItemBodyBehavior)this).body.aimOrigin; ((GenericDamageOrb)agressiveInsectMissileOrb).damageValue = Util.OnHitProcDamage(damageInfo.damage, damageReport.attackerBody.damage, num); ((GenericDamageOrb)agressiveInsectMissileOrb).isCrit = damageInfo.crit; ((GenericDamageOrb)agressiveInsectMissileOrb).teamIndex = damageReport.attackerTeamIndex; ((GenericDamageOrb)agressiveInsectMissileOrb).attacker = damageInfo.attacker; ((GenericDamageOrb)agressiveInsectMissileOrb).procChainMask = damageInfo.procChainMask; ((ProcChainMask)(ref ((GenericDamageOrb)agressiveInsectMissileOrb).procChainMask)).AddProc(basedProc); ((GenericDamageOrb)agressiveInsectMissileOrb).procCoefficient = 0.2f; ((GenericDamageOrb)agressiveInsectMissileOrb).damageColorIndex = (DamageColorIndex)2; HurtBox mainHurtBox = damageReport.victimBody.mainHurtBox; if (Object.op_Implicit((Object)(object)mainHurtBox)) { ((Orb)agressiveInsectMissileOrb).target = mainHurtBox; OrbManager.instance.AddOrb((Orb)(object)agressiveInsectMissileOrb); } } private void applyPoision(CharacterBody cb) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (cb.GetBuffCount(RRPContent.Buffs.InsectBloody) > 0) { cb.RemoveOldestTimedBuff(RRPContent.Buffs.InsectBloody.buffIndex); } cb.AddTimedBuffAuthority(RRPContent.Buffs.InsectBloody.buffIndex, duration * (float)base.stack); } public void OnTakeDamageServer(DamageReport report) { if (report == null) { return; } GameObject attacker = report.attacker; if (Object.op_Implicit((Object)(object)attacker)) { CharacterBody component = attacker.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && report.damageInfo.procCoefficient > 0f) { applyPoision(component); } } } } public sealed class BloodBehavior : BaseBuffBehaviour { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.InsectBloody; } } public const string token = "RRP_ITEM_AGROINSECT_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Duration of the insect blood debuff(default 8s)")] [FormatToken("RRP_ITEM_AGROINSECT_DESC", 0)] public static float duration = 8f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percent damage per orb per stack(default 25%)")] [FormatToken("RRP_ITEM_AGROINSECT_DESC", 1)] public static int bloodyInsectExtraDamage = 25; private static readonly ProcType basedProc = (ProcType)382143; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acAInsect", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class BloodlustIvy : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnDamageInflictedServerReceiver { public static float damageNeeded; public static float healthTracker; private SphereSearch search; private List<HealthComponent> healthComponents; public float baseRange = distanceNeeded; [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.BloodyIvy; } private void Explode() { foreach (HealthComponent item in PickNextTarget(((BaseItemBodyBehavior)this).body.healthComponent)) { NetworkingHelpers.ApplyDot(item, ((Component)((BaseItemBodyBehavior)this).body).gameObject, (DotIndex)4, 10f, 1.5f); } damageNeeded = ((BaseItemBodyBehavior)this).body.healthComponent.fullCombinedHealth * (percentHealthCoef / 100f); } public void OnDamageInflictedServer(DamageReport damageReport) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (Vector3.Distance(damageReport.victimBody.transform.position, ((BaseItemBodyBehavior)this).body.transform.position) <= distanceNeeded) { healthTracker += damageReport.damageDealt; } if (healthTracker >= damageNeeded) { Explode(); } } public List<HealthComponent> PickNextTarget(HealthComponent currentVictim) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) if (search == null) { search = new SphereSearch(); } float num = baseRange; if (Object.op_Implicit((Object)(object)currentVictim) && Object.op_Implicit((Object)(object)currentVictim.body)) { num += currentVictim.body.radius; } TeamMask val = TeamMask.AllExcept((TeamIndex)1); search.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask; search.radius = num; search.origin = currentVictim.body.corePosition; search.queryTriggerInteraction = (QueryTriggerInteraction)0; search.RefreshCandidates(); search.FilterCandidatesByHurtBoxTeam(val); search.FilterCandidatesByDistinctHurtBoxEntities(); HurtBox[] hurtBoxes = search.GetHurtBoxes(); healthComponents = new List<HealthComponent>(); HurtBox[] array = hurtBoxes; foreach (HurtBox val2 in array) { if ((Object)(object)val2.healthComponent != (Object)(object)currentVictim) { healthComponents.Add(val2.healthComponent); } } if (healthComponents.Count == 0) { return null; } return healthComponents; } } private const string token = "RRP_ITEM_BLOODIVY_DESC"; public static float percentHealthCoef = 15f; public static float distanceNeeded = 20f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acBloodIvy", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return false; } } public class FocusedHemorrhage : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnDamageDealtServerReceiver { [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.FocusedHemorrhage; } public void OnDamageDealtServer(DamageReport report) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if (report.damageInfo.procCoefficient == 0f) { return; } _ = report.attackerBody.teamComponent.teamIndex; if (Util.CheckRoll(percentChance * report.damageInfo.procCoefficient, report.attackerBody.master)) { HealthComponent victim = report.victim; InflictDotInfo val = default(InflictDotInfo); val.attackerObject = report.attacker; val.victimObject = ((Component)victim).gameObject; val.dotIndex = (DotIndex)6; val.duration = report.damageInfo.procCoefficient * duration; val.damageMultiplier = 1f + percentDamageOver / 100f; InflictDotInfo val2 = val; for (int i = 0; i < (base.stack - 1) / 2 + 1; i++) { DotController.InflictDot(ref val2); } } } private void Start() { if (((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.SacrificialHelper) == 0) { ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.SacrificialHelper, 1); } } } public const string token = "RRP_ITEM_FHEMORRHAGE_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Chance on hit to apply Hemorrhage(default 10%).")] [FormatToken("RRP_ITEM_FHEMORRHAGE_DESC", 0)] public static float percentChance = 10f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Added to damage multiplier(default 35%).")] public static float percentDamageOver = 35f; [FormatToken("RRP_ITEM_FHEMORRHAGE_DESC", 1)] public static float percentDamage = 100f + percentDamageOver; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Duration of Hemorrhage(default 10s).")] [FormatToken("RRP_ITEM_FHEMORRHAGE_DESC", 2)] public static float duration = 10f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acFocusHemorrhage", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class Leech : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnTakeDamageServerReceiver, IOnKilledOtherServerReceiver { [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.Leech; } public void OnTakeDamageServer(DamageReport report) { //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Invalid comparison between Unknown and I4 //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) if (report.damageInfo.procCoefficient > 0f && ((object)(DotIndex)(ref report.damageInfo.dotIndex)).Equals((object)(DotIndex)(-1)) && (int)report.damageInfo.damageType.damageType != 66) { InflictDotInfo val = default(InflictDotInfo); val.victimObject = ((Component)report.victim).gameObject; val.attackerObject = ((Component)report.victim).gameObject; val.dotIndex = (DotIndex)0; val.duration = 2f * report.damageInfo.procCoefficient; val.damageMultiplier = 1f; val.totalDamage = report.damageDealt / 6f; InflictDotInfo val2 = val; DotController.InflictDot(ref val2); } } public void OnKilledOtherServer(DamageReport report) { if (Random.Range(0f, 100f) < 10f) { ((BaseItemBodyBehavior)this).body.inventory.RemoveItem(RRPContent.Items.Leech, 1); } } } private const string token = "RRP_ITEM_LEECH_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Chance for this item to proc per stack(default 15%).")] [FormatToken("RRP_ITEM_LEECH_DESC", 0)] public static float percentChance = 15f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acLeech", RRPBundle.Items); public override void Initialize() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown HealthComponent.Heal += new hook_Heal(HealthComponent_Heal); } private float HealthComponent_Heal(orig_Heal orig, HealthComponent self, float amount, ProcChainMask procChainMask, bool nonRegen) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)self.body.inventory)) { amount /= (float)(self.body.inventory.GetItemCount(RRPContent.Items.Leech) + 1); } return orig.Invoke(self, amount, procChainMask, nonRegen); } public override bool IsAvailable(ContentPack contentPack) { return false; } } public class PredatorySavagery : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnDamageDealtServerReceiver, IOnKilledOtherServerReceiver { [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.PredatorySavagery; } public void OnDamageDealtServer(DamageReport report) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) if (Util.CheckRoll(hitChance * report.damageInfo.procCoefficient, report.attackerMaster)) { RRPLog.Message("Roll passed", 73, "OnDamageDealtServer"); report.attackerBody.AddTimedBuffAuthority(RRPContent.Buffs.PredatoryRush.buffIndex, report.damageInfo.procCoefficient * (duration + stackDuration * (float)base.stack)); } } public void OnKilledOtherServer(DamageReport report) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (Util.CheckRoll(killChance, report.attackerMaster)) { report.attackerBody.AddTimedBuffAuthority(RRPContent.Buffs.PredatoryRush.buffIndex, duration + stackDuration * (float)(base.stack - 1)); } } private void Start() { if (((BaseItemBodyBehavior)this).body.inventory.GetItemCount(RRPContent.Items.SacrificialHelper) == 0) { ((BaseItemBodyBehavior)this).body.inventory.GiveItem(RRPContent.Items.SacrificialHelper, 1); } } } public sealed class SavageBehavior : BaseBuffBehaviour, IBodyStatArgModifier, IOnTakeDamageServerReceiver { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.PredatoryRush; } public void ModifyStatArguments(StatHookEventArgs args) { if (((BaseBuffBehaviour)this).hasAnyStacks) { int itemCount = ((BaseBuffBehaviour)this).characterBody.inventory.GetItemCount(RRPContent.Items.PredatorySavagery); args.damageMultAdd += damage / 100f * (float)itemCount; if (cooldownReduction * (float)itemCount < 50f) { args.cooldownMultAdd -= cooldownReduction / 100f * (float)itemCount; } else { args.cooldownMultAdd -= 0.5f; } args.armorAdd += (float)(armor * itemCount); args.jumpPowerMultAdd += jumpMult / 100f; args.critAdd += critChance; args.critDamageMultAdd += critDamage / 100f * (float)itemCount; } } public void OnTakeDamageServer(DamageReport damageReport) { } } public const string token = "RRP_ITEM_PREDATORY_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Armor with rush per stack(default 15).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 0)] public static int armor = 15; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percent damage increase per stack(default 15%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 1)] public static float damage = 15f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Pecent global cooldown reduction per stack(default 5%)(caps at 50%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 2)] public static float cooldownReduction = 5f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Added percentage jump force(regardless of stack)(default 35%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 3)] public static float jumpMult = 35f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Added crit damage per stack(default 10%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 4)] public static float critDamage = 10f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Added crit chance(regardless of stack)(default 6%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 5)] public static float critChance = 6f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base duration of the rush(default 10s).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 6)] public static float duration = 10f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Duration added on stack(default 3s).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 7)] public static float stackDuration = 3f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percent chance of rush on hit(default 2%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 8)] public static float hitChance = 2f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percent chance of rush on kill(default 5%).")] [FormatToken("RRP_ITEM_PREDATORY_DESC", 9)] public static float killChance = 5f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acSavagery", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class FourDimensionalDagger : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnDamageDealtServerReceiver { private SphereSearch search; private HealthComponent selected; public float baseRange = radiusBase; [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.FourDimensionalDagger; } public void OnDamageDealtServer(DamageReport report) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) if (report.damageInfo.procCoefficient == 0f) { return; } HealthComponent victim = report.victim; GameObject attacker = report.attacker; _ = report.attackerBody.teamComponent.teamIndex; if (((ProcChainMask)(ref report.damageInfo.procChainMask)).HasProc((ProcType)5)) { return; } ProcChainMask procChainMask = report.damageInfo.procChainMask; ((ProcChainMask)(ref procChainMask)).AddProc((ProcType)5); if (Util.CheckRoll(report.damageInfo.procCoefficient * percentChance * (float)base.stack, report.attackerBody.master)) { HealthComponent val = PickNextTarget(report.victimBody.corePosition, victim); if (!((Object)(object)val == (Object)null)) { InflictDotInfo val2 = default(InflictDotInfo); val2.attackerObject = attacker; val2.victimObject = ((Component)val).gameObject; val2.dotIndex = (DotIndex)0; val2.duration = report.damageInfo.procCoefficient * duration; val2.damageMultiplier = 1f; InflictDotInfo val3 = val2; RRPLog.Message("Before inflict", 72, "OnDamageDealtServer"); DotController.InflictDot(ref val3); } } } public HealthComponent PickNextTarget(Vector3 position, HealthComponent currentVictim) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (search == null) { search = new SphereSearch(); } float num = baseRange; if (Object.op_Implicit((Object)(object)currentVictim) && Object.op_Implicit((Object)(object)currentVictim.body)) { num += currentVictim.body.radius; } TeamMask val = TeamMask.AllExcept((TeamIndex)1); search.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask; search.radius = num + (float)(radiusIncrease * (base.stack - 1)); search.origin = position; search.queryTriggerInteraction = (QueryTriggerInteraction)0; search.RefreshCandidates(); search.FilterCandidatesByHurtBoxTeam(val); search.FilterCandidatesByDistinctHurtBoxEntities(); HurtBox[] hurtBoxes = search.GetHurtBoxes(); List<HealthComponent> list = new List<HealthComponent>(); HurtBox[] array = hurtBoxes; foreach (HurtBox val2 in array) { if ((Object)(object)val2.healthComponent != (Object)(object)currentVictim) { list.Add(val2.healthComponent); } } if (list.Count != 0) { selected = list[Random.Range(0, list.Count)]; return selected; } return null; } } private const string token = "RRP_ITEM_FOURDIMENSIONALDAGGER_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Chance for this item to proc per stack(default 15%).")] [FormatToken("RRP_ITEM_FOURDIMENSIONALDAGGER_DESC", 0)] public static float percentChance = 15f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Base search radius(default 25m).")] [FormatToken("RRP_ITEM_FOURDIMENSIONALDAGGER_DESC", 1)] public static int radiusBase = 25; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Added search radius per stack past 1(default 5m).")] [FormatToken("RRP_ITEM_FOURDIMENSIONALDAGGER_DESC", 2)] public static int radiusIncrease = 5; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Duration of the bleed in second(default 3s).")] public static float duration = 3f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("ac4DDagger", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class IntrospectiveInsect : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IOnTakeDamageServerReceiver, IOnDamageDealtServerReceiver { [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.IntrospectiveInsect; } public void OnDamageDealtServer(DamageReport damageReport) { if (damageReport == null) { return; } CharacterBody victimBody = damageReport.victimBody; if (!Object.op_Implicit((Object)(object)victimBody)) { return; } GameObject gameObject = ((Component)victimBody).gameObject; if (victimBody.GetBuffCount(RRPContent.Buffs.InsectPoison) > 0) { HitCounter hitCounter = default(HitCounter); if (!gameObject.TryGetComponent<HitCounter>(ref hitCounter)) { hitCounter = gameObject.AddComponent<HitCounter>(); } hitCounter.AddHit(); if (hitCounter.CheckForHeal()) { victimBody.RemoveBuff(RRPContent.Buffs.InsectPoison); SpawnOrb(damageReport, victimBody); } } } private static void SpawnOrb(DamageReport damageReport, CharacterBody victimBody) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) HealOrb val = new HealOrb(); ((Orb)val).origin = victimBody.aimOrigin; val.healValue = damageReport.attackerBody.maxHealth * (insectHealAmount / 100f); HurtBox mainHurtBox = damageReport.attackerBody.mainHurtBox; if (Object.op_Implicit((Object)(object)mainHurtBox)) { ((Orb)val).target = mainHurtBox; OrbManager.instance.AddOrb((Orb)(object)val); } } public void OnTakeDamageServer(DamageReport report) { if (report == null) { return; } GameObject attacker = report.attacker; if (Object.op_Implicit((Object)(object)attacker)) { CharacterBody component = attacker.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && report.damageInfo.procCoefficient > 0f) { applyPoision(component); } } } private void applyPoision(CharacterBody cb) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) if (cb.GetBuffCount(RRPContent.Buffs.InsectPoison) > 0) { cb.RemoveOldestTimedBuff(RRPContent.Buffs.InsectPoison.buffIndex); } cb.AddTimedBuffAuthority(RRPContent.Buffs.InsectPoison.buffIndex, (float)duration); } } public class HitCounter : MonoBehaviour { private int hitNumber; public void AddHit() { hitNumber++; } public void ResetHit() { hitNumber = 0; } public bool CheckForHeal() { if (hitNumber == hitsNeeded) { ResetHit(); return true; } return false; } } public sealed class BuffBehavior : BaseBuffBehaviour, IBodyStatArgModifier { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.InsectPoison; } public void ModifyStatArguments(StatHookEventArgs args) { if (((BaseBuffBehaviour)this).hasAnyStacks) { args.attackSpeedReductionMultAdd += insectAttackSpeed / 100f; args.moveSpeedReductionMultAdd += insectMoveSpeed / 100f; } } } public const string token = "RRP_ITEM_INTROINSECT_DESC"; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Duration of the insect posion per stack(default 7s)")] [FormatToken("RRP_ITEM_INTROINSECT_DESC", 0)] public static int duration = 7; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percentage of attack speed slow(default 50%)")] [FormatToken("RRP_ITEM_INTROINSECT_DESC", 1)] public static float insectAttackSpeed = 50f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percentage of movement speed slow(default 50%)")] [FormatToken("RRP_ITEM_INTROINSECT_DESC", 2)] public static float insectMoveSpeed = 50f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Percent life restored on hitting enemies per stack(default 10%)")] [FormatToken("RRP_ITEM_INTROINSECT_DESC", 3)] public static float insectHealAmount = 10f; [RiskOfOptionsConfigureField("RRP.Items", configDescOverride = "Hits needed to heal(default 5)")] [FormatToken("RRP_ITEM_INTROINSECT_DESC", 4)] public static int hitsNeeded = 5; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acIInsect", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return true; } } public class PoisonIvy : RRPItem { public sealed class Behavior : BaseItemBodyBehavior { private bool isRunning; private GameObject effect = RRPAssets.LoadAsset<GameObject>("PoisionIvyEffect", RRPBundle.Items); private SphereSearch search; private List<HealthComponent> healthComponents; public float baseRange = distance; [ItemDefAssociation] private static ItemDef GetItemDef() { return RRPContent.Items.PoisonIvy; } private void Update() { if (isRunning || ((BaseItemBodyBehavior)this).body.activeBuffsListCount < buffsNeeded) { return; } int num = 0; BuffIndex[] activeBuffsList = ((BaseItemBodyBehavior)this).body.activeBuffsList; for (int i = 0; i < activeBuffsList.Length; i++) { if (!BuffCatalog.GetBuffDef(activeBuffsList[i]).isDebuff) { num++; } } if (num >= buffsNeeded) { applyPoision(PickNextTargets(((BaseItemBodyBehavior)this).body.healthComponent)); isRunning = true; ((MonoBehaviour)this).StartCoroutine(waitCoroutine()); } } private IEnumerator waitCoroutine() { yield return (object)new WaitForSeconds(waitTime); isRunning = false; } public void applyPoision(List<HealthComponent> targets) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown EffectManager.SpawnEffect(effect, new EffectData { origin = ((BaseItemBodyBehavior)this).body.corePosition, rotation = Quaternion.identity, scale = distance }, true); if (targets == null) { return; } foreach (HealthComponent target in targets) { NetworkingHelpers.ApplyDot(target, ((Component)((BaseItemBodyBehavior)this).body).gameObject, (DotIndex)4, baseDuration + ((float)base.stack - 1f * stackDuration), 1f); } } public List<HealthComponent> PickNextTargets(HealthComponent playerHealthComp) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Expected O, but got Unknown //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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) if (search == null) { search = new SphereSearch(); } float num = baseRange; if (Object.op_Implicit((Object)(object)playerHealthComp) && Object.op_Implicit((Object)(object)playerHealthComp.body)) { num += playerHealthComp.body.radius; } TeamMask val = TeamMask.AllExcept((TeamIndex)1); search.mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask; search.radius = num; search.origin = playerHealthComp.body.corePosition; search.queryTriggerInteraction = (QueryTriggerInteraction)0; search.RefreshCandidates(); search.FilterCandidatesByHurtBoxTeam(val); search.FilterCandidatesByDistinctHurtBoxEntities(); HurtBox[] hurtBoxes = search.GetHurtBoxes(); healthComponents = new List<HealthComponent>(); HurtBox[] array = hurtBoxes; foreach (HurtBox val2 in array) { if ((Object)(object)val2.healthComponent != (Object)(object)playerHealthComp) { healthComponents.Add(val2.healthComponent); } } if (healthComponents.Count == 0) { return null; } return healthComponents; } } public sealed class BlightBehavior : BaseBuffBehaviour, IOnDamageDealtServerReceiver { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.IvyBlight; } public void OnDamageDealtServer(DamageReport damageReport) { if (((BaseBuffBehaviour)this).hasAnyStacks && Util.CheckRoll(15f, ((BaseBuffBehaviour)this).characterBody.master)) { NetworkingHelpers.ApplyDot(damageReport.victim, ((Component)((BaseBuffBehaviour)this).characterBody).gameObject, (DotIndex)5, 4f, 0.75f); } } } public sealed class PowerBehavior : BaseBuffBehaviour, IBodyStatArgModifier { [BuffDefAssociation] private static BuffDef GetBuffDef() { return RRPContent.Buffs.IvyPower; } public void ModifyStatArguments(StatHookEventArgs args) { if (((BaseBuffBehaviour)this).hasAnyStacks) { args.damageMultAdd += 20f; args.critDamageMultAdd += 25f; args.attackSpeedMultAdd += 20f; } } } private const string token = "RRP_ITEM_IVY_DESC"; public static int buffsNeeded = 2; public static float distance = 15f; public static float baseDuration = 5f; public static float stackDuration = 2f; public static float waitTime = 10f; public override RRPAssetRequest AssetRequest => RRPAssets.LoadAssetAsync<ItemAssetCollection>("acPoisonIvy", RRPBundle.Items); public override void Initialize() { } public override bool IsAvailable(ContentPack contentPack) { return false; } } public class InnerPiece : RRPItem { public sealed class Behavior : BaseItemBodyBehavior, IBodyStatArgModifier { private bool isGood = true; private int numDebuff; public void Update() { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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_007b: Invalid comparison between Unknown and I4 //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0071: 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_0075: Unknown result type (might be due to invalid IL or missing references) numDebuff = 0; BuffIndex[] debuffBuffIndices = BuffCatalog.debuffBuffIndices; foreach (BuffIndex val in debuffBuffIndices) { if (((BaseItemBodyBehavior