Decompiled source of InterrogatorGuiltyRework v1.2.0

InterrogatorGuiltyRework.dll

Decompiled 2 months ago
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using GuiltyPatch.Components;
using GuiltyPatch.Content;
using GuiltyPatch.Patches;
using HarmonyLib;
using InterrogatorMod.Interrogator.Components;
using InterrogatorMod.Interrogator.Content;
using InterrogatorMod.Interrogator.SkillStates;
using R2API;
using R2API.Networking;
using R2API.Networking.Interfaces;
using RoR2;
using UnityEngine;
using UnityEngine.Networking;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("InterrogatorGuiltyRework")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP")]
[assembly: AssemblyProduct("InterrogatorGuiltyRework")]
[assembly: AssemblyCopyright("Copyright © HP 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("6b95f5ec-cfc6-4d7f-a17c-8392cbd59d62")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace GuiltyPatch
{
	[HarmonyPatch(typeof(InterrogatorTracker), "SearchForTarget")]
	public static class GuiltyAllyTargetingPatch
	{
		private static void Postfix(InterrogatorTracker __instance)
		{
			if ((Object)(object)__instance == (Object)null)
			{
				return;
			}
			BullseyeSearch value = Traverse.Create((object)__instance).Field("search").GetValue<BullseyeSearch>();
			if (value == null)
			{
				return;
			}
			((TeamMask)(ref value.teamMaskFilter)).AddTeam((TeamIndex)1);
			value.RefreshCandidates();
			value.FilterOutGameObject(((Component)__instance).gameObject);
			CharacterBody value2 = Traverse.Create((object)__instance).Field("characterBody").GetValue<CharacterBody>();
			if ((Object)(object)value2 != (Object)null)
			{
				foreach (HurtBox result in value.GetResults())
				{
					if ((Object)(object)result?.healthComponent?.body != (Object)null)
					{
						CharacterBody body = result.healthComponent.body;
						GenericSkill val = value2.skillLocator?.special;
						bool flag = ((val != null) ? val.skillNameToken : null) == "KENKO_INTERROGATOR_SPECIAL_SCEPTER_CONVICT_NAME";
						if (!body.HasBuff(InterrogatorBuffs.interrogatorGuiltyDebuff) && !flag)
						{
							value.FilterOutGameObject(((Component)body).gameObject);
						}
					}
				}
			}
			HurtBox value3 = value.GetResults().FirstOrDefault();
			Traverse.Create((object)__instance).Field("trackingTarget").SetValue((object)value3);
			Debug.Log((object)"[GuiltyPatch] Ally targeting enabled: Player team added and candidates refreshed.");
		}
	}
	[HarmonyPatch(typeof(DamageTypes), "GlobalEventManager_onServerDamageDealt")]
	public static class GuiltyAllyPermanentPatch
	{
		private static void Postfix(DamageReport damageReport)
		{
			//IL_003d: 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_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody val = damageReport?.attackerBody;
			CharacterBody val2 = damageReport?.victimBody;
			if ((Object)(object)val == (Object)null || (Object)(object)val2 == (Object)null || !DamageAPI.HasModdedDamageType(damageReport.damageInfo, DamageTypes.InterrogatorGuilty))
			{
				return;
			}
			TeamComponent teamComponent = val.teamComponent;
			TeamIndex? val3 = ((teamComponent != null) ? new TeamIndex?(teamComponent.teamIndex) : null);
			TeamComponent teamComponent2 = val2.teamComponent;
			if (val3 == ((teamComponent2 != null) ? new TeamIndex?(teamComponent2.teamIndex) : null))
			{
				BuffDef interrogatorGuiltyDebuff = InterrogatorBuffs.interrogatorGuiltyDebuff;
				if (val2.HasBuff(interrogatorGuiltyDebuff))
				{
					val2.ClearTimedBuffs(interrogatorGuiltyDebuff);
					val2.AddBuff(interrogatorGuiltyDebuff);
					Debug.Log((object)"[GuiltyPatch] Damage-based: Converted ally Guilty to permanent.");
				}
			}
		}
	}
	[HarmonyPatch(typeof(Convict), "OnEnter")]
	public static class GuiltyAllyConvictBuffPatch
	{
		private static void Postfix(Convict __instance)
		{
			CharacterBody value = Traverse.Create((object)__instance).Field("victimBody").GetValue<CharacterBody>();
			if (!((Object)(object)value == (Object)null))
			{
				BuffDef interrogatorGuiltyDebuff = InterrogatorBuffs.interrogatorGuiltyDebuff;
				if (value.HasBuff(interrogatorGuiltyDebuff))
				{
					value.ClearTimedBuffs(interrogatorGuiltyDebuff);
					value.AddBuff(interrogatorGuiltyDebuff);
					Debug.Log((object)"[GuiltyPatch] Convict.OnEnter: Ensured victim’s Guilty is permanent.");
				}
			}
		}
	}
	[BepInPlugin("gabriel.guiltypatch", "GuiltyPatch", "1.0.0")]
	public class GuiltyPatchPlugin : BaseUnityPlugin
	{
		private void Awake()
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			Harmony val = new Harmony("gabriel.guiltypatch");
			val.PatchAll(typeof(ConvictGuiltyStackPatch).Assembly);
			InterrogatorExtraBuffs.Init();
			Debug.Log((object)"[GuiltyPatch] Patches applied.");
		}
	}
}
namespace GuiltyPatch.Content
{
	public static class InterrogatorExtraBuffs
	{
		public static BuffDef interrogatorConvictGuiltyBuff;

		internal static void Init()
		{
			//IL_0020: Unknown result type (might be due to invalid IL or missing references)
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			interrogatorConvictGuiltyBuff = ScriptableObject.CreateInstance<BuffDef>();
			((Object)interrogatorConvictGuiltyBuff).name = "InterrogatorConvictGuiltyBuff";
			interrogatorConvictGuiltyBuff.buffColor = Color.red;
			interrogatorConvictGuiltyBuff.canStack = true;
			interrogatorConvictGuiltyBuff.isDebuff = false;
			interrogatorConvictGuiltyBuff.isHidden = false;
			interrogatorConvictGuiltyBuff.iconSprite = null;
			ContentAddition.AddBuffDef(interrogatorConvictGuiltyBuff);
		}
	}
}
namespace GuiltyPatch.Components
{
	public class ConvictedStackLink : MonoBehaviour
	{
		public CharacterBody victimBody;

		public CharacterBody attackerBody;

		public int convictGrantedStacks;

		private void OnDestroy()
		{
			if ((Object)(object)attackerBody != (Object)null && convictGrantedStacks > 0)
			{
				for (int i = 0; i < convictGrantedStacks; i++)
				{
					attackerBody.RemoveBuff(InterrogatorBuffs.interrogatorGuiltyBuff);
				}
				convictGrantedStacks = 0;
				attackerBody = null;
			}
		}
	}
}
namespace GuiltyPatch.Patches
{
	[HarmonyPatch(typeof(ConvictedController), "OnDestroy")]
	public static class ConvictedControllerHybrid
	{
		private static bool Prefix(ConvictedController __instance)
		{
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Expected O, but got Unknown
			CharacterBody attackerBody = __instance.attackerBody;
			CharacterBody characterBody = __instance.characterBody;
			if (!NetworkServer.active || (Object)(object)attackerBody == (Object)null || (Object)(object)characterBody == (Object)null)
			{
				return false;
			}
			attackerBody.RemoveOldestTimedBuff(InterrogatorBuffs.interrogatorConvictBuff);
			if (!characterBody.healthComponent.alive)
			{
				attackerBody.healthComponent.AddBarrier(attackerBody.healthComponent.fullCombinedHealth * 0.5f);
				attackerBody.AddTimedBuff(Buffs.ArmorBoost, 3f);
			}
			NetworkIdentity component = ((Component)attackerBody).GetComponent<NetworkIdentity>();
			if ((Object)(object)component != (Object)null)
			{
				NetMessageExtensions.Send((INetMessage)new SyncSword(component.netId, false), (NetworkDestination)1);
			}
			Debug.Log((object)"[GuiltyPatch] Hybrid OnDestroy: skipped Guilty wipe, preserved barrier/armor + sword sync.");
			return false;
		}
	}
	[HarmonyPatch(typeof(DamageTypes), "GlobalEventManager_onServerDamageDealt")]
	public static class ConvictGuiltyStackPatch
	{
		private static void Postfix(DamageReport damageReport)
		{
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			CharacterBody val = damageReport?.attackerBody;
			CharacterBody val2 = damageReport?.victimBody;
			if (!((Object)(object)val == (Object)null) && !((Object)(object)val2 == (Object)null) && DamageAPI.HasModdedDamageType(damageReport.damageInfo, DamageTypes.InterrogatorConvict) && val2.HasBuff(InterrogatorBuffs.interrogatorConvictBuff) && val2.HasBuff(InterrogatorBuffs.interrogatorGuiltyDebuff))
			{
				ConvictedStackLink convictedStackLink = ((Component)val2).GetComponent<ConvictedStackLink>();
				if ((Object)(object)convictedStackLink == (Object)null)
				{
					convictedStackLink = ((Component)val2).gameObject.AddComponent<ConvictedStackLink>();
					convictedStackLink.victimBody = val2;
					convictedStackLink.attackerBody = val;
				}
				else if ((Object)(object)convictedStackLink.attackerBody == (Object)null)
				{
					convictedStackLink.attackerBody = val;
				}
				convictedStackLink.convictGrantedStacks++;
				val.AddBuff(InterrogatorExtraBuffs.interrogatorConvictGuiltyBuff);
				Debug.Log((object)("[GuiltyPatch] Convict hit: victim=" + val2.GetDisplayName() + ", " + $"tally={convictedStackLink.convictGrantedStacks}, " + $"convictBuffCount={val.GetBuffCount(InterrogatorExtraBuffs.interrogatorConvictGuiltyBuff)}"));
			}
		}
	}
	[HarmonyPatch(typeof(Stage), "Start")]
	public static class StageResetPatch
	{
		private static void Postfix()
		{
			foreach (CharacterBody readOnlyInstances in CharacterBody.readOnlyInstancesList)
			{
				ConvictedStackLink component = ((Component)readOnlyInstances).GetComponent<ConvictedStackLink>();
				if ((Object)(object)component != (Object)null && (Object)(object)component.attackerBody != (Object)null && component.convictGrantedStacks > 0)
				{
					for (int i = 0; i < component.convictGrantedStacks; i++)
					{
						component.attackerBody.RemoveBuff(InterrogatorBuffs.interrogatorGuiltyBuff);
					}
					component.convictGrantedStacks = 0;
					component.attackerBody = null;
				}
			}
			Debug.Log((object)"[GuiltyPatch] Stage transition: cleared Convict-granted Guilty stacks.");
		}
	}
}