Decompiled source of SODLethalActionReborn v1.0.3

SOD.LethalActionReborn.dll

Decompiled 2 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using SOD.Common;
using SOD.Common.BepInEx;
using SOD.Common.Extensions;
using SOD.Common.Helpers;
using SOD.LethalActionReborn.Patches;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("SOD.LethalActionReborn")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+38ea4d9c1fc13999aced192e8db869f15ae499b1")]
[assembly: AssemblyProduct("SOD.LethalActionReborn")]
[assembly: AssemblyTitle("SOD.LethalActionReborn")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace SOD.LethalActionReborn
{
	[BepInPlugin("Venomaus.SOD.LethalActionReborn", "LethalActionReborn", "1.0.3")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class Plugin : PluginController<Plugin>
	{
		public const string PLUGIN_GUID = "Venomaus.SOD.LethalActionReborn";

		public const string PLUGIN_NAME = "LethalActionReborn";

		public const string PLUGIN_VERSION = "1.0.3";

		public override void Load()
		{
			Lib.SaveGame.OnAfterLoad += SaveGame_OnAfterLoad;
			Lib.SaveGame.OnAfterSave += SaveGame_OnAfterSave;
			Lib.SaveGame.OnAfterDelete += SaveGame_OnAfterDelete;
			((PluginController<Plugin, IEmptyBindings>)(object)this).Harmony.PatchAll(Assembly.GetExecutingAssembly());
			PluginController<Plugin, IEmptyBindings>.Log.LogInfo((object)"Plugin is patched.");
		}

		private void SaveGame_OnAfterDelete(object sender, SaveGameArgs e)
		{
			string uniqueString = Lib.SaveGame.GetUniqueString(e.FilePath);
			string savestoreDirectoryPath = Lib.SaveGame.GetSavestoreDirectoryPath(Assembly.GetExecutingAssembly(), "lethalActioned_" + uniqueString + ".txt");
			if (File.Exists(savestoreDirectoryPath))
			{
				File.Delete(savestoreDirectoryPath);
			}
		}

		private void SaveGame_OnAfterSave(object sender, SaveGameArgs e)
		{
			string uniqueString = Lib.SaveGame.GetUniqueString(e.FilePath);
			File.WriteAllText(Lib.SaveGame.GetSavestoreDirectoryPath(Assembly.GetExecutingAssembly(), "lethalActioned_" + uniqueString + ".txt"), string.Join(",", CitizenPatches.Citizen_RecieveDamage.KilledCitizens));
		}

		private void SaveGame_OnAfterLoad(object sender, SaveGameArgs e)
		{
			string uniqueString = Lib.SaveGame.GetUniqueString(e.FilePath);
			string savestoreDirectoryPath = Lib.SaveGame.GetSavestoreDirectoryPath(Assembly.GetExecutingAssembly(), "lethalActioned_" + uniqueString + ".txt");
			if (!File.Exists(savestoreDirectoryPath))
			{
				return;
			}
			HashSet<int> hashSet = (from a in File.ReadAllText(savestoreDirectoryPath).Split(new char[1] { ',' }, StringSplitOptions.RemoveEmptyEntries)
				select int.Parse(a)).ToHashSet();
			HashSet<int> hashSet2 = (from a in EnumerableExtensions.ToList<Human>(CityData.Instance.deadCitizensDirectory)
				select a.humanID).ToHashSet();
			Human val = default(Human);
			foreach (int item in hashSet)
			{
				CitizenPatches.Citizen_RecieveDamage.KilledCitizens.Add(item);
				if (CityData.Instance.citizenDictionary.TryGetValue(item, ref val))
				{
					((Actor)val).SetHealth(0f);
					((Actor)val).animationController.cit.Murder((Human)(object)Player.Instance, false, (Murder)null, (Interactable)null, 1f);
					if (!hashSet2.Contains(item))
					{
						CityData.Instance.deadCitizensDirectory.Add(val);
						hashSet2.Add(item);
					}
					if ((Object)(object)MurderController.Instance.currentMurderer != (Object)null && MurderController.Instance.currentMurderer.humanID == item)
					{
						MurderController.Instance.PickNewMurderer();
						MurderController.Instance.PickNewVictim();
					}
					if ((Object)(object)MurderController.Instance.currentVictim != (Object)null && MurderController.Instance.currentVictim.humanID == item)
					{
						MurderController.Instance.PickNewVictim();
					}
				}
			}
		}
	}
}
namespace SOD.LethalActionReborn.Patches
{
	internal class CitizenPatches
	{
		[HarmonyPatch(typeof(Citizen), "RecieveDamage")]
		internal static class Citizen_RecieveDamage
		{
			internal static readonly HashSet<int> KilledCitizens = new HashSet<int>();

			private static bool _hasKilled = false;

			[HarmonyPrefix]
			internal static void Prefix(Citizen __instance, float amount, Actor fromWho)
			{
				if ((Object)(object)fromWho == (Object)(object)Player.Instance && ((Actor)__instance).ai.ko)
				{
					_hasKilled = true;
				}
			}

			[HarmonyPostfix]
			internal static void Postfix(Citizen __instance, Actor fromWho)
			{
				if (!((Actor)__instance).isDead && _hasKilled && (Object)(object)fromWho == (Object)(object)Player.Instance)
				{
					_hasKilled = false;
					((Actor)__instance).SetHealth(0f);
					((Actor)__instance).animationController.cit.Murder((Human)(object)Player.Instance, false, (Murder)null, (Interactable)null, 1f);
					CityData.Instance.deadCitizensDirectory.Add((Human)(object)__instance);
					KilledCitizens.Add(((Human)__instance).humanID);
					if ((Object)(object)MurderController.Instance.currentMurderer != (Object)null && MurderController.Instance.currentMurderer.humanID == ((Human)__instance).humanID)
					{
						MurderController.Instance.PickNewMurderer();
						MurderController.Instance.PickNewVictim();
					}
					if ((Object)(object)MurderController.Instance.currentVictim != (Object)null && MurderController.Instance.currentVictim.humanID == ((Human)__instance).humanID)
					{
						MurderController.Instance.PickNewVictim();
					}
				}
			}
		}
	}
}