using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("Loki Moon Labs")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("2.0.0.0")]
[assembly: AssemblyInformationalVersion("2.0.0.0")]
[assembly: AssemblyProduct("Build Back Better")]
[assembly: AssemblyTitle("BuildBackBetter")]
[assembly: AssemblyVersion("2.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[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 BuildBackBetter
{
internal static class ModInfo
{
internal const string Guid = "com.lokimoonlabs.buildbackbetter";
internal const string Name = "Build Back Better";
internal const string Version = "2.0.0";
internal const string HarmonyId = "com.lokimoonlabs.buildbackbetter.patches";
}
[HarmonyPatch(typeof(PlayerAction_Build), "Open")]
internal static class BuildOpenPatch
{
private static void Postfix()
{
Plugin.Instance?.SetConstructMode(active: true);
}
}
[HarmonyPatch(typeof(PlayerAction_Build), "Close")]
internal static class BuildClosePatch
{
private static void Postfix()
{
Plugin.Instance?.SetConstructMode(active: false);
}
}
[HarmonyPatch(typeof(PlayerAction_Build), "CloseWithoutResetAxes")]
internal static class BuildCloseWithoutResetAxesPatch
{
private static void Postfix()
{
Plugin.Instance?.SetConstructMode(active: false);
}
}
[HarmonyPatch(typeof(PlayerAction_Build), "GameTick")]
internal static class BlueprintModeTransitionPatch
{
private static void Postfix(PlayerAction_Build __instance)
{
Plugin.Instance?.TrackBlueprintMode(__instance);
}
}
[HarmonyPatch(typeof(FactoryModel), "SetGlobalRenderState")]
internal static class FactoryRenderPatch
{
private static void Postfix(FactoryModel __instance)
{
Plugin instance = Plugin.Instance;
if (!((Object)(object)instance == (Object)null) && instance.ShouldApplyVisuals())
{
FactoryModel.whiteMode0 = true;
Shader.SetGlobalFloat("_Global_WhiteMode0", 1f);
if (__instance.gpuiManager != null)
{
__instance.gpuiManager.renderVegetable = false;
}
}
}
}
[HarmonyPatch(typeof(UIBuildingGrid), "Update")]
internal static class BuildingGridPatch
{
private static void Postfix(UIBuildingGrid __instance)
{
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
//IL_017e: 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)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
Plugin instance = Plugin.Instance;
if ((Object)(object)instance == (Object)null || !instance.ShouldApplyVisuals())
{
return;
}
PlanetData localPlanet = GameMain.localPlanet;
object obj;
if (localPlanet == null)
{
obj = null;
}
else
{
PlanetAuxData aux = localPlanet.aux;
obj = ((aux != null) ? aux.activeGrid : null);
}
PlanetGrid val = (PlanetGrid)obj;
Renderer blueprintGridRnd = __instance.blueprintGridRnd;
if (val == null || (Object)(object)blueprintGridRnd == (Object)null)
{
return;
}
if ((Object)(object)__instance.gridRnd != (Object)null)
{
__instance.gridRnd.enabled = false;
}
if ((Object)(object)__instance.altGridRnd != (Object)null)
{
__instance.altGridRnd.enabled = false;
}
Material sharedMaterial = blueprintGridRnd.sharedMaterial;
if ((Object)(object)sharedMaterial != (Object)null)
{
if (instance.ConsumeBlueprintGridReset())
{
sharedMaterial.SetVector("_CursorGratBox", Vector4.zero);
sharedMaterial.SetVector("_AnchorPos", Vector4.zero);
sharedMaterial.SetFloat("_ShowDivideLine", 0f);
sharedMaterial.SetFloat("_DivideLine", 0f);
for (int i = 0; i < 64; i++)
{
sharedMaterial.SetVector("_CursorGratBox" + i, Vector4.zero);
sharedMaterial.SetFloat("_CursorGratBoxInfo" + i, 0f);
}
}
sharedMaterial.SetFloat("_Segment", (float)val.segment);
sharedMaterial.SetColor("_TintColor", __instance.blueprintColor);
sharedMaterial.SetVector("_AnchorPos", Vector4.zero);
sharedMaterial.SetFloat("_ShowDivideLine", 0f);
sharedMaterial.SetVector("_CursorGratBox", Vector4.zero);
sharedMaterial.SetVector("_SelectColor", Vector4.one);
}
blueprintGridRnd.enabled = true;
}
}
internal struct BuildPoserState
{
internal float zoomSensitivity;
internal float weight;
internal bool restoreWeight;
}
[HarmonyPatch(typeof(RTSPoser), "Calculate")]
internal static class BuildPoserInputPatch
{
private static void Prefix(RTSPoser __instance, out BuildPoserState __state)
{
__state = new BuildPoserState
{
zoomSensitivity = GameCamera.camZoomSens,
weight = __instance.weight,
restoreWeight = false
};
Plugin instance = Plugin.Instance;
GameCamera instance2 = GameCamera.instance;
if (!((Object)(object)instance == (Object)null) && !((Object)(object)instance2 == (Object)null) && !((Object)(object)__instance != (Object)(object)instance2.buildPoser))
{
if (instance.ShouldUseBuildCameraPoseInBlueprintMode())
{
__instance.weight = 1f;
__state.restoreWeight = true;
}
if (instance.ShouldSmoothBuildCameraZoom())
{
GameCamera.camZoomSens = __state.zoomSensitivity * 0.4f;
}
}
}
private static void Postfix(RTSPoser __instance, BuildPoserState __state)
{
GameCamera.camZoomSens = __state.zoomSensitivity;
if (__state.restoreWeight)
{
__instance.weight = __state.weight;
}
}
}
[HarmonyPatch(typeof(GraticulePoser), "Calculate")]
internal static class BlueprintCameraPosePatch
{
private static void Postfix(GraticulePoser __instance)
{
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
Plugin instance = Plugin.Instance;
GameCamera instance2 = GameCamera.instance;
if (!((Object)(object)instance == (Object)null) && !((Object)(object)instance2 == (Object)null) && instance.ShouldUseBuildCameraPoseInBlueprintMode() && !((Object)(object)__instance != (Object)(object)instance2.blueprintPoser) && !((Object)(object)instance2.buildPoser == (Object)null))
{
((CameraPoser)__instance).cameraPose = ((CameraPoser)instance2.buildPoser).cameraPose;
}
}
}
[BepInPlugin("com.lokimoonlabs.buildbackbetter", "Build Back Better", "2.0.0")]
public sealed class Plugin : BaseUnityPlugin
{
private Harmony harmony;
private GameObject togglePanel;
private Toggle blueprintToggle;
private EBlueprintMode lastBlueprintMode;
private bool moddedBlueprintSession;
internal static Plugin Instance { get; private set; }
internal bool BlueprintViewEnabled { get; private set; }
internal bool InConstructMode { get; private set; }
internal bool BlueprintGridNeedsReset { get; private set; }
private void Awake()
{
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Expected O, but got Unknown
CameraTravel.Initialize(((BaseUnityPlugin)this).Config);
Instance = this;
BlueprintViewEnabled = false;
harmony = new Harmony("com.lokimoonlabs.buildbackbetter.patches");
harmony.PatchAll();
}
private void OnDestroy()
{
Harmony obj = harmony;
if (obj != null)
{
obj.UnpatchSelf();
}
if ((Object)(object)togglePanel != (Object)null)
{
Object.Destroy((Object)(object)togglePanel);
}
Instance = null;
}
internal bool ShouldApplyVisuals()
{
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Invalid comparison between Unknown and I4
if (!InConstructMode || !BlueprintViewEnabled)
{
return false;
}
Player mainPlayer = GameMain.mainPlayer;
PlayerAction_Build val = ((mainPlayer == null) ? null : mainPlayer.controller?.actionBuild);
if (val != null && val.active)
{
return (int)val.blueprintMode == 0;
}
return false;
}
internal bool ShouldUseBuildCameraPoseInBlueprintMode()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003a: Invalid comparison between Unknown and I4
if (!BlueprintViewEnabled)
{
return false;
}
Player mainPlayer = GameMain.mainPlayer;
PlayerAction_Build val = ((mainPlayer == null) ? null : mainPlayer.controller?.actionBuild);
if (val != null && val.active)
{
return (int)val.blueprintMode > 0;
}
return false;
}
internal bool ShouldSmoothBuildCameraZoom()
{
if (!ShouldApplyVisuals())
{
return ShouldUseBuildCameraPoseInBlueprintMode();
}
return true;
}
internal void TrackBlueprintMode(PlayerAction_Build actionBuild)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: 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_0025: Unknown result type (might be due to invalid IL or missing references)
if (actionBuild == null)
{
return;
}
EBlueprintMode blueprintMode = actionBuild.blueprintMode;
if ((int)blueprintMode != 0 && BlueprintViewEnabled)
{
moddedBlueprintSession = true;
}
if ((int)lastBlueprintMode != 0 && (int)blueprintMode == 0 && moddedBlueprintSession)
{
try
{
Player mainPlayer = GameMain.mainPlayer;
if (mainPlayer != null)
{
FactoryModel factoryModel = mainPlayer.factoryModel;
if (factoryModel != null)
{
BPGPUInstancingManager bpgpuiManager = factoryModel.bpgpuiManager;
if (bpgpuiManager != null)
{
bpgpuiManager.Reset();
}
}
}
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("Blueprint preview cleanup failed: " + ex.Message));
}
BlueprintGridNeedsReset = true;
moddedBlueprintSession = false;
}
lastBlueprintMode = blueprintMode;
}
internal bool ConsumeBlueprintGridReset()
{
if (!BlueprintGridNeedsReset)
{
return false;
}
BlueprintGridNeedsReset = false;
return true;
}
internal void SetConstructMode(bool active)
{
InConstructMode = active;
if (active)
{
EnsureTogglePanel();
}
if ((Object)(object)togglePanel != (Object)null)
{
togglePanel.SetActive(active);
}
RefreshFactoryRenderState();
}
private void OnBlueprintToggleChanged(bool enabled)
{
BlueprintViewEnabled = enabled;
RefreshFactoryRenderState();
}
internal void RefreshFactoryRenderState()
{
try
{
Player mainPlayer = GameMain.mainPlayer;
if (mainPlayer != null)
{
FactoryModel factoryModel = mainPlayer.factoryModel;
if (factoryModel != null)
{
factoryModel.SetGlobalRenderState();
}
}
}
catch (Exception ex)
{
((BaseUnityPlugin)this).Logger.LogWarning((object)("Factory render refresh failed: " + ex.Message));
}
}
private bool EnsureTogglePanel()
{
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Expected O, but got Unknown
//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0119: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Unknown result type (might be due to invalid IL or missing references)
//IL_016c: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01b5: Expected O, but got Unknown
//IL_01df: Unknown result type (might be due to invalid IL or missing references)
//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
//IL_0209: Unknown result type (might be due to invalid IL or missing references)
//IL_021e: Unknown result type (might be due to invalid IL or missing references)
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
//IL_02ba: Unknown result type (might be due to invalid IL or missing references)
//IL_02bf: Unknown result type (might be due to invalid IL or missing references)
//IL_02d2: Unknown result type (might be due to invalid IL or missing references)
//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
//IL_02e4: Unknown result type (might be due to invalid IL or missing references)
//IL_02f9: Unknown result type (might be due to invalid IL or missing references)
//IL_030d: Unknown result type (might be due to invalid IL or missing references)
//IL_026f: Unknown result type (might be due to invalid IL or missing references)
//IL_027d: Unknown result type (might be due to invalid IL or missing references)
//IL_039d: Unknown result type (might be due to invalid IL or missing references)
//IL_03af: Unknown result type (might be due to invalid IL or missing references)
//IL_03c1: Unknown result type (might be due to invalid IL or missing references)
//IL_03c6: Unknown result type (might be due to invalid IL or missing references)
//IL_03d3: Unknown result type (might be due to invalid IL or missing references)
//IL_03e1: Unknown result type (might be due to invalid IL or missing references)
//IL_03ee: Unknown result type (might be due to invalid IL or missing references)
//IL_03f8: Expected O, but got Unknown
//IL_0348: Unknown result type (might be due to invalid IL or missing references)
//IL_0356: Unknown result type (might be due to invalid IL or missing references)
//IL_046a: Unknown result type (might be due to invalid IL or missing references)
//IL_046f: Unknown result type (might be due to invalid IL or missing references)
//IL_0486: Unknown result type (might be due to invalid IL or missing references)
//IL_048d: Unknown result type (might be due to invalid IL or missing references)
//IL_0498: Unknown result type (might be due to invalid IL or missing references)
//IL_04ad: Unknown result type (might be due to invalid IL or missing references)
//IL_04c1: Unknown result type (might be due to invalid IL or missing references)
//IL_0509: Unknown result type (might be due to invalid IL or missing references)
//IL_0501: Unknown result type (might be due to invalid IL or missing references)
//IL_0561: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)togglePanel != (Object)null)
{
return true;
}
UIRoot instance = UIRoot.instance;
UIGame val = instance?.uiGame;
UIToggle val2 = instance?.optionWindow?.cameraRotateXToggle;
Text val3 = val?.buildMenu?.blueprintTip;
object obj;
if (val == null)
{
obj = null;
}
else
{
UIFunctionPanel functionPanel = val.functionPanel;
obj = ((functionPanel != null) ? ((Component)functionPanel).transform : null);
}
Transform val4 = (Transform)obj;
Toggle val5 = (((Object)(object)val2 != (Object)null) ? ((Component)val2).GetComponent<Toggle>() : null);
if ((Object)(object)val5 == (Object)null || (Object)(object)val4 == (Object)null)
{
return false;
}
togglePanel = new GameObject("Build Back Better Toggle", new Type[2]
{
typeof(RectTransform),
typeof(Image)
});
togglePanel.transform.SetParent(val4, false);
RectTransform component = togglePanel.GetComponent<RectTransform>();
component.anchorMin = new Vector2(1f, 0f);
component.anchorMax = new Vector2(1f, 0f);
component.pivot = new Vector2(1f, 0f);
component.sizeDelta = new Vector2(160f, 40f);
component.anchoredPosition = new Vector2(28f, 42f);
Image component2 = togglePanel.GetComponent<Image>();
((Graphic)component2).color = new Color(0.125f, 0.125f, 0.125f, 0.85f);
((Graphic)component2).raycastTarget = false;
GameObject val6 = new GameObject("check-box", new Type[3]
{
typeof(RectTransform),
typeof(Image),
typeof(Toggle)
});
val6.transform.SetParent(togglePanel.transform, false);
RectTransform component3 = val6.GetComponent<RectTransform>();
component3.anchorMin = new Vector2(0f, 0.5f);
component3.anchorMax = new Vector2(0f, 0.5f);
component3.pivot = new Vector2(0f, 0.5f);
component3.sizeDelta = new Vector2(22f, 22f);
component3.anchoredPosition = new Vector2(8f, 0f);
Graphic targetGraphic = ((Selectable)val5).targetGraphic;
Image val7 = (Image)(object)((targetGraphic is Image) ? targetGraphic : null);
Image component4 = val6.GetComponent<Image>();
if ((Object)(object)val7 != (Object)null)
{
component4.sprite = val7.sprite;
component4.type = val7.type;
((Graphic)component4).color = ((Graphic)val7).color;
((Graphic)component4).material = ((Graphic)val7).material;
}
GameObject val8 = new GameObject("checkmark", new Type[2]
{
typeof(RectTransform),
typeof(Image)
});
val8.transform.SetParent(val6.transform, false);
RectTransform component5 = val8.GetComponent<RectTransform>();
component5.anchorMin = Vector2.zero;
component5.anchorMax = Vector2.one;
component5.offsetMin = new Vector2(3f, 3f);
component5.offsetMax = new Vector2(-3f, -3f);
Graphic graphic = val5.graphic;
Image val9 = (Image)(object)((graphic is Image) ? graphic : null);
Image component6 = val8.GetComponent<Image>();
if ((Object)(object)val9 != (Object)null)
{
component6.sprite = val9.sprite;
component6.type = val9.type;
((Graphic)component6).color = ((Graphic)val9).color;
((Graphic)component6).material = ((Graphic)val9).material;
}
blueprintToggle = val6.GetComponent<Toggle>();
((Selectable)blueprintToggle).targetGraphic = (Graphic)(object)component4;
blueprintToggle.graphic = (Graphic)(object)component6;
((Selectable)blueprintToggle).transition = ((Selectable)val5).transition;
((Selectable)blueprintToggle).colors = ((Selectable)val5).colors;
blueprintToggle.toggleTransition = val5.toggleTransition;
Toggle obj2 = blueprintToggle;
Navigation navigation = default(Navigation);
((Navigation)(ref navigation)).mode = (Mode)0;
((Selectable)obj2).navigation = navigation;
blueprintToggle.onValueChanged = new ToggleEvent();
blueprintToggle.isOn = BlueprintViewEnabled;
((Graphic)component6).canvasRenderer.SetAlpha(BlueprintViewEnabled ? 1f : 0f);
((UnityEvent<bool>)(object)blueprintToggle.onValueChanged).AddListener((UnityAction<bool>)OnBlueprintToggleChanged);
GameObject val10 = new GameObject("label", new Type[2]
{
typeof(RectTransform),
typeof(Text)
});
val10.transform.SetParent(togglePanel.transform, false);
RectTransform component7 = val10.GetComponent<RectTransform>();
component7.anchorMin = Vector2.zero;
component7.anchorMax = Vector2.one;
component7.offsetMin = new Vector2(36f, 0f);
component7.offsetMax = new Vector2(-6f, 0f);
Text component8 = val10.GetComponent<Text>();
component8.text = "Blueprint View";
component8.alignment = (TextAnchor)3;
((Graphic)component8).raycastTarget = false;
component8.horizontalOverflow = (HorizontalWrapMode)1;
component8.verticalOverflow = (VerticalWrapMode)1;
((Graphic)component8).color = (((Object)(object)val3 != (Object)null) ? ((Graphic)val3).color : Color.white);
component8.font = (((Object)(object)val3 != (Object)null) ? val3.font : Resources.GetBuiltinResource<Font>("Arial.ttf"));
component8.fontSize = (((Object)(object)val3 != (Object)null) ? Math.Max(14, val3.fontSize) : 14);
component8.fontStyle = (FontStyle)(((Object)(object)val3 != (Object)null) ? ((int)val3.fontStyle) : 0);
togglePanel.SetActive(InConstructMode);
return true;
}
}
[HarmonyPatch]
internal static class CameraTravel
{
internal static ConfigEntry<float> Distance;
internal static void Initialize(ConfigFile config)
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Expected O, but got Unknown
Distance = config.Bind<float>("Camera", "BuildCameraTravelDistance", 500f, new ConfigDescription("Minimum camera, building and Icarus construction-drone radius in game units. 0 keeps normal research-based limits. Existing larger ranges from research or other mods are retained. The game's gas-giant camera multiplier still applies. Restart after editing.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 500f), new object[0]));
}
internal static float Resolve(float original, float configured)
{
if (float.IsNaN(configured) || float.IsInfinity(configured))
{
configured = 500f;
}
if (configured <= 0f)
{
return original;
}
return Math.Max(original, Math.Min(configured, 500f));
}
internal static float Limit(float original)
{
return Resolve(original, (Distance == null) ? 0f : Distance.Value);
}
[HarmonyTargetMethods]
private static IEnumerable<MethodBase> TargetMethods()
{
List<MethodBase> list = new List<MethodBase>();
AddTarget(list, typeof(PlayerAction_Build), "UpdateBuildTarget");
AddTarget(list, typeof(BuildTool_Addon), "CheckBuildConditions");
AddTarget(list, typeof(BuildTool_Click), "CheckBuildConditions");
AddTarget(list, typeof(BuildTool_Dismantle), "DeterminePreviews");
AddTarget(list, typeof(BuildTool_Dismantle), "DetermineMoreChainTargets");
AddTarget(list, typeof(BuildTool_Inserter), "CheckBuildConditions");
AddTarget(list, typeof(BuildTool_Path), "CheckBuildConditions");
AddTarget(list, typeof(BuildTool_Reform), "ExecuteBrushAction");
AddTarget(list, typeof(BuildTool_Upgrade), "DeterminePreviews");
AddTarget(list, typeof(BuildTool_Upgrade), "DetermineMoreChainTargets");
AddTarget(list, typeof(ConstructionModuleComponent), "SearchAutoReconstructTargets");
AddTarget(list, typeof(ConstructionModuleComponent), "AutoReconstructAllInstantly");
AddTarget(list, typeof(ConstructionModuleComponent), "PlaceItems");
AddTarget(list, typeof(ConstructionModuleComponent), "SearchBuildTargets");
AddTarget(list, typeof(ConstructionModuleComponent), "SearchRepairTargets");
AddTarget(list, typeof(ConstructionSystem), "AddAutoReconstructTargetToModules");
AddTarget(list, typeof(ConstructionSystem), "AddBuildTargetToModules");
AddTarget(list, typeof(ConstructionSystem), "AddRepairTargetToModules");
AddTarget(list, typeof(ConstructionSystem), "RemoveRepairTargetFromModules");
return list;
}
private static void AddTarget(List<MethodBase> targets, Type type, string name)
{
MethodInfo methodInfo = AccessTools.Method(type, name, (Type[])null, (Type[])null);
if (methodInfo == null)
{
throw new MissingMethodException(type.FullName, name);
}
targets.Add(methodInfo);
}
[HarmonyTranspiler]
[HarmonyPriority(0)]
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions, MethodBase __originalMethod)
{
//IL_0111: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Expected O, but got Unknown
List<CodeInstruction> list = new List<CodeInstruction>(instructions);
FieldInfo objB = AccessTools.Field(typeof(Mecha), "buildArea");
int num = 0;
for (int i = 0; i < list.Count; i++)
{
if (list[i].opcode == OpCodes.Ldfld && object.Equals(list[i].operand, objB))
{
num++;
}
}
bool flag = __originalMethod.DeclaringType == typeof(PlayerAction_Build);
if (num == 0 && typeof(BuildTool).IsAssignableFrom(__originalMethod.DeclaringType))
{
return list;
}
if (num == 0 || (flag && num != 1))
{
throw new InvalidOperationException("Build Back Better: range signature changed in " + __originalMethod.Name);
}
MethodInfo methodInfo = AccessTools.Method(typeof(CameraTravel), "Limit", (Type[])null, (Type[])null);
for (int num2 = list.Count - 1; num2 >= 0; num2--)
{
if (list[num2].opcode == OpCodes.Ldfld && object.Equals(list[num2].operand, objB))
{
list.Insert(num2 + 1, new CodeInstruction(OpCodes.Call, (object)methodInfo));
}
}
return list;
}
}
}