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)
{
}
}
}