Decompiled source of TerminalConflictFix v1.2.2

TerminalConflictFix.dll

Decompiled 8 months ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using IL;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("TerminalConflictFix")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("A mod for Lethal Company")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+3f7f6cc6f8b42b1e8e5527bbd41d70f55c3ff7a6")]
[assembly: AssemblyProduct("TerminalConflictFix")]
[assembly: AssemblyTitle("TerminalConflictFix")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace TerminalConflictFix
{
	public class Config
	{
		public static ConfigEntry<bool> RemoveCommandPunctuation { get; private set; }

		public Config(ConfigFile cfg)
		{
			RemoveCommandPunctuation = cfg.Bind<bool>("General", "RemoveCommandPunctuation", true, "Whether dashes and other punctuation in commands should be ignored, to fix issues with modded names. It's recommended to leave this ON.");
		}
	}
	[BepInPlugin("SylviBlossom.TerminalConflictFix", "TerminalConflictFix", "1.2.2")]
	public class Plugin : BaseUnityPlugin
	{
		[CompilerGenerated]
		private static class <>O
		{
			public static Manipulator <0>__Terminal_ParseWord;

			public static Manipulator <1>__Terminal_ParseWordOverrideOptions;

			public static Manipulator <2>__Terminal_CheckForExactSentences;

			public static Manipulator <3>__Terminal_CheckForPlayerNameCommand;
		}

		private static string currentWord;

		private static TerminalNode longestMatch;

		private static int longestMatchIndex;

		private static int matchLength;

		public static Plugin Instance { get; internal set; }

		public static Config Config { get; internal set; }

		public static ManualLogSource Logger { get; internal set; }

		private void Awake()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Expected O, but got Unknown
			//IL_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0082: Expected O, but got Unknown
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009d: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Expected O, but got Unknown
			Instance = this;
			Config = new Config(((BaseUnityPlugin)this).Config);
			Logger = ((BaseUnityPlugin)this).Logger;
			object obj = <>O.<0>__Terminal_ParseWord;
			if (obj == null)
			{
				Manipulator val = Terminal_ParseWord;
				<>O.<0>__Terminal_ParseWord = val;
				obj = (object)val;
			}
			Terminal.ParseWord += (Manipulator)obj;
			object obj2 = <>O.<1>__Terminal_ParseWordOverrideOptions;
			if (obj2 == null)
			{
				Manipulator val2 = Terminal_ParseWordOverrideOptions;
				<>O.<1>__Terminal_ParseWordOverrideOptions = val2;
				obj2 = (object)val2;
			}
			Terminal.ParseWordOverrideOptions += (Manipulator)obj2;
			object obj3 = <>O.<2>__Terminal_CheckForExactSentences;
			if (obj3 == null)
			{
				Manipulator val3 = Terminal_CheckForExactSentences;
				<>O.<2>__Terminal_CheckForExactSentences = val3;
				obj3 = (object)val3;
			}
			Terminal.CheckForExactSentences += (Manipulator)obj3;
			object obj4 = <>O.<3>__Terminal_CheckForPlayerNameCommand;
			if (obj4 == null)
			{
				Manipulator val4 = Terminal_CheckForPlayerNameCommand;
				<>O.<3>__Terminal_CheckForPlayerNameCommand = val4;
				obj4 = (object)val4;
			}
			Terminal.CheckForPlayerNameCommand += (Manipulator)obj4;
			Logger.LogInfo((object)"Plugin TerminalConflictFix is loaded!");
		}

		private static void Terminal_ParseWord(ILContext il)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0171: Unknown result type (might be due to invalid IL or missing references)
			//IL_017d: Unknown result type (might be due to invalid IL or missing references)
			//IL_028c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0298: Unknown result type (might be due to invalid IL or missing references)
			//IL_0331: Unknown result type (might be due to invalid IL or missing references)
			//IL_0369: Unknown result type (might be due to invalid IL or missing references)
			//IL_0427: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			int keywordLoc = 0;
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchLdnull(instr1),
				(Instruction instr2) => ILPatternMatchingExt.MatchStloc(instr2, ref keywordLoc)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ After keyword local");
				return;
			}
			val.EmitDelegate<Action>((Action)delegate
			{
				matchLength = 0;
			});
			int iLoc = -1;
			ILCursor[] array = default(ILCursor[]);
			if (!val.TryFindNext(ref array, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchLdfld<TerminalNodesList>(instr1, "allKeywords"),
				(Instruction instr2) => ILPatternMatchingExt.MatchLdloc(instr2, ref iLoc)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ Find 'i' variable");
				return;
			}
			ILLabel val3 = default(ILLabel);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchLdfld<Terminal>(instr1, "hasGottenVerb"),
				(Instruction instr2) => ILPatternMatchingExt.MatchBrtrue(instr2, ref val3)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ currentWord optimization");
				return;
			}
			val.MoveAfterLabels();
			val.Emit(OpCodes.Ldarg_0);
			val.Emit(OpCodes.Ldloc, iLoc);
			val.EmitDelegate<Action<Terminal, int>>((Action<Terminal, int>)delegate(Terminal self, int i)
			{
				currentWord = self.terminalNodes.allKeywords[i].word;
				if (Config.RemoveCommandPunctuation.Value)
				{
					currentWord = self.RemovePunctuation(currentWord.Replace(' ', '-'));
				}
			});
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdfld<TerminalKeyword>(instr, "word")
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ Fix word dashes 1");
				return;
			}
			val.EmitDelegate<Func<string, string>>((Func<string, string>)((string word) => currentWord));
			ILLabel continueLabel = null;
			if (!val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdloc(instr, keywordLoc)
			}) || !val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchBrfalse(instr, ref continueLabel)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ Keyword null check");
				return;
			}
			val.Emit(OpCodes.Pop);
			val.Emit(OpCodes.Ldc_I4_1);
			int jLoc = 2;
			ILLabel val2 = default(ILLabel);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[3]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchCallOrCallvirt<string>(instr1, "get_Length"),
				(Instruction instr2) => ILPatternMatchingExt.MatchStloc(instr2, ref jLoc),
				(Instruction instr3) => ILPatternMatchingExt.MatchBr(instr3, ref val2)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ Substring loop");
				return;
			}
			val.MoveAfterLabels();
			val.Emit(OpCodes.Ldloc, jLoc);
			val.EmitDelegate<Func<int, bool>>((Func<int, bool>)((int j) => j <= matchLength));
			val.Emit(OpCodes.Brtrue_S, (object)continueLabel);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdfld<TerminalKeyword>(instr, "word")
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ Fix word dashes 2");
				return;
			}
			val.EmitDelegate<Func<string, string>>((Func<string, string>)((string word) => currentWord));
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchStloc(instr, keywordLoc)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWord @ Set matched keyword");
				return;
			}
			val.Emit(OpCodes.Ldloc, jLoc);
			val.EmitDelegate<Action<int>>((Action<int>)delegate(int j)
			{
				matchLength = j;
				Logger.LogInfo((object)$"Parsed \"{currentWord}\" with {j} letters");
			});
		}

		private static void Terminal_ParseWordOverrideOptions(ILContext il)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_01db: 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_01fa: 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_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0245: Unknown result type (might be due to invalid IL or missing references)
			//IL_031d: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			val.EmitDelegate<Action>((Action)delegate
			{
				longestMatch = null;
				matchLength = 0;
			});
			int num = 0;
			int jLoc = -1;
			ILLabel loopStart = null;
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[3]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchCallOrCallvirt<string>(instr1, "get_Length"),
				(Instruction instr2) => ILPatternMatchingExt.MatchStloc(instr2, ref jLoc),
				(Instruction instr3) => ILPatternMatchingExt.MatchBr(instr3, ref loopStart)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWordOverrideOptions @ Substring loop");
				return;
			}
			ILLabel val2 = val.DefineLabel();
			ILLabel val3 = val.DefineLabel();
			val.MoveAfterLabels();
			val.Emit(OpCodes.Ldloc, jLoc);
			val.EmitDelegate<Func<int, bool>>((Func<int, bool>)((int j) => j <= matchLength));
			val.Emit(OpCodes.Brtrue_S, (object)val3);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdfld<TerminalKeyword>(instr, "word")
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWordOverrideOptions @ Fix word dashes");
				return;
			}
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<string, Terminal, string>>((Func<string, Terminal, string>)((string word, Terminal self) => Config.RemoveCommandPunctuation.Value ? self.RemovePunctuation(word.Replace(' ', '-')) : word));
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdfld<CompatibleNoun>(instr, "result")
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWordOverrideOptions @ Return result");
				return;
			}
			val.Emit(OpCodes.Ldloc, jLoc);
			val.Emit(OpCodes.Ldloc, num);
			val.Emit(OpCodes.Ldarg_2);
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Action<TerminalNode, int, int, CompatibleNoun[], Terminal>>((Action<TerminalNode, int, int, CompatibleNoun[], Terminal>)delegate(TerminalNode result, int j, int i, CompatibleNoun[] options, Terminal self)
			{
				longestMatch = result;
				matchLength = j;
				string text = options[i].noun.word;
				if (Config.RemoveCommandPunctuation.Value)
				{
					text = self.RemovePunctuation(text.Replace(' ', '-'));
				}
				Logger.LogInfo((object)$"Parsed \"{text}\" with {j} letters");
			});
			val.Emit(OpCodes.Br_S, (object)val2);
			val.Emit(OpCodes.Ldnull);
			int index = val.Index;
			val.Index = index + 1;
			val.MarkLabel(val2);
			val.GotoLabel(loopStart, (MoveType)1, false);
			ILLabel val4 = default(ILLabel);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchBgt(instr, ref val4)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWordOverrideOptions @ Loop end");
				return;
			}
			val.MarkLabel(val3);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdnull(instr)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.ParseWordOverrideOptions @ Final return");
				return;
			}
			val.Emit(OpCodes.Pop);
			val.EmitDelegate<Func<TerminalNode>>((Func<TerminalNode>)(() => longestMatch));
		}

		private static void Terminal_CheckForExactSentences(ILContext il)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdfld<TerminalKeyword>(instr, "word")
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForExactSentences @ Word");
				return;
			}
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<string, Terminal, string>>((Func<string, Terminal, string>)((string word, Terminal self) => Config.RemoveCommandPunctuation.Value ? self.RemovePunctuation(word) : word));
		}

		private static void Terminal_CheckForPlayerNameCommand(ILContext il)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000e: Expected O, but got Unknown
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Unknown result type (might be due to invalid IL or missing references)
			//IL_0309: Unknown result type (might be due to invalid IL or missing references)
			//IL_0341: Unknown result type (might be due to invalid IL or missing references)
			//IL_034e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0425: Unknown result type (might be due to invalid IL or missing references)
			ILCursor val = new ILCursor(il);
			int num = default(int);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchCallOrCallvirt<string>(instr1, "ToLower"),
				(Instruction instr2) => ILPatternMatchingExt.MatchStloc(instr2, ref num)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ Check exact");
				return;
			}
			int index = val.Index;
			val.Index = index - 1;
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<string, Terminal, string>>((Func<string, Terminal, string>)((string word, Terminal self) => Config.RemoveCommandPunctuation.Value ? self.RemovePunctuation(word.Replace(' ', '-')) : word));
			int kLoc = -1;
			ILLabel val5 = default(ILLabel);
			if (!val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchStloc(instr1, ref kLoc),
				(Instruction instr2) => ILPatternMatchingExt.MatchBr(instr2, ref val5)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ Before loop");
				return;
			}
			index = val.Index;
			val.Index = index - 1;
			val.EmitDelegate<Action>((Action)delegate
			{
				longestMatchIndex = -1;
				matchLength = 0;
			});
			int textLoc = -1;
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchCallOrCallvirt<string>(instr1, "ToLower"),
				(Instruction instr2) => ILPatternMatchingExt.MatchStloc(instr2, ref textLoc)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ Player name variable");
				return;
			}
			index = val.Index;
			val.Index = index - 1;
			val.Emit(OpCodes.Ldarg_0);
			val.EmitDelegate<Func<string, Terminal, string>>((Func<string, Terminal, string>)((string word, Terminal self) => Config.RemoveCommandPunctuation.Value ? self.RemovePunctuation(word.Replace(' ', '-')) : word));
			int lLoc = -1;
			ILLabel substrLoopMidEnd = null;
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchStloc(instr1, ref lLoc),
				(Instruction instr2) => ILPatternMatchingExt.MatchBr(instr2, ref substrLoopMidEnd)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ Start substring loop");
				return;
			}
			ILLabel val2 = val.DefineLabel();
			val.MoveAfterLabels();
			val.Emit(OpCodes.Ldloc, lLoc);
			val.EmitDelegate<Func<int, bool>>((Func<int, bool>)((int l) => l <= matchLength));
			val.Emit(OpCodes.Brtrue_S, (object)val2);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr1) => ILPatternMatchingExt.MatchLdloc(instr1, kLoc)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ Original return match");
				return;
			}
			ILLabel val3 = val.DefineLabel();
			val.Emit(OpCodes.Ldloc, lLoc);
			val.Emit(OpCodes.Ldloc, textLoc);
			val.EmitDelegate<Action<int, int, string>>((Action<int, int, string>)delegate(int k, int l, string text)
			{
				longestMatchIndex = k;
				matchLength = l;
				Logger.LogInfo((object)$"Parsed player name \"{text}\" with {l} letters");
			});
			val.Emit(OpCodes.Br_S, (object)val3);
			val.Emit(OpCodes.Ldc_I4_M1);
			index = val.Index;
			val.Index = index + 1;
			val.MarkLabel(val3);
			val.GotoLabel(substrLoopMidEnd, (MoveType)1, false);
			ILLabel val4 = default(ILLabel);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchBgt(instr, ref val4)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ End substring loop");
				return;
			}
			val.MarkLabel(val2);
			if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
			{
				(Instruction instr) => ILPatternMatchingExt.MatchLdcI4(instr, -1)
			}))
			{
				Logger.LogError((object)"Failed IL hook for Terminal.CheckForPlayerNameCommand @ Final return");
				return;
			}
			val.Emit(OpCodes.Pop);
			val.EmitDelegate<Func<int>>((Func<int>)(() => longestMatchIndex));
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "SylviBlossom.TerminalConflictFix";

		public const string PLUGIN_NAME = "TerminalConflictFix";

		public const string PLUGIN_VERSION = "1.2.2";
	}
}