Decompiled source of ConstructDroneEx v1.0.1

GongT.ConstructDroneEx.dll

Decompiled 2 months ago
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using CommonAPI;
using CommonAPI.Systems;
using CommonAPI.Systems.ModLocalization;
using HarmonyLib;
using Microsoft.CodeAnalysis;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("GongT.ConstructDroneEx")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.1.0")]
[assembly: AssemblyInformationalVersion("1.0.1+283043fa810456d5942323048f8636d945c7fc85")]
[assembly: AssemblyProduct("进入蘸豆状态时自动停止建筑无人机")]
[assembly: AssemblyTitle("GongT.ConstructDroneEx")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.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 ConstructDroneEx
{
	public class PersistantState
	{
		public enum DroneState
		{
			Default,
			BuildFirst,
			BuildOnly,
			RepairFirst,
			RepairOnly,
			MAX
		}

		private ManualLogSource logger;

		private bool enabledWhenEnterCombat = true;

		private DroneState typeWhenEnterCombat;

		public PersistantState(ManualLogSource logger)
		{
			this.logger = logger;
		}

		public void GameStart()
		{
			ConstructionModuleComponent constructionModule = GameMain.mainPlayer.mecha.constructionModule;
			logger.LogInfo((object)("初始化,当前 " + (constructionModule.droneEnabled ? "启用" : "禁用")));
		}

		public void TriggerDroneDisable(bool disable)
		{
			if (disable)
			{
				(enabledWhenEnterCombat, typeWhenEnterCombat) = QueryStateFromGame();
				logger.LogDebug((object)("蘸豆!爽! 当前 " + (enabledWhenEnterCombat ? "启用" : "禁用")));
				ApplyStateToGame(DroneState.RepairOnly);
			}
			else if (enabledWhenEnterCombat)
			{
				logger.LogDebug((object)"退出战斗模式,恢复启用");
				ApplyStateToGame(typeWhenEnterCombat);
			}
			else
			{
				logger.LogDebug((object)"退出战斗模式,进入时是禁用状态,不操作");
				ApplyStateToGame(typeWhenEnterCombat, enable: false);
			}
		}

		public void ManualToggleDroneState()
		{
			ConstructionModuleComponent constructionModule = GameMain.mainPlayer.mecha.constructionModule;
			constructionModule.droneEnabled = !constructionModule.droneEnabled;
			logger.LogDebug((object)("点击切换状态(变为 " + (constructionModule.droneEnabled ? "启用" : "禁用") + ")"));
		}

		public void ManualLoopDroneState()
		{
			DroneState item = QueryStateFromGame().type;
			DroneState droneState = (DroneState)((int)(item + 1) % 5);
			logger.LogDebug((object)$"循环状态 {item} -> {droneState}");
			ApplyStateToGame(droneState);
		}

		public void ApplyStateToGame(DroneState s, bool enable = true)
		{
			ConstructionModuleComponent constructionModule = GameMain.mainPlayer.mecha.constructionModule;
			constructionModule.droneEnabled = enable;
			switch (s)
			{
			case DroneState.BuildOnly:
				constructionModule.droneConstructEnabled = true;
				constructionModule.droneRepairEnabled = false;
				constructionModule.dronePriority = 0;
				break;
			case DroneState.BuildFirst:
				constructionModule.droneConstructEnabled = true;
				constructionModule.droneRepairEnabled = true;
				constructionModule.dronePriority = 1;
				break;
			case DroneState.RepairFirst:
				constructionModule.droneConstructEnabled = true;
				constructionModule.droneRepairEnabled = true;
				constructionModule.dronePriority = 2;
				break;
			case DroneState.RepairOnly:
				constructionModule.droneConstructEnabled = false;
				constructionModule.droneRepairEnabled = true;
				constructionModule.dronePriority = 0;
				break;
			case DroneState.Default:
				constructionModule.droneConstructEnabled = true;
				constructionModule.droneRepairEnabled = true;
				constructionModule.dronePriority = 0;
				break;
			}
		}

		public (bool enabled, DroneState type) QueryStateFromGame()
		{
			ConstructionModuleComponent constructionModule = GameMain.mainPlayer.mecha.constructionModule;
			if (!constructionModule.droneConstructEnabled)
			{
				return (constructionModule.droneEnabled, DroneState.RepairOnly);
			}
			if (!constructionModule.droneRepairEnabled)
			{
				return (constructionModule.droneEnabled, DroneState.BuildOnly);
			}
			switch (constructionModule.dronePriority)
			{
			case 1:
				return (constructionModule.droneEnabled, DroneState.BuildFirst);
			case 2:
				return (constructionModule.droneEnabled, DroneState.RepairFirst);
			case 0:
				return (constructionModule.droneEnabled, DroneState.Default);
			default:
				logger.LogWarning((object)$"这是啥: dronePriority = [{constructionModule.dronePriority}]");
				return (constructionModule.droneEnabled, DroneState.Default);
			}
		}

		public void Parse(BinaryReader r)
		{
			logger.LogDebug((object)"读取存档数据");
		}

		public void Stringify(BinaryWriter w)
		{
			logger.LogDebug((object)"保存存档数据");
		}
	}
	[BepInPlugin("GongT.ConstructDroneEx", "进入蘸豆状态时自动停止建筑无人机", "1.0.1")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[CommonAPISubmoduleDependency(new string[] { "CustomKeyBindSystem", "LocalizationModule" })]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class ConstructDroneEx : BaseUnityPlugin
	{
		internal static ManualLogSource Logger;

		public static PersistantState state;

		private static PressKeyBind loopKey;

		private static PressKeyBind toggleKey;

		internal void Awake()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0044: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01e8: Unknown result type (might be due to invalid IL or missing references)
			Logger = Logger.CreateLogSource("GongT.ConstructDroneEx");
			state = new PersistantState(Logger);
			Logger.LogInfo((object)"加载: 1.0.1");
			BuiltinKey val = default(BuiltinKey);
			val.key = new CombineKey(277, (byte)1, (ECombineKeyAction)0, false);
			val.name = "LoopConstructDrone";
			val.conflictGroup = 2309;
			val.canOverride = true;
			loopKey = CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(val);
			val = default(BuiltinKey);
			val.key = new CombineKey(277, (byte)0, (ECombineKeyAction)0, false);
			val.name = "ToggleConstructDrone";
			val.conflictGroup = 2309;
			val.canOverride = true;
			toggleKey = CustomKeyBindSystem.RegisterKeyBindWithReturn<PressKeyBind>(val);
			string text = "GongT.ConstructDroneEx".Split(new char[1] { ' ' }).Last();
			LocalizationModule.RegisterTranslation("KEYLoopConstructDrone", "[" + text + "] Loop construct drone mode", "[" + text + "] 循环切换建设无人机模式", "");
			LocalizationModule.RegisterTranslation("KEYToggleConstructDrone", "[" + text + "] Toggle construct drone enabled", "[" + text + "] 启用/停用建设无人机", "");
			LocalizationModule.RegisterTranslation("Disabled", "Disabled", "禁用", "");
			LocalizationModule.RegisterTranslation("BuildFirst", "Build first", "优先建造", "");
			LocalizationModule.RegisterTranslation("BuildOnly", "Build only", "仅允许建造", "");
			LocalizationModule.RegisterTranslation("RepairFirst", "Repair first", "优先修理", "");
			LocalizationModule.RegisterTranslation("RepairOnly", "Repair only", "仅允许修理", "");
			LocalizationModule.RegisterTranslation("Default", "Default", "默认", "");
			LocalizationModule.RegisterTranslation("ConstructionDrone", "Construction Drone: ", "建设无人机:", "");
			new Harmony("GongT.ConstructDroneEx").PatchAll();
		}

		internal void Update()
		{
			if (VFInput.inputing || GameMain.mainPlayer == null || DSPGame.IsMenuDemo || GameMain.mainPlayer.controller.actionCombat.isCombatState)
			{
				return;
			}
			bool flag = false;
			if (toggleKey.keyValue)
			{
				state.ManualToggleDroneState();
				flag = true;
			}
			if (loopKey.keyValue)
			{
				state.ManualLoopDroneState();
				flag = true;
			}
			if (!flag)
			{
				return;
			}
			string text = "";
			var (flag2, droneState) = state.QueryStateFromGame();
			if (!flag2)
			{
				text = Localization.Translate("Disabled");
			}
			else
			{
				switch (droneState)
				{
				case PersistantState.DroneState.Default:
					text = Localization.Translate("Default");
					break;
				case PersistantState.DroneState.BuildFirst:
					text = Localization.Translate("BuildFirst");
					break;
				case PersistantState.DroneState.BuildOnly:
					text = Localization.Translate("BuildOnly");
					break;
				case PersistantState.DroneState.RepairFirst:
					text = Localization.Translate("RepairFirst");
					break;
				case PersistantState.DroneState.RepairOnly:
					text = Localization.Translate("RepairOnly");
					break;
				default:
					return;
				}
			}
			UIRoot.instance.uiGame.generalTips.InvokeRealtimeTipAhead(Localization.Translate("ConstructionDrone") + text);
		}

		internal void Import(BinaryReader r)
		{
			state.Parse(r);
		}

		internal void Export(BinaryWriter w)
		{
			state.Stringify(w);
		}
	}
	[HarmonyPatch(typeof(GameMain), "Begin")]
	public static class Auto_GameMain_Begin_Patch
	{
		private static void Postfix()
		{
			if (!DSPGame.IsMenuDemo)
			{
				ConstructDroneEx.Logger.LogDebug((object)"游戏已开始,执行自定义代码。");
				GameMain.mainPlayer.onEnterCombatState += MainPlayer_onEnterCombatState;
				GameMain.mainPlayer.onExitCombatState += MainPlayer_onExitCombatState;
				ConstructDroneEx.state.GameStart();
			}
		}

		private static void MainPlayer_onExitCombatState()
		{
			ConstructDroneEx.state.TriggerDroneDisable(disable: false);
		}

		private static void MainPlayer_onEnterCombatState()
		{
			ConstructDroneEx.state.TriggerDroneDisable(disable: true);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "GongT.ConstructDroneEx";

		public const string PLUGIN_NAME = "进入蘸豆状态时自动停止建筑无人机";

		public const string PLUGIN_VERSION = "1.0.1";
	}
}
namespace System.Runtime.CompilerServices
{
	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)]
	internal sealed class IgnoresAccessChecksToAttribute : Attribute
	{
		public IgnoresAccessChecksToAttribute(string assemblyName)
		{
		}
	}
}