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 InterlopingArtifact v0.4.0
BepInEx/plugins/InterlopingArtifact.dll
Decompiled 10 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using HDeMods.INTER; using HDeMods.InterOptionalMods; using HarmonyLib; using On.RoR2; using ProperSave; using R2API; using RiskOfOptions; using RiskOfOptions.Components.Options; using RiskOfOptions.Components.Panel; using RiskOfOptions.OptionConfigs; using RiskOfOptions.Options; using RoR2; using RoR2.Achievements.Artifacts; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.SceneManagement; [assembly: IgnoresAccessChecksTo("RiskOfOptions")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("InterlopingArtifact")] [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyProduct("InterlopingArtifact")] [assembly: AssemblyTitle("InterlopingArtifact")] [assembly: AssemblyInformationalVersion("1.0.0+f63d5749a2bb254cdb89e451596ae7432a434bd3")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace HDeMods { public class CullingTracker : MonoBehaviour { private CharacterBody m_body; public bool canBeCulled; public bool isMinion; private bool m_isBigMan; private bool m_isVeryBigMan; private InterloperCullingZone m_rangeDisplayController; public bool Player { get; private set; } private void Awake() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: 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_0101: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Log.Warning("Culling Tracker created on Client."); return; } if (!InterlopingArtifact.artifactEnabled && !InterlopingArtifact.HurricaneRun) { Object.Destroy((Object)(object)this); return; } m_body = ((Component)this).GetComponent<CharacterBody>(); m_isBigMan = InterRefs.IsBigMan(m_body.bodyIndex); m_isVeryBigMan = InterRefs.IsVeryBigMan(m_body.bodyIndex); if (!Object.op_Implicit((Object)(object)m_body.master)) { Log.Warning(((Object)m_body).name + " master not found. Assuming this is not a player or a minion."); return; } if ((Object)(object)m_body.master.minionOwnership.ownerMaster != (Object)null) { CharacterBody body = m_body.master.minionOwnership.ownerMaster.GetBody(); if (!Object.op_Implicit((Object)(object)body)) { Log.Warning(((Object)m_body).name + " ownerMaster has no body! Assuming this is not a Geep or Gip!"); isMinion = true; return; } if (body.bodyIndex != InterRefs.Gup && body.bodyIndex != InterRefs.Geep) { isMinion = true; return; } } foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { if (!((Object)(object)m_body.master != (Object)(object)instance.master)) { Player = true; Log.Message(((Object)m_body).name + " is a player."); GameObject val = Object.Instantiate<GameObject>(InterloperCullingZone.rangeDisplayPrefab); NetworkServer.Spawn(val); m_rangeDisplayController = val.GetComponent<InterloperCullingZone>(); } } } private void FixedUpdate() { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0065: 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) if (!NetworkServer.active || m_isVeryBigMan) { return; } float num = InterlopingArtifact.aggressiveCullingRadius.Value; if (Player) { if (!InterRunInfo.instance.loiterPenaltyActive || !InterlopingArtifact.aggressiveCulling.Value) { m_rangeDisplayController.CallRpcSetVisibility(visibility: false); return; } m_rangeDisplayController.CallRpcSetPosition(((Component)this).transform.localPosition); m_rangeDisplayController.CallRpcSetSize(Vector3.one * (num * 2f)); m_rangeDisplayController.CallRpcSetVisibility(visibility: true); } else if (InterRunInfo.instance.loiterPenaltyActive) { if (m_isBigMan) { num *= 2f; } canBeCulled = !m_body.NearAnyPlayers(num); } } private void OnDestroy() { if (NetworkServer.active && Player) { NetworkServer.Destroy(((Component)m_rangeDisplayController).gameObject); } } } internal class InterloperCullingZone : NetworkBehaviour { public static GameObject rangeDisplayPrefab; private static Material material; private ObjectScaleCurve m_rangeDisplayRenderer; private bool m_visible; private bool m_visiblePreviousFrame; private bool m_enabledPreviousFrame; private static int kRpcRpcSetPosition; private static int kRpcRpcSetSize; private static int kRpcRpcSetVisibility; public static void InitZone() { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) GameObject val = InterlopingArtifact.InterBundle.LoadAsset<GameObject>("InterloperCullingZoneVisual"); rangeDisplayPrefab = PrefabAPI.InstantiateClone(val, "Interloper_CullZone"); Object.Destroy((Object)(object)val); material = Object.Instantiate<Material>(Addressables.LoadAssetAsync<Material>((object)"RoR2/Base/Teleporters/matTeleporterRangeIndicator.mat").WaitForCompletion()); ((Object)material).name = "matInterloperCullingZone"; material.SetTexture(InterRefs.remapTex, (Texture)(object)InterlopingArtifact.InterBundle.LoadAsset<Texture2D>("texRampCulling2")); material.SetFloat(InterRefs.softFactor, 0.25f); material.SetFloat(InterRefs.softPower, 1f); material.SetFloat(InterRefs.brightnessBoost, 0.1f); material.SetFloat(InterRefs.alphaBoost, 0.5f); material.SetFloat(InterRefs.intersectionStrength, 20f); ((Renderer)rangeDisplayPrefab.GetComponentInChildren<MeshRenderer>()).material = material; rangeDisplayPrefab.AddComponent<InterloperCullingZone>(); } private void Awake() { m_rangeDisplayRenderer = ((Component)this).GetComponent<ObjectScaleCurve>(); ((Behaviour)m_rangeDisplayRenderer).enabled = false; } private void Update() { if (m_visible != m_visiblePreviousFrame || InterlopingArtifact.showCullingRadius.Value != m_enabledPreviousFrame) { SetVisible(m_visible); } m_enabledPreviousFrame = InterlopingArtifact.showCullingRadius.Value; m_visiblePreviousFrame = m_visible; } private void SetVisible(bool visibility) { if (visibility && InterlopingArtifact.showCullingRadius.Value) { ((Behaviour)m_rangeDisplayRenderer).enabled = true; return; } m_rangeDisplayRenderer.Reset(); ((Behaviour)m_rangeDisplayRenderer).enabled = false; } [ClientRpc] public void RpcSetPosition(Vector3 position) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) SetPosition(position); } [ClientRpc] public void RpcSetSize(Vector3 size) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) SetSize(size); } [ClientRpc] public void RpcSetVisibility(bool visibility) { SetVisibility(visibility); } private void SetPosition(Vector3 position) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) ((Component)this).transform.localPosition = position; } private void SetSize(Vector3 size) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) m_rangeDisplayRenderer.baseScale = size; } private void SetVisibility(bool visibility) { m_visible = visibility; } private void UNetVersion() { } protected static void InvokeRpcRpcSetPosition(NetworkBehaviour obj, NetworkReader reader) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcSetPosition called on server."); } else { ((InterloperCullingZone)(object)obj).RpcSetPosition(reader.ReadVector3()); } } protected static void InvokeRpcRpcSetSize(NetworkBehaviour obj, NetworkReader reader) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcSetSize called on server."); } else { ((InterloperCullingZone)(object)obj).RpcSetSize(reader.ReadVector3()); } } protected static void InvokeRpcRpcSetVisibility(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcSetVisibility called on server."); } else { ((InterloperCullingZone)(object)obj).RpcSetVisibility(reader.ReadBoolean()); } } public void CallRpcSetPosition(Vector3 position) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcSetPosition called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcSetPosition); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(position); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcSetPosition"); } public void CallRpcSetSize(Vector3 size) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcSetSize called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcSetSize); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(size); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcSetSize"); } public void CallRpcSetVisibility(bool visibility) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcSetVisibility called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcSetVisibility); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); val.Write(visibility); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcSetVisibility"); } static InterloperCullingZone() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown kRpcRpcSetPosition = -200678569; NetworkBehaviour.RegisterRpcDelegate(typeof(InterloperCullingZone), kRpcRpcSetPosition, new CmdDelegate(InvokeRpcRpcSetPosition)); kRpcRpcSetSize = 1901424943; NetworkBehaviour.RegisterRpcDelegate(typeof(InterloperCullingZone), kRpcRpcSetSize, new CmdDelegate(InvokeRpcRpcSetSize)); kRpcRpcSetVisibility = 981719488; NetworkBehaviour.RegisterRpcDelegate(typeof(InterloperCullingZone), kRpcRpcSetVisibility, new CmdDelegate(InvokeRpcRpcSetVisibility)); NetworkCRC.RegisterBehaviour("InterloperCullingZone", 0); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { bool result = default(bool); return result; } public override void OnDeserialize(NetworkReader reader, bool initialState) { } } [RegisterAchievement("INTERLOPER_ARTIFACT", "Artifacts.Interloper", "", 3u, null)] public class InterAchievement : BaseObtainArtifactAchievement { public override ArtifactDef artifactDef => InterlopingArtifact.Artifact; } internal static class InterArtifactTrial { internal static void CheckArtifactTrial(orig_SetCurrentArtifact setCurrentArtifact, ArtifactTrialMissionController self, int artifact) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Invalid comparison between I4 and Unknown if (artifact == (int)InterlopingArtifact.Artifact.artifactIndex && NetworkServer.active) { InterlopingArtifact.artifactTrial = true; } setCurrentArtifact.Invoke(self, artifact); } internal static void BeginTrial(orig_OnEnter onEnter, EntityState self) { if (InterlopingArtifact.artifactTrial && NetworkServer.active) { InterRunInfo.instance.NetworkloiterPenaltyActive = true; } onEnter.Invoke(self); } internal static void OnShellTakeDamage(ArtifactTrialMissionController mc, DamageReport dr) { if (InterlopingArtifact.artifactTrial && NetworkServer.active) { InterlopingArtifact.artifactChallengeMult += 0.25f; } } internal static void OnShellDeath(ArtifactTrialMissionController mc, DamageReport dr) { if (InterlopingArtifact.artifactTrial && NetworkServer.active) { InterlopingArtifact.artifactChallengeMult = 1f; InterRunInfo.instance.NetworkloiterPenaltyActive = false; InterlopingArtifact.artifactTrial = false; } } } internal static class InterFormula { public static bool scrambleCode; private static GameObject CreateFormulaStones(bool doIt) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01c0: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_023a: Unknown result type (might be due to invalid IL or missing references) //IL_023f: Unknown result type (might be due to invalid IL or missing references) GameObject val = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/artifactworld/ArtifactFormulaDisplay (Bottom Half).prefab").WaitForCompletion(); GameObject val2 = Addressables.LoadAssetAsync<GameObject>((object)"RoR2/Base/artifactworld/ArtifactFormulaDisplay (Top Half).prefab").WaitForCompletion(); ((Object)val).name = DecryptButWorse("RGV2aWNlU2VyaWFsTWFuYWdlcg=="); if (scrambleCode) { val.transform.position = new Vector3(DecryptF("Mi4wNzkx"), DecryptF("LTAuMDE5"), DecryptF("My4wNjE1")); } else { val.transform.position = new Vector3(DecryptF("Mi4xMzY0"), DecryptF("LTAuMDE5"), DecryptF("My4wNjE1")); } if (scrambleCode) { val.transform.rotation = Quaternion.Euler(DecryptF("Mjcw"), DecryptF("MTU0Ljk2NjI="), DecryptF("MA==")); } else { val.transform.rotation = Quaternion.Euler(DecryptF("Mjcw"), DecryptF("MTUwLjg5MTY="), DecryptF("MA==")); } val.transform.localScale = new Vector3(DecryptF("MC4x"), DecryptF("MC4x"), DecryptF("MC4x")); ((Object)val2).name = DecryptButWorse("bWRsQ2hlc3Q0"); val2.transform.position = new Vector3(DecryptF("LTIxMi4xNDQ1"), DecryptF("MjAxLjc3NTc="), DecryptF("LTE5Ny40Nzk0")); val2.transform.rotation = Quaternion.Euler(DecryptF("MzA5LjExNTM="), DecryptF("MjM4Ljc4MTc="), DecryptF("MzU0LjczOTE=")); val2.transform.localScale = new Vector3(DecryptF("MC41"), DecryptF("MC41"), DecryptF("MC41")); ArtifactCompoundDef artifactCompoundDef = Addressables.LoadAssetAsync<ArtifactCompoundDef>((object)Decrypt("YWNkVHJpYW5nbGUuYXNzZXQ=")).WaitForCompletion(); ArtifactCompoundDef artifactCompoundDef2 = Addressables.LoadAssetAsync<ArtifactCompoundDef>((object)Decrypt("YWNkQ2lyY2xlLmFzc2V0")).WaitForCompletion(); ArtifactCompoundDef artifactCompoundDef3 = Addressables.LoadAssetAsync<ArtifactCompoundDef>((object)Decrypt("YWNkRGlhbW9uZC5hc3NldA==")).WaitForCompletion(); ArtifactCompoundDef artifactCompoundDef4 = Addressables.LoadAssetAsync<ArtifactCompoundDef>((object)Decrypt("YWNkU3F1YXJlLmFzc2V0")).WaitForCompletion(); ArtifactCompoundDef artifactCompoundDef5 = Addressables.LoadAssetAsync<ArtifactCompoundDef>((object)Decrypt("YWNkRW1wdHkuYXNzZXQ=")).WaitForCompletion(); ArtifactFormulaDisplay component = val.GetComponent<ArtifactFormulaDisplay>(); ArtifactFormulaDisplay component2 = val2.GetComponent<ArtifactFormulaDisplay>(); component.artifactCompoundDisplayInfos[3].artifactCompoundDef = artifactCompoundDef; component.artifactCompoundDisplayInfos[4].artifactCompoundDef = artifactCompoundDef2; component.artifactCompoundDisplayInfos[8].artifactCompoundDef = artifactCompoundDef3; component2.artifactCompoundDisplayInfos[8].artifactCompoundDef = artifactCompoundDef3; component2.artifactCompoundDisplayInfos[1].artifactCompoundDef = artifactCompoundDef; component2.artifactCompoundDisplayInfos[0].artifactCompoundDef = artifactCompoundDef3; component2.artifactCompoundDisplayInfos[2].artifactCompoundDef = artifactCompoundDef3; component2.artifactCompoundDisplayInfos[3].artifactCompoundDef = artifactCompoundDef4; component.artifactCompoundDisplayInfos[7].artifactCompoundDef = artifactCompoundDef; component2.artifactCompoundDisplayInfos[4].artifactCompoundDef = artifactCompoundDef2; component.artifactCompoundDisplayInfos[0].artifactCompoundDef = artifactCompoundDef5; component2.artifactCompoundDisplayInfos[5].artifactCompoundDef = artifactCompoundDef; component.artifactCompoundDisplayInfos[5].artifactCompoundDef = artifactCompoundDef4; component2.artifactCompoundDisplayInfos[6].artifactCompoundDef = artifactCompoundDef5; component.artifactCompoundDisplayInfos[2].artifactCompoundDef = artifactCompoundDef5; component2.artifactCompoundDisplayInfos[7].artifactCompoundDef = artifactCompoundDef; component.artifactCompoundDisplayInfos[1].artifactCompoundDef = artifactCompoundDef4; component.artifactCompoundDisplayInfos[6].artifactCompoundDef = artifactCompoundDef3; if (doIt) { return val2; } return val; } public static void SceneChanged(Scene old, Scene next) { if (((Scene)(ref next)).name == DecryptButWorse("bG9iYnk=")) { Object.Instantiate<GameObject>(CreateFormulaStones(doIt: false)); } if (((Scene)(ref next)).name == DecryptButWorse("cm9vdGp1bmdsZQ==")) { Object.Instantiate<GameObject>(CreateFormulaStones(doIt: true)); } } private static string Decrypt(string encodedString) { return Encoding.UTF8.GetString(Convert.FromBase64String("Um9SMi9CYXNlL0FydGlmYWN0Q29tcG91bmRzLw==")) + Encoding.UTF8.GetString(Convert.FromBase64String(encodedString)); } private static string DecryptButWorse(string encodedString) { return Encoding.UTF8.GetString(Convert.FromBase64String(encodedString)); } private static float DecryptF(string encodedString) { return float.Parse(Encoding.UTF8.GetString(Convert.FromBase64String(encodedString)), CultureInfo.InvariantCulture.NumberFormat); } } public static class InterlopingArtifact { internal static bool musicLoaded; public static AssetBundle InterBundle; public static readonly ArtifactDef Artifact = ScriptableObject.CreateInstance<ArtifactDef>(); private static GameObject InterInfo; private static GameObject m_interInfo; internal static CustomMusicTrackDef interlopeTrack; public static bool HurricaneRun; public static int StagesUntilWaveringBegins = 5; internal static bool artifactEnabled; private static bool teleporterExists; internal static float tickingTimer = 1f; internal static float tickingTimerHalfway = 1f; internal static sbyte halfwayFuse; private static bool teleporterHit; internal static int totalBlindPest; internal static float artifactChallengeMult = 1f; internal static bool artifactTrial; public static ConfigEntry<bool> forceUnlock { get; set; } public static ConfigEntry<bool> disableCodeHint { get; set; } public static ConfigEntry<float> timeUntilLoiterPenalty { get; set; } public static ConfigEntry<float> loiterPenaltyFrequency { get; set; } public static ConfigEntry<float> loiterPenaltySeverity { get; set; } public static ConfigEntry<bool> limitPest { get; set; } public static ConfigEntry<float> limitPestAmount { get; set; } public static ConfigEntry<float> warningSoundVolume { get; set; } public static ConfigEntry<bool> useTickingNoise { get; set; } public static ConfigEntry<bool> enableHalfwayWarning { get; set; } public static ConfigEntry<float> timeBeforeLoiterPenalty { get; set; } public static ConfigEntry<bool> respectEnemyCap { get; set; } public static ConfigEntry<bool> aggressiveCulling { get; set; } public static ConfigEntry<float> aggressiveCullingRadius { get; set; } public static ConfigEntry<bool> showCullingRadius { get; set; } public static ConfigEntry<float> warningMusicVolume { get; set; } public static ConfigEntry<bool> enableOnEclipse { get; set; } private static void RefreshAndClamp() { ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Reload(); timeUntilLoiterPenalty.Value = Math.Clamp(timeUntilLoiterPenalty.Value, 60f, 600f); loiterPenaltyFrequency.Value = Math.Clamp(loiterPenaltyFrequency.Value, 0f, 60f); loiterPenaltySeverity.Value = Math.Clamp(loiterPenaltySeverity.Value, 10f, 400f); limitPestAmount.Value = Math.Clamp(limitPestAmount.Value, 0f, 100f); warningSoundVolume.Value = Math.Clamp(warningSoundVolume.Value, 0f, 100f); timeBeforeLoiterPenalty.Value = Math.Clamp(timeBeforeLoiterPenalty.Value, 2f, 60f); aggressiveCullingRadius.Value = Math.Clamp(aggressiveCullingRadius.Value, 65f, 200f); } internal static void Startup() { if (!File.Exists(Assembly.GetExecutingAssembly().Location.Replace("InterlopingArtifact.dll", "interloperdeps.bin"))) { Log.Fatal("Could not find dependency file, aborting!"); return; } if (!File.Exists(Assembly.GetExecutingAssembly().Location.Replace("InterlopingArtifact.dll", "interloperassets"))) { Log.Fatal("Could not load asset bundle, aborting!"); return; } InterBundle = AssetBundle.LoadFromFile(Assembly.GetExecutingAssembly().Location.Replace("InterlopingArtifact.dll", "interloperassets")); CreateNetworkObject(); InterloperCullingZone.InitZone(); LoadMusic(); AddHooks(); } private static void LoadMusic() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: 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_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) CustomMusicData val = new CustomMusicData(); val.BanksFolderPath = Assembly.GetExecutingAssembly().Location.Replace("\\InterlopingArtifact.dll", ""); val.BepInPlugin = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Info.Metadata; val.InitBankName = "InterlopingArtifact_init"; val.PlayMusicSystemEventName = "Play_Inter_Music"; val.SoundBankName = "Inter_WarningSounds"; interlopeTrack = ScriptableObject.CreateInstance<CustomMusicTrackDef>(); ((MusicTrackDef)interlopeTrack).cachedName = "interlopeTrack"; interlopeTrack.SoundBankName = val.SoundBankName; interlopeTrack.CustomStates = new List<CustomState>(); CustomState val2 = default(CustomState); val2.GroupId = 3328571779u; val2.StateId = 3026340126u; CustomState item = val2; val2 = default(CustomState); val2.GroupId = 792781730u; val2.StateId = 89505537u; CustomState item2 = val2; interlopeTrack.CustomStates.Add(item); interlopeTrack.CustomStates.Add(item2); if (!Music.Add(val)) { Log.Error("Failed to add music, disabling music options."); } } private static void AddHooks() { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Expected O, but got Unknown Run.onRunSetRuleBookGlobal += Run_onRunSetRuleBookGlobal; Run.onRunStartGlobal += Run_onRunStartGlobal; Run.onRunDestroyGlobal += Run_onRunDestroyGlobal; Run.BeginStage += new hook_BeginStage(Run_BeginStage); Run.OnServerTeleporterPlaced += new hook_OnServerTeleporterPlaced(Run_OnServerTeleporterPlaced); IdleState.OnInteractionBegin += new hook_OnInteractionBegin(OnInteractTeleporter); CombatDirector.Simulate += new hook_Simulate(CombatDirector_Simulate); RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(InterRefs.CacheIndexes)); ArtifactTrialMissionController.SetCurrentArtifact += new hook_SetCurrentArtifact(InterArtifactTrial.CheckArtifactTrial); CombatState.OnEnter += new hook_OnEnter(InterArtifactTrial.BeginTrial); ArtifactTrialMissionController.onShellTakeDamageServer += InterArtifactTrial.OnShellTakeDamage; ArtifactTrialMissionController.onShellDeathServer += InterArtifactTrial.OnShellDeath; PlatformSystems.Init += new hook_Init(CheckForChunk); CharacterBody.onBodyStartGlobal += CharacterBody_onStartGlobal; CharacterBody.onBodyDestroyGlobal += TrackVerminRemove; RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(FinalHooks)); } private static void RemoveHooks() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Expected O, but got Unknown //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown Run.onRunSetRuleBookGlobal -= Run_onRunSetRuleBookGlobal; Run.onRunStartGlobal -= Run_onRunStartGlobal; Run.onRunDestroyGlobal -= Run_onRunDestroyGlobal; RoR2Application.onLoad = (Action)Delegate.Remove(RoR2Application.onLoad, new Action(InterRefs.CacheIndexes)); Run.BeginStage -= new hook_BeginStage(Run_BeginStage); Run.OnServerTeleporterPlaced -= new hook_OnServerTeleporterPlaced(Run_OnServerTeleporterPlaced); IdleState.OnInteractionBegin -= new hook_OnInteractionBegin(OnInteractTeleporter); CombatDirector.Simulate -= new hook_Simulate(CombatDirector_Simulate); ArtifactTrialMissionController.SetCurrentArtifact -= new hook_SetCurrentArtifact(InterArtifactTrial.CheckArtifactTrial); CombatState.OnEnter -= new hook_OnEnter(InterArtifactTrial.BeginTrial); ArtifactTrialMissionController.onShellTakeDamageServer -= InterArtifactTrial.OnShellTakeDamage; ArtifactTrialMissionController.onShellDeathServer -= InterArtifactTrial.OnShellDeath; CharacterBody.onBodyStartGlobal -= CharacterBody_onStartGlobal; CharacterBody.onBodyDestroyGlobal -= TrackVerminRemove; RoR2Application.onLoad = (Action)Delegate.Remove(RoR2Application.onLoad, new Action(FinalHooks)); } public static void CheckForChunk(orig_Init init) { if (ChunkyMode.Enabled && ChunkyMode.PluginVersion.Minor < 4) { Log.Fatal("Artifact of Interloper is not compatible with ChunkyMode versions prior to 0.4.0, aborting!"); RemoveHooks(); init.Invoke(); return; } BindSettings(); if (!AddArtifact()) { Log.Fatal("Could not add artifact, aborting!"); RemoveHooks(); init.Invoke(); return; } if (RoO.Enabled) { AddOptions(); } if (ProperSaves.Enabled) { ProperSaves.SetUp(); } InterlopingArtifactPlugin.startupSuccess = true; init.Invoke(); } private static bool AddArtifact() { //IL_006c: 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) Artifact.nameToken = "INTERLOPINGARTIFACT_NAME"; Artifact.descriptionToken = "INTERLOPINGARTIFACT_DESCRIPTION"; Artifact.smallIconDeselectedSprite = InterBundle.LoadAsset<Sprite>("texInterDeselectedIcon"); Artifact.smallIconSelectedSprite = InterBundle.LoadAsset<Sprite>("texInterSelectedIcon"); Artifact.cachedName = "Interloper"; Sha256HashAsset val = ScriptableObject.CreateInstance<Sha256HashAsset>(); val.value = Sha256Hash.FromHexString("F8C1F5810E6270F0259B663AA8578FAC6D77CA599AB0F4699C5FD2C565286201", 0); LanguageAPI.Add("INTERLOPINGARTIFACT_UNLOCK_NAME", "Interloper"); Artifact.unlockableDef = ScriptableObject.CreateInstance<UnlockableDef>(); Artifact.unlockableDef.nameToken = "INTERLOPINGARTIFACT_UNLOCK_NAME"; Artifact.unlockableDef.cachedName = "Artifacts.Interloper"; Artifact.unlockableDef.achievementIcon = InterBundle.LoadAsset<Sprite>("texObtainArtifactInterloperIcon"); Artifact.pickupModelPrefab = InterBundle.LoadAsset<GameObject>("PickupInterloper"); if (!ContentAddition.AddUnlockableDef(Artifact.unlockableDef)) { return false; } if (!ContentAddition.AddArtifactDef(Artifact)) { return false; } ArtifactCodeAPI.AddCode(Artifact, val); return true; } private static void BindSettings() { timeUntilLoiterPenalty = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Loitering", "Time until loiter penalty", 300f, "The amount of time from the start of the stage until the loiter penalty is enforced. Minimum of 60 seconds."); loiterPenaltyFrequency = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Loitering", "Loiter penalty frequency", 5f, "The amount of time between forced enemy spawns."); loiterPenaltySeverity = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Loitering", "Loiter penalty severity", 40f, "The strength of spawned enemies. 40 is equal to 1 combat shrine."); limitPest = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Limit Enemies", "Limit Blind Pest", false, "Enable Blind Pest limit."); limitPestAmount = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Limit Enemies", "Blind Pest Amount", 10f, "The percentage of enemies that are allowed to be blind pest. Only affects the Loitering penalty."); warningSoundVolume = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Warning", "Warning Sound Volume", 100f, "Volume of the warning sound. Set to 0 to disable."); useTickingNoise = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Warning", "Use Ticking Sound", false, "Use a clock ticking sound instead of a bell."); enableHalfwayWarning = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Warning", "Enable Halfway Warning", true, "Play the warning sound when the loiter timer reaches half way."); timeBeforeLoiterPenalty = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Warning", "Time Before Loiter Penalty", 15f, "How long before the Loiter Penalty the bells start tolling."); respectEnemyCap = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Enemy Cap", "Respect Enemy Cap", false, "Prevent additional enemies from spawning if the enemy cap is reached."); aggressiveCulling = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Enemy Cap", "Aggressive Culling", false, "Aggressively cull enemies that are not near living players."); aggressiveCullingRadius = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<float>("Enemy Cap", "Culling Radius", 75f, "The distance from players before enemies are considered for culling."); forceUnlock = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Artifact", "Force Unlock", false, "Force artifact to be available. This will not grant the achievement. Requires restart."); showCullingRadius = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Enemy Cap", "Show Culling Radius", false, "Display a radius around players to indicate where enemies will be culled."); disableCodeHint = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Artifact", "Disable Code Hints", false, "Prevent artifact code hints from appearing in game. Requires restart."); enableOnEclipse = ((BaseUnityPlugin)InterlopingArtifactPlugin.instance).Config.Bind<bool>("Experimental", "Enable on Eclipse", false, "Enables default ruleset for artifact when playing on Eclipse mode. Not recommended."); } internal static void SetVolumeEwEwEwEw() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) AkSoundEngine.SetRTPCValue("Inter_Volume_MSX", warningMusicVolume.Value); } private static void AddOptions() { //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Expected O, but got Unknown //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Expected O, but got Unknown //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Expected O, but got Unknown //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0239: Expected O, but got Unknown //IL_0209: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Expected O, but got Unknown RoO.Init("com.HDeDeDe.InterlopingArtifact", "InterlopingArtifact", Log.Error, Log.Debug); RoO.AddFloatStep(timeUntilLoiterPenalty, 60f, 600f, 1f, "{0}"); RoO.AddFloatStep(loiterPenaltyFrequency, 0f, 60f, 0.5f, "{0}"); RoO.AddFloatStep(loiterPenaltySeverity, 10f, 400f, 0.5f, "{0}"); RoO.AddButton("Reset to Default", "Loitering", new UnityAction(RoO.ResetToDefault)); RoO.AddCheck(limitPest); RoO.AddFloat(limitPestAmount, 0f, 100f); RoO.AddButton("Reset to Default", "Limit Enemies", new UnityAction(RoO.ResetToDefault)); RoO.AddFloatStep(warningSoundVolume, 0f, 100f, 0.5f); RoO.AddCheck(useTickingNoise); RoO.AddCheck(enableHalfwayWarning); RoO.AddFloatStep(timeBeforeLoiterPenalty, 2f, 60f, 1f, "{0}"); RoO.AddButton("Reset to Default", "Warning", new UnityAction(RoO.ResetToDefault)); RoO.AddCheck(respectEnemyCap); RoO.AddCheck(aggressiveCulling); RoO.AddFloatStep(aggressiveCullingRadius, 65f, 200f, 0.25f, "{0}m"); RoO.AddCheck(showCullingRadius); RoO.AddButton("Reset to Default", "Enemy Cap", new UnityAction(RoO.ResetToDefault)); RoO.AddCheck(forceUnlock, requireRestart: true); RoO.AddCheck(disableCodeHint, requireRestart: true); RoO.AddButton("Reset to Default", "Artifact", new UnityAction(RoO.ResetToDefault)); if (musicLoaded) { RoO.AddFloatStep(warningMusicVolume, 0f, 100f, 0.5f); RoO.AddButton("Set Volume", "Experimental", new UnityAction(SetVolumeEwEwEwEw)); } RoO.AddCheck(enableOnEclipse); RoO.AddButton("Reset to Default", "Experimental", new UnityAction(RoO.ResetToDefault)); RoO.SetSprite(Artifact.unlockableDef.achievementIcon); RoO.SetDescriptionToken("INTERLOPINGARTIFACT_RISK_OF_OPTIONS_DESCRIPTION"); } public static void RevokeArtifact() { foreach (LocalUser localUsers in LocalUserManager.localUsersList) { localUsers.userProfile.RevokeUnlockable(Artifact.unlockableDef); localUsers.userProfile.RevokeAchievement("INTERLOPER_ARTIFACT"); } Application.Quit(); } private static void FinalHooks() { RefreshAndClamp(); if (!disableCodeHint.Value) { SceneManager.activeSceneChanged += InterFormula.SceneChanged; } if (forceUnlock.Value) { RuleCatalog.ruleChoiceDefsByGlobalName["Artifacts.Interloper.On"].requiredUnlockable = null; RuleCatalog.ruleChoiceDefsByGlobalName["Artifacts.Interloper.Off"].requiredUnlockable = null; } } private static void CreateNetworkObject() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown GameObject val = new GameObject("thing"); val.AddComponent<NetworkIdentity>(); InterInfo = PrefabAPI.InstantiateClone(val, "InterloperRunInfo"); Object.Destroy((Object)(object)val); InterInfo.AddComponent<InterRunInfo>(); } internal static void Run_onRunSetRuleBookGlobal(Run arg1, RuleBook arg2) { artifactEnabled = false; if (RunArtifactManager.instance.IsArtifactEnabled(Artifact)) { artifactEnabled = true; } } internal static void Run_onRunStartGlobal(Run run) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 teleporterHit = false; teleporterExists = false; totalBlindPest = 0; artifactTrial = false; if (!NetworkServer.active) { return; } if (enableOnEclipse.Value && (int)run.selectedDifficulty >= 3) { HurricaneRun = true; } m_interInfo = Object.Instantiate<GameObject>(InterInfo); NetworkServer.Spawn(m_interInfo); if (!InterRunInfo.preSet) { RefreshAndClamp(); InterRunInfo.instance.limitPestsThisRun = limitPest.Value; InterRunInfo.instance.limitPestsAmountThisRun = limitPestAmount.Value; if (!HurricaneRun) { InterRunInfo.instance.loiterPenaltyTimeThisRun = timeUntilLoiterPenalty.Value; InterRunInfo.instance.loiterPenaltyFrequencyThisRun = loiterPenaltyFrequency.Value; InterRunInfo.instance.loiterPenaltySeverityThisRun = loiterPenaltySeverity.Value; } else if (!artifactEnabled) { InterRunInfo.instance.loiterPenaltyTimeThisRun = (float)((ConfigEntryBase)timeUntilLoiterPenalty).DefaultValue; InterRunInfo.instance.loiterPenaltyFrequencyThisRun = (float)((ConfigEntryBase)loiterPenaltyFrequency).DefaultValue; InterRunInfo.instance.loiterPenaltySeverityThisRun = (float)((ConfigEntryBase)loiterPenaltySeverity).DefaultValue; } else { InterRunInfo.instance.loiterPenaltyTimeThisRun = Math.Min(timeUntilLoiterPenalty.Value, (float)((ConfigEntryBase)timeUntilLoiterPenalty).DefaultValue); InterRunInfo.instance.loiterPenaltyFrequencyThisRun = Math.Min(loiterPenaltyFrequency.Value, (float)((ConfigEntryBase)loiterPenaltyFrequency).DefaultValue); InterRunInfo.instance.loiterPenaltySeverityThisRun = Math.Max(loiterPenaltySeverity.Value, (float)((ConfigEntryBase)loiterPenaltySeverity).DefaultValue); } } } internal static void Run_onRunDestroyGlobal(Run run) { artifactEnabled = false; HurricaneRun = false; teleporterHit = false; teleporterExists = false; totalBlindPest = 0; artifactTrial = false; InterRunInfo.preSet = false; Object.Destroy((Object)(object)m_interInfo); } internal static void CharacterBody_onStartGlobal(CharacterBody body) { //IL_000d: 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) ((Component)body).gameObject.AddComponent<CullingTracker>(); if (body.bodyIndex == InterRefs.FlyingVermin) { totalBlindPest++; } } internal static void TrackVerminRemove(CharacterBody body) { //IL_0001: 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) if (body.bodyIndex == InterRefs.FlyingVermin) { totalBlindPest--; } } internal static void Run_BeginStage(orig_BeginStage beginStage, Run self) { if (!artifactEnabled && !HurricaneRun) { beginStage.Invoke(self); return; } InterRunInfo.instance.NetworkloiterTick = 0f; teleporterHit = false; teleporterExists = false; halfwayFuse = 0; InterRunInfo.instance.NetworkallyCurse = 0f; InterRunInfo.instance.NetworkloiterPenaltyActive = false; Log.Info("Stage begin! Waiting for Teleporter to be created."); beginStage.Invoke(self); } internal static void Run_OnServerTeleporterPlaced(orig_OnServerTeleporterPlaced teleporterPlaced, Run self, SceneDirector sceneDirector, GameObject thing) { if ((!artifactEnabled && !HurricaneRun) || artifactTrial) { teleporterPlaced.Invoke(self, sceneDirector, thing); return; } teleporterExists = true; float num = InterRunInfo.instance.loiterPenaltyTimeThisRun; if (HurricaneRun && !artifactEnabled) { num -= num * 0.1f * (float)Math.Max(self.stageClearCount - StagesUntilWaveringBegins, 0); } InterRunInfo.instance.NetworkstagePunishTimer = self.NetworkfixedTime + Math.Max(num, 60f); Log.Info("Teleporter created! Timer set to " + InterRunInfo.instance.stagePunishTimer); InterRunInfo.instance.CallRpcCalcWarningTimer(); tickingTimerHalfway = InterRunInfo.instance.stagePunishTimer - (InterRunInfo.instance.stagePunishTimer - Run.instance.NetworkfixedTime) / 2f; teleporterPlaced.Invoke(self, sceneDirector, thing); } internal static void CombatDirector_Simulate(orig_Simulate simulate, CombatDirector self, float deltaTime) { //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) if (!InterRunInfo.instance.loiterPenaltyActive || teleporterHit || Run.instance.NetworkfixedTime < InterRunInfo.instance.loiterTick || (!artifactEnabled && !HurricaneRun && !artifactTrial)) { simulate.Invoke(self, deltaTime); return; } bool flag = false; if (aggressiveCulling.Value) { foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers((TeamIndex)2)) { CullingTracker component = ((Component)teamMember).gameObject.GetComponent<CullingTracker>(); if (!component.Player && !component.isMinion && component.canBeCulled && !teamMember.body.isBoss) { teamMember.body.healthComponent.Die(true); flag = true; } } } if (respectEnemyCap.Value && !flag) { bool flag2 = false; if (TeamComponent.GetTeamMembers((TeamIndex)2).Count >= TeamCatalog.GetTeamDef((TeamIndex)2).softCharacterLimit) { flag2 = true; } if (TeamComponent.GetTeamMembers((TeamIndex)4).Count >= TeamCatalog.GetTeamDef((TeamIndex)4).softCharacterLimit) { flag2 = true; } if (TeamComponent.GetTeamMembers((TeamIndex)3).Count >= TeamCatalog.GetTeamDef((TeamIndex)3).softCharacterLimit) { flag2 = true; } if (flag2) { InterRunInfo.instance.NetworkloiterTick = Run.instance.NetworkfixedTime + InterRunInfo.instance.loiterPenaltyFrequencyThisRun; simulate.Invoke(self, deltaTime); return; } } float num = artifactChallengeMult; if (artifactEnabled && HurricaneRun) { num += (float)Util.GetItemCountForTeam((TeamIndex)1, Items.MonstersOnShrineUse.itemIndex, false, true); } float num2 = InterRunInfo.instance.loiterPenaltySeverityThisRun * Stage.instance.entryDifficultyCoefficient * num; float monsterSpawnTimer = self.monsterSpawnTimer - deltaTime; DirectorCard currentMonsterCard = self.currentMonsterCard; DirectorCard val = self.SelectMonsterCardForCombatShrine(num2); if (val == null) { simulate.Invoke(self, deltaTime); return; } if ((Object)(object)val.spawnCard.prefab.GetComponent<CharacterMaster>().bodyPrefab == (Object)(object)BodyCatalog.GetBodyPrefab(InterRefs.FlyingVermin) && InterRunInfo.instance.limitPestsThisRun) { int num3 = 0; num3 += TeamComponent.GetTeamMembers((TeamIndex)2).Count; num3 += TeamComponent.GetTeamMembers((TeamIndex)4).Count; num3 += TeamComponent.GetTeamMembers((TeamIndex)3).Count; if ((float)totalBlindPest >= (float)num3 * (InterRunInfo.instance.limitPestsAmountThisRun / 100f)) { Log.Warning("Too many Blind Pest. Retrying in the next update."); simulate.Invoke(self, deltaTime); return; } } InterRunInfo.instance.NetworkloiterTick = Run.instance.NetworkfixedTime + InterRunInfo.instance.loiterPenaltyFrequencyThisRun; if (artifactEnabled && HurricaneRun) { InterRunInfo instance = InterRunInfo.instance; instance.NetworkallyCurse = instance.allyCurse + 0.035f; InterRunInfo.instance.CallRpcDirtyStats(); } self.monsterSpawnTimer = 0f; self.monsterCredit = num2; self.OverrideCurrentMonsterCard(val); simulate.Invoke(self, deltaTime); self.monsterSpawnTimer = monsterSpawnTimer; if (currentMonsterCard != null) { self.OverrideCurrentMonsterCard(currentMonsterCard); } } internal static void OnInteractTeleporter(orig_OnInteractionBegin interact, BaseState teleporterState, Interactor interactor) { if (!artifactEnabled && !HurricaneRun) { interact.Invoke(teleporterState, interactor); return; } InterRunInfo.instance.NetworkloiterPenaltyActive = false; teleporterHit = true; InterRunInfo.instance.NetworkallyCurse = 0f; InterRunInfo.instance.CallRpcDirtyStats(); interact.Invoke(teleporterState, interactor); } internal static void EnforceLoiter() { //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Expected O, but got Unknown if ((!artifactEnabled && !HurricaneRun) || Run.instance.isGameOverServer || artifactTrial || teleporterHit || !teleporterExists) { return; } if (InterRunInfo.instance.stagePunishTimer >= Run.instance.NetworkfixedTime) { if (Run.instance.NetworkfixedTime >= tickingTimer) { tickingTimer += 1f; InterRunInfo.instance.PlayWarningSound(); } if (NetworkServer.active && Run.instance.NetworkfixedTime >= tickingTimerHalfway && halfwayFuse < 3) { tickingTimerHalfway += 1f; halfwayFuse++; InterRunInfo.instance.CallRpcPlayHalfwaySound(); } } else if (!InterRunInfo.instance.loiterPenaltyActive && NetworkServer.active) { Log.Info("Time's up! Loitering penalty has been applied. StagePunishTimer " + InterRunInfo.instance.stagePunishTimer); InterRunInfo.instance.NetworkloiterPenaltyActive = true; halfwayFuse = 0; InterRunInfo.instance.CallRpcPlayFinalSound(); Chat.SendBroadcastChat((ChatMessageBase)new NpcChatMessage { baseToken = "INTERLOPINGARTIFACT_WARNING", formatStringToken = "INTERLOPINGARTIFACT_WARNING_FORMAT", sender = null, sound = null }); } } } internal class LocalizedCheckBoxOption : CheckBoxOption { [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public LocalizedCheckBoxOption(ConfigEntry<bool> configEntry, bool restart) : base(configEntry, restart) { Language.onCurrentLanguageChanged += ResetDescription; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public override void RegisterTokens() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private void ResetDescription() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } } internal class LocalizedIntSliderOption : IntSliderOption { [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public LocalizedIntSliderOption(ConfigEntry<int> configEntry, IntSliderConfig config) : base(configEntry, config) { Language.onCurrentLanguageChanged += ResetDescription; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public override void RegisterTokens() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private void ResetDescription() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } } internal class LocalizedSliderOption : SliderOption { [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public LocalizedSliderOption(ConfigEntry<float> configEntry, SliderConfig config) : base(configEntry, config) { Language.onCurrentLanguageChanged += ResetDescription; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public override void RegisterTokens() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private void ResetDescription() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } } internal class LocalizedSliderStepOption : StepSliderOption { [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public LocalizedSliderStepOption(ConfigEntry<float> configEntry, StepSliderConfig config) : base(configEntry, config) { Language.onCurrentLanguageChanged += ResetDescription; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public override void RegisterTokens() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private void ResetDescription() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } } internal class LocalizedButtonOption : GenericButtonOption { [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public LocalizedButtonOption(string name, string category, string description, string buttonText, UnityAction onButtonPressed) : base(name, category, description, buttonText, onButtonPressed) { Language.onCurrentLanguageChanged += ResetDescription; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public override void RegisterTokens() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private void ResetDescription() { ((BaseOption)this).Description = Language.GetString(((BaseOption)this).GetDescriptionToken()); } } internal static class InterRefs { internal const uint sfxTickTock = 1626947733u; internal const uint sfxGetOut = 3106412111u; internal const uint sfxBellToll = 2239523887u; internal const uint sfxBellFinal = 1844540516u; internal const uint musStateGameplay = 89505537u; internal const uint musGroupInter = 3328571779u; internal const uint musSystemMusic = 792781730u; internal const uint musStateInter = 3026340126u; internal static BodyIndex FlyingVermin; internal static BodyIndex Gup; internal static BodyIndex Geep; internal static BodyIndex[] VeryBigMen; internal static BodyIndex[] BigMen; internal static readonly int remapTex = Shader.PropertyToID("_RemapTex"); internal static readonly int softFactor = Shader.PropertyToID("_InvFade"); internal static readonly int softPower = Shader.PropertyToID("_SoftPower"); internal static readonly int brightnessBoost = Shader.PropertyToID("_Boost"); internal static readonly int alphaBoost = Shader.PropertyToID("_AlphaBoost"); internal static readonly int intersectionStrength = Shader.PropertyToID("_IntersectionStrength"); internal static void CacheIndexes() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_0028: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected I4, but got Unknown //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected I4, but got Unknown //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected I4, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected I4, but got Unknown //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected I4, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected I4, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected I4, but got Unknown //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected I4, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Expected I4, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected I4, but got Unknown //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Expected I4, but got Unknown //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Expected I4, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected I4, but got Unknown //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Expected I4, but got Unknown //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Expected I4, but got Unknown //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Expected I4, but got Unknown //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Expected I4, but got Unknown //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Expected I4, but got Unknown //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Expected I4, but got Unknown //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Expected I4, but got Unknown //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Expected I4, but got Unknown //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Expected I4, but got Unknown //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Expected I4, but got Unknown //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Expected I4, but got Unknown //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Expected I4, but got Unknown //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_019a: Expected I4, but got Unknown //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Expected I4, but got Unknown //IL_01b0: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Expected I4, but got Unknown //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Expected I4, but got Unknown FlyingVermin = BodyCatalog.FindBodyIndex("FlyingVerminBody"); Gup = BodyCatalog.FindBodyIndex("GupBody"); Geep = BodyCatalog.FindBodyIndex("GeepBody"); VeryBigMen = (BodyIndex[])(object)new BodyIndex[16] { (BodyIndex)(int)BodyCatalog.FindBodyIndex("ScavBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ElectricWormBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ArtifactShellBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("BrotherBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("BrotherHurtBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("FalseSonBossBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("MiniVoidRaidCrabBodyBase"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("MiniVoidRaidCrabBodyPhase3"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("MiniVoidRaidCrabBodyPhase2"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("MiniVoidRaidCrabBodyPhase1"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ScavLunar1Body"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ScavLunar2Body"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ScavLunar3Body"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ScavLunar4Body"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("TitanGoldBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("SuperRoboBallBossBody") }; BigMen = (BodyIndex[])(object)new BodyIndex[13] { (BodyIndex)(int)BodyCatalog.FindBodyIndex("VoidJailerBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("VoidDevastatorBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("LunarGolemBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("LunarWhispBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("BeetleQueenBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("TitanBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ClayBossBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("MagmaWormBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("ImpBossBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("RoboBallBossBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("MegaConstructBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("GrandparentBody"), (BodyIndex)(int)BodyCatalog.FindBodyIndex("GupBody") }; } internal static bool IsBigMan(BodyIndex body) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return BigMen.Any((BodyIndex index) => index == body); } internal static bool IsVeryBigMan(BodyIndex body) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return VeryBigMen.Any((BodyIndex index) => index == body); } } public class InterRunInfo : NetworkBehaviour { public static InterRunInfo instance; public static bool preSet; internal static InterSaveData saveData; internal MusicTrackOverride trackOverride; public float loiterPenaltyTimeThisRun; public float loiterPenaltyFrequencyThisRun; public float loiterPenaltySeverityThisRun; public bool limitPestsThisRun; public float limitPestsAmountThisRun; [SyncVar] public float allyCurse; [SyncVar] public float loiterTick; [SyncVar] public bool loiterPenaltyActive; [SyncVar] public float stagePunishTimer; private static int kRpcRpcPlayFinalSound; private static int kRpcRpcPlayHalfwaySound; private static int kRpcRpcDirtyStats; private static int kRpcRpcCalcWarningTimer; private static int kRpcRpcStopMusic; public float NetworkallyCurse { get { return allyCurse; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<float>(value, ref allyCurse, 1u); } } public float NetworkloiterTick { get { return loiterTick; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<float>(value, ref loiterTick, 2u); } } public bool NetworkloiterPenaltyActive { get { return loiterPenaltyActive; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<bool>(value, ref loiterPenaltyActive, 4u); } } public float NetworkstagePunishTimer { get { return stagePunishTimer; } [param: In] set { ((NetworkBehaviour)this).SetSyncVar<float>(value, ref stagePunishTimer, 8u); } } public void Awake() { instance = this; Object.DontDestroyOnLoad((Object)(object)this); trackOverride = ((Component)this).gameObject.AddComponent<MusicTrackOverride>(); ((Behaviour)trackOverride).enabled = false; trackOverride.track = (MusicTrackDef)(object)InterlopingArtifact.interlopeTrack; trackOverride.priority = 10; if (preSet) { loiterPenaltyTimeThisRun = saveData.loiterPenaltyTimeThisRun; loiterPenaltyFrequencyThisRun = saveData.loiterPenaltyFrequencyThisRun; loiterPenaltySeverityThisRun = saveData.loiterPenaltySeverityThisRun; limitPestsThisRun = saveData.limitPestsThisRun; limitPestsAmountThisRun = saveData.limitPestsAmountThisRun; } } [ClientRpc] public void RpcPlayFinalSound() { PlayFinalSound(); } [ClientRpc] public void RpcPlayHalfwaySound() { PlayHalfwaySound(); } public void PlayHalfwaySound() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) if (InterlopingArtifact.enableHalfwayWarning.Value) { AkSoundEngine.SetRTPCValue("Inter_Volume_SFX", InterlopingArtifact.warningSoundVolume.Value); if (InterlopingArtifact.useTickingNoise.Value) { AkSoundEngine.PostEvent(1626947733u, ((Component)InterlopingArtifactPlugin.instance).gameObject); } else { AkSoundEngine.PostEvent(2239523887u, ((Component)InterlopingArtifactPlugin.instance).gameObject); } } } public void PlayWarningSound() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) AkSoundEngine.SetRTPCValue("Inter_Volume_SFX", InterlopingArtifact.warningSoundVolume.Value); if (InterlopingArtifact.useTickingNoise.Value) { AkSoundEngine.PostEvent(1626947733u, ((Component)InterlopingArtifactPlugin.instance).gameObject); } else { AkSoundEngine.PostEvent(2239523887u, ((Component)InterlopingArtifactPlugin.instance).gameObject); } } public void PlayFinalSound() { //IL_000f: Unknown result type (might be due to invalid IL or missing references) AkSoundEngine.SetRTPCValue("Inter_Volume_SFX", InterlopingArtifact.warningSoundVolume.Value); if (InterlopingArtifact.useTickingNoise.Value) { AkSoundEngine.PostEvent(3106412111u, ((Component)InterlopingArtifactPlugin.instance).gameObject); } else { AkSoundEngine.PostEvent(1844540516u, ((Component)InterlopingArtifactPlugin.instance).gameObject); } } [ClientRpc] public void RpcDirtyStats() { DirtyStats(); } public void DirtyStats() { foreach (TeamComponent teamMember in TeamComponent.GetTeamMembers((TeamIndex)1)) { teamMember.body.MarkAllStatsDirty(); } } [ClientRpc] public void RpcCalcWarningTimer() { CalcWarningTimer(); } public void CalcWarningTimer() { InterlopingArtifact.tickingTimer = instance.stagePunishTimer - InterlopingArtifact.timeBeforeLoiterPenalty.Value; } [ClientRpc] public void RpcStopMusic() { StopMusicAlias(); } private void StopMusicAlias() { StopMusic(); } public void StopMusic() { ((Behaviour)trackOverride).enabled = false; ((MusicTrackDef)InterlopingArtifact.interlopeTrack).Stop(); MusicController.Instance.UpdateState(); } private void UNetVersion() { } protected static void InvokeRpcRpcPlayFinalSound(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcPlayFinalSound called on server."); } else { ((InterRunInfo)(object)obj).RpcPlayFinalSound(); } } protected static void InvokeRpcRpcPlayHalfwaySound(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcPlayHalfwaySound called on server."); } else { ((InterRunInfo)(object)obj).RpcPlayHalfwaySound(); } } protected static void InvokeRpcRpcDirtyStats(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcDirtyStats called on server."); } else { ((InterRunInfo)(object)obj).RpcDirtyStats(); } } protected static void InvokeRpcRpcCalcWarningTimer(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcCalcWarningTimer called on server."); } else { ((InterRunInfo)(object)obj).RpcCalcWarningTimer(); } } protected static void InvokeRpcRpcStopMusic(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError((object)"RPC RpcStopMusic called on server."); } else { ((InterRunInfo)(object)obj).RpcStopMusic(); } } public void CallRpcPlayFinalSound() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcPlayFinalSound called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcPlayFinalSound); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcPlayFinalSound"); } public void CallRpcPlayHalfwaySound() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcPlayHalfwaySound called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcPlayHalfwaySound); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcPlayHalfwaySound"); } public void CallRpcDirtyStats() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcDirtyStats called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcDirtyStats); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcDirtyStats"); } public void CallRpcCalcWarningTimer() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcCalcWarningTimer called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcCalcWarningTimer); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcCalcWarningTimer"); } public void CallRpcStopMusic() { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0041: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { Debug.LogError((object)"RPC Function RpcStopMusic called on client."); return; } NetworkWriter val = new NetworkWriter(); val.Write((short)0); val.Write((short)2); val.WritePackedUInt32((uint)kRpcRpcStopMusic); val.Write(((Component)this).GetComponent<NetworkIdentity>().netId); ((NetworkBehaviour)this).SendRPCInternal(val, 0, "RpcStopMusic"); } static InterRunInfo() { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Expected O, but got Unknown //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Expected O, but got Unknown //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown kRpcRpcPlayFinalSound = 1333417984; NetworkBehaviour.RegisterRpcDelegate(typeof(InterRunInfo), kRpcRpcPlayFinalSound, new CmdDelegate(InvokeRpcRpcPlayFinalSound)); kRpcRpcPlayHalfwaySound = 700160410; NetworkBehaviour.RegisterRpcDelegate(typeof(InterRunInfo), kRpcRpcPlayHalfwaySound, new CmdDelegate(InvokeRpcRpcPlayHalfwaySound)); kRpcRpcDirtyStats = 934462944; NetworkBehaviour.RegisterRpcDelegate(typeof(InterRunInfo), kRpcRpcDirtyStats, new CmdDelegate(InvokeRpcRpcDirtyStats)); kRpcRpcCalcWarningTimer = -1071366223; NetworkBehaviour.RegisterRpcDelegate(typeof(InterRunInfo), kRpcRpcCalcWarningTimer, new CmdDelegate(InvokeRpcRpcCalcWarningTimer)); kRpcRpcStopMusic = -1306191120; NetworkBehaviour.RegisterRpcDelegate(typeof(InterRunInfo), kRpcRpcStopMusic, new CmdDelegate(InvokeRpcRpcStopMusic)); NetworkCRC.RegisterBehaviour("InterRunInfo", 0); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { writer.Write(allyCurse); writer.Write(loiterTick); writer.Write(loiterPenaltyActive); writer.Write(stagePunishTimer); return true; } bool flag = false; if ((((NetworkBehaviour)this).syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(allyCurse); } if ((((NetworkBehaviour)this).syncVarDirtyBits & 2u) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(loiterTick); } if ((((NetworkBehaviour)this).syncVarDirtyBits & 4u) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(loiterPenaltyActive); } if ((((NetworkBehaviour)this).syncVarDirtyBits & 8u) != 0) { if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); flag = true; } writer.Write(stagePunishTimer); } if (!flag) { writer.WritePackedUInt32(((NetworkBehaviour)this).syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { allyCurse = reader.ReadSingle(); loiterTick = reader.ReadSingle(); loiterPenaltyActive = reader.ReadBoolean(); stagePunishTimer = reader.ReadSingle(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { allyCurse = reader.ReadSingle(); } if (((uint)num & 2u) != 0) { loiterTick = reader.ReadSingle(); } if (((uint)num & 4u) != 0) { loiterPenaltyActive = reader.ReadBoolean(); } if (((uint)num & 8u) != 0) { stagePunishTimer = reader.ReadSingle(); } } } internal struct InterSaveData { [DataMember(Name = "validCheck")] public bool isValidSave; [DataMember(Name = "loiterTime")] public float loiterPenaltyTimeThisRun; [DataMember(Name = "loiterFrequency")] public float loiterPenaltyFrequencyThisRun; [DataMember(Name = "loiterSeverity")] public float loiterPenaltySeverityThisRun; [DataMember(Name = "limitPest")] public bool limitPestsThisRun; [DataMember(Name = "pestCount")] public float limitPestsAmountThisRun; } [BepInPlugin("com.HDeDeDe.InterlopingArtifact", "InterlopingArtifact", "0.4.0")] [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.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public sealed class InterlopingArtifactPlugin : BaseUnityPlugin { public const string PluginGUID = "com.HDeDeDe.InterlopingArtifact"; public const string PluginAuthor = "HDeDeDe"; public const string PluginName = "InterlopingArtifact"; public const string PluginVersion = "0.4.0"; public static InterlopingArtifactPlugin instance; public static bool startupSuccess; private void Awake() { if ((Object)(object)instance != (Object)null) { Log.Error("Only one instance of InterlopingArtifactPlugin can exist at a time!"); Object.Destroy((Object)(object)this); } else { instance = this; Log.Init(((BaseUnityPlugin)this).Logger); InterlopingArtifact.Startup(); } } private void FixedUpdate() { InterlopingArtifact.EnforceLoiter(); } } } namespace HDeMods.INTER { internal static class Log { private static ManualLogSource logMe; internal static void Init(ManualLogSource logSource) { logMe = logSource; } internal static void Debug(object data) { logMe.LogDebug(data); } internal static void Error(object data) { logMe.LogError(data); } internal static void Fatal(object data) { logMe.LogFatal(data); } internal static void Info(object data) { logMe.LogInfo(data); } internal static void Message(object data) { logMe.LogMessage(data); } internal static void Warning(object data) { logMe.LogWarning(data); } } } namespace HDeMods.InterOptionalMods { internal static class ChunkyMode { public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.HDeDeDe.ChunkyMode"); public static Version PluginVersion => Chainloader.PluginInfos["com.HDeDeDe.ChunkyMode"].Metadata.Version; } internal static class RoO { public delegate void LogFunc(object data); private static string modGUID; private static string modNAME; private static LogFunc logError; private static bool initialized; public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.rune580.riskofoptions"); public static void Init(string modGuid, string modName, LogFunc errorFunc, LogFunc debugFunc = null) { logError = errorFunc; modGUID = modGuid; modNAME = modName; if (!Enabled) { logError("Risk of Options is not present, the author of " + modNAME + " did not check for this! Mod GUID: " + modGUID); } else { initialized = true; } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddCheck(ConfigEntry<bool> option, bool requireRestart = false) { if (initialized) { LocalizedCheckBoxOption localizedCheckBoxOption = new LocalizedCheckBoxOption(option, requireRestart); ModSettingsManager.AddOption((BaseOption)(object)localizedCheckBoxOption, modGUID, modNAME); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddInt(ConfigEntry<int> option, int minimum, int maximum) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if (initialized) { LocalizedIntSliderOption localizedIntSliderOption = new LocalizedIntSliderOption(option, new IntSliderConfig { min = minimum, max = maximum }); ModSettingsManager.AddOption((BaseOption)(object)localizedIntSliderOption, modGUID, modNAME); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddFloat(ConfigEntry<float> option, float minimum, float maximum, string format = "{0:0}%") { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown if (initialized) { LocalizedSliderOption localizedSliderOption = new LocalizedSliderOption(option, new SliderConfig { min = minimum, max = maximum, FormatString = format }); ModSettingsManager.AddOption((BaseOption)(object)localizedSliderOption, modGUID, modNAME); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddFloatStep(ConfigEntry<float> option, float minimum, float maximum, float step, string format = "{0:0}%") { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (initialized) { LocalizedSliderStepOption localizedSliderStepOption = new LocalizedSliderStepOption(option, new StepSliderConfig { min = minimum, max = maximum, FormatString = format, increment = step }); ModSettingsManager.AddOption((BaseOption)(object)localizedSliderStepOption, modGUID, modNAME); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void AddButton(string name, string category, UnityAction onButtonPressed) { if (initialized) { LocalizedButtonOption localizedButtonOption = new LocalizedButtonOption(name, category, "", "", onButtonPressed); ModSettingsManager.AddOption((BaseOption)(object)localizedButtonOption, modGUID, modNAME); } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void SetSprite(Sprite sprite) { ModSettingsManager.SetModIcon(sprite); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void SetDescriptionToken(string description) { ModSettingsManager.SetModDescriptionToken(description); } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void ResetToDefault() { if (!initialized) { return; } GameObject val = GameObject.Find("SettingsPanelTitle(Clone)"); if ((Object)(object)val == (Object)null) { val = GameObject.Find("SettingsPanel(Clone)"); } ModOptionPanelController component = val.GetComponent<ModOptionPanelController>(); ModSetting[] modSettings = component._modSettings; foreach (ModSetting val2 in modSettings) { if (!(((object)val2).GetType() == typeof(GenericButtonController))) { AccessTools.Method(((object)val2).GetType(), "ResetToDefault", (Type[])null, (Type[])null)?.Invoke(val2, null); } } } } internal static class ProperSaves { public static bool Enabled => Chainloader.PluginInfos.ContainsKey("com.KingEnderBrine.ProperSave"); [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] public static void SetUp() { InterFormula.scrambleCode = true; Loading.OnLoadingStarted += LoadFromSave; SaveFile.OnGatherSaveData += SaveRunInfo; } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void LoadFromSave(SaveFile save) { if (Loading.IsLoading) { if (save.ModdedData.TryGetValue("INTERLOPINGARTIFACT_RunInfo", out var value) && ((value != null) ? value.Value : null) is InterSaveData saveData && saveData.isValidSave) { InterRunInfo.saveData = saveData; InterRunInfo.preSet = true; } else { Log.Warning("Interloper RunInfo not present, skipping step."); } } } [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static void SaveRunInfo(Dictionary<string, object> save) { if (RunArtifactManager.instance.IsArtifactEnabled(InterlopingArtifact.Artifact) || InterlopingArtifact.HurricaneRun) { InterSaveData interSaveData = default(InterSaveData); interSaveData.isValidSave = true; interSaveData.loiterPenaltyTimeThisRun = InterRunInfo.instance.loiterPenaltyTimeThisRun; interSaveData.loiterPenaltyFrequencyThisRun = InterRunInfo.instance.loiterPenaltyFrequencyThisRun; interSaveData.loiterPenaltySeverityThisRun = InterRunInfo.instance.loiterPenaltySeverityThisRun; interSaveData.limitPestsThisRun = InterRunInfo.instance.limitPestsThisRun; interSaveData.limitPestsAmountThisRun = InterRunInfo.instance.limitPestsAmountThisRun; InterSaveData interSaveData2 = interSaveData; save.Add("INTERLOPINGARTIFACT_RunInfo", interSaveData2); } } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }