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 System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using NebulaAPI;
using NebulaAPI.GameState;
using UnityEngine;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("starfi5h.plugin.DeliverySlotsTweaks")]
[assembly: AssemblyProduct("DeliverySlotsTweaks")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.5.9.0")]
[module: UnverifiableCode]
namespace DeliverySlotsTweaks;
public class Compatibility
{
public static class BlueprintTweaks_Patch
{
public const string GUID = "org.kremnev8.plugin.BlueprintTweaks";
public static void Init(Harmony harmony)
{
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Expected O, but got Unknown
//IL_0088: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Expected O, but got Unknown
//IL_00b9: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Expected O, but got Unknown
try
{
if (Chainloader.PluginInfos.TryGetValue("org.kremnev8.plugin.BlueprintTweaks", out var value))
{
Type type = ((object)value.Instance).GetType().Assembly.GetType("BlueprintTweaks.BlueprintPasteExtension");
harmony.Patch((MethodBase)AccessTools.Method(type, "OnUpdate", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(typeof(DeliveryPackagePatch).GetMethod("UIBuildMenu_Transpiler")), (HarmonyMethod)null, (HarmonyMethod)null);
harmony.Patch((MethodBase)AccessTools.Method(type, "CheckItems", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(typeof(DeliveryPackagePatch).GetMethod("UIBuildMenu_Transpiler")), (HarmonyMethod)null, (HarmonyMethod)null);
harmony.Patch((MethodBase)AccessTools.Method(type, "CheckItems", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(typeof(DeliveryPackagePatch).GetMethod("TakeItem_Transpiler")), (HarmonyMethod)null, (HarmonyMethod)null);
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Auxilaryfunction compatibility failed! Last working version: 1.6.4");
Plugin.Log.LogWarning((object)ex);
}
}
}
public static class Auxilaryfunction_Patch
{
public const string GUID = "cn.blacksnipe.dsp.Auxilaryfunction";
public static void Init(Harmony harmony)
{
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Expected O, but got Unknown
try
{
if (Chainloader.PluginInfos.TryGetValue("cn.blacksnipe.dsp.Auxilaryfunction", out var value))
{
Type type = ((object)value.Instance).GetType().Assembly.GetType("Auxilaryfunction.Auxilaryfunction");
harmony.Patch((MethodBase)AccessTools.Method(type, "AutoMovetounbuilt", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(typeof(DeliveryPackagePatch).GetMethod("UIBuildMenu_Transpiler")), (HarmonyMethod)null, (HarmonyMethod)null);
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Auxilaryfunction compatibility failed! Last working version: 2.8.2");
Plugin.Log.LogWarning((object)ex);
}
}
}
public static class Multfunction_mod_Patch
{
public const string GUID = "cn.blacksnipe.dsp.Multfuntion_mod";
private static ConfigEntry<bool> architectMode;
public static void Init(Harmony harmony)
{
//IL_0056: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Expected O, but got Unknown
try
{
if (Chainloader.PluginInfos.TryGetValue("cn.blacksnipe.dsp.Multfuntion_mod", out var value))
{
Type type = ((object)value.Instance).GetType().Assembly.GetType("Multifunction_mod.GUIDraw");
harmony.Patch((MethodBase)AccessTools.Method(type, "BuildPannel", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(Multfunction_mod_Patch).GetMethod("BuildPannel_Postfix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
architectMode = (ConfigEntry<bool>)AccessTools.Field(AccessTools.TypeByName("Multifunction_mod.Multifunction"), "ArchitectMode").GetValue(null);
DeliveryPackagePatch.architectMode = architectMode.Value;
Plugin.Log.LogDebug((object)("Multfunction_mod ArchitectModeEnabled: " + DeliveryPackagePatch.architectMode));
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Multfunction_mod compatibility failed! Last working version: 3.4.5");
Plugin.Log.LogWarning((object)ex);
}
}
public static void BuildPannel_Postfix()
{
DeliveryPackagePatch.architectMode = architectMode.Value;
}
}
public static class Nebula_Patch
{
public const string GUID = "dsp.nebula-multiplayer";
private static bool IsPatched;
public static bool IsActive { get; private set; }
public static void Init(Harmony harmony)
{
try
{
if (Chainloader.PluginInfos.TryGetValue("dsp.nebula-multiplayer", out var _))
{
Patch(harmony);
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Nebula compatibility failed!");
Plugin.Log.LogWarning((object)ex);
}
}
public static bool IsOthers()
{
IFactoryManager factories = NebulaModAPI.MultiplayerSession.Factories;
if (factories.IsIncomingRequest.Value)
{
return factories.PacketAuthor != NebulaModAPI.MultiplayerSession.LocalPlayer.Id;
}
return false;
}
private static void Patch(Harmony harmony)
{
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Expected O, but got Unknown
if (NebulaModAPI.NebulaIsInstalled && !IsPatched)
{
NebulaModAPI.OnMultiplayerGameStarted = (Action)Delegate.Combine(NebulaModAPI.OnMultiplayerGameStarted, new Action(OnMultiplayerGameStarted));
NebulaModAPI.OnMultiplayerGameEnded = (Action)Delegate.Combine(NebulaModAPI.OnMultiplayerGameEnded, new Action(OnMultiplayerGameEnded));
Type type = AccessTools.TypeByName("NebulaWorld.SimulatedWorld");
harmony.Patch((MethodBase)AccessTools.Method(type, "SetupInitialPlayerState", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(Plugin), "ApplyConfigs", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
IsPatched = true;
}
}
private static void OnMultiplayerGameStarted()
{
IsActive = NebulaModAPI.IsMultiplayerActive;
}
private static void OnMultiplayerGameEnded()
{
IsActive = false;
}
}
public static class RebindBuildBar_Patch
{
public const string GUID = "org.kremnev8.plugin.RebindBuildBar";
public static void Init(Harmony harmony)
{
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Expected O, but got Unknown
try
{
if (Chainloader.PluginInfos.TryGetValue("org.kremnev8.plugin.RebindBuildBar", out var value))
{
Type type = ((object)value.Instance).GetType().Assembly.GetType("RebindBuildBar.Patches");
harmony.Patch((MethodBase)AccessTools.Method(type, "EnableButton", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(typeof(DeliveryPackagePatch).GetMethod("UIBuildMenu_Transpiler")), (HarmonyMethod)null, (HarmonyMethod)null);
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"RebindBuildBar compatibility failed! Last working version: 1.0.4");
Plugin.Log.LogWarning((object)ex);
}
}
}
public static class UnlimitedFoundations_Patch
{
public const string GUID1 = "com.aekoch.mods.dsp.UnlimitedFoundations";
public const string GUID2 = "com.tinysquid.infinitefoundations";
public static void Init(Harmony harmony)
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Expected O, but got Unknown
try
{
if (Chainloader.PluginInfos.ContainsKey("com.aekoch.mods.dsp.UnlimitedFoundations") || Chainloader.PluginInfos.ContainsKey("com.tinysquid.infinitefoundations"))
{
harmony.Patch((MethodBase)AccessTools.Method(typeof(DeliveryPackagePatch), "GetItemCount", (Type[])null, (Type[])null), (HarmonyMethod)null, new HarmonyMethod(typeof(UnlimitedFoundations_Patch).GetMethod("GetItemCount_Postfix")), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null);
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"UnlimitedFoundations compatibility failed!");
Plugin.Log.LogWarning((object)ex);
}
}
public static void GetItemCount_Postfix(int itemId, ref int __result)
{
if (itemId == 1131)
{
__result = 9999;
}
}
}
public static void Init(Harmony harmony)
{
BlueprintTweaks_Patch.Init(harmony);
Multfunction_mod_Patch.Init(harmony);
RebindBuildBar_Patch.Init(harmony);
UnlimitedFoundations_Patch.Init(harmony);
Nebula_Patch.Init(harmony);
}
}
public class DeliveryPackagePatch
{
public static bool architectMode = false;
public static int maxDeliveryGridIndex = 0;
private static readonly Dictionary<int, int> packageItemCount = new Dictionary<int, int>();
private static readonly Dictionary<int, int> deliveryItemCount = new Dictionary<int, int>();
private static readonly Dictionary<int, int> deliveryGridindex = new Dictionary<int, int>();
public static void Count(StorageComponent package)
{
packageItemCount.Clear();
GRID[] grids = package.grids;
int num = ((package.size < grids.Length) ? package.size : grids.Length);
for (int i = 0; i < num; i++)
{
int itemId = grids[i].itemId;
if (itemId > 0)
{
if (packageItemCount.ContainsKey(itemId))
{
packageItemCount[itemId] += grids[i].count;
}
else
{
packageItemCount.Add(itemId, grids[i].count);
}
}
}
}
public static void Count(DeliveryPackage package)
{
deliveryItemCount.Clear();
deliveryGridindex.Clear();
GRID[] grids = package.grids;
for (int i = 0; i <= maxDeliveryGridIndex; i++)
{
int itemId = grids[i].itemId;
if (itemId > 0)
{
deliveryItemCount.Add(itemId, grids[i].count);
deliveryGridindex.Add(itemId, i);
}
}
}
public static int GetItemCount(StorageComponent _, int itemId)
{
if (architectMode)
{
return 999;
}
packageItemCount.TryGetValue(itemId, out var value);
deliveryItemCount.TryGetValue(itemId, out var value2);
return value + value2;
}
public static int GetItemCountDummy(StorageComponent _, int itemId)
{
return 999;
}
public static int TakeItem(StorageComponent storage, int itemId, int count, out int inc)
{
if (deliveryGridindex.TryGetValue(itemId, out var value))
{
GameMain.mainPlayer.packageUtility.TakeItemFromAllPackages(value, ref itemId, ref count, ref inc, false);
return count;
}
return storage.TakeItem(itemId, count, ref inc);
}
public static void TakeTailItems(StorageComponent storage, ref int itemId, ref int count, out int inc, bool _)
{
if (architectMode)
{
inc = 0;
return;
}
if (Compatibility.Nebula_Patch.IsActive && Compatibility.Nebula_Patch.IsOthers())
{
inc = 0;
return;
}
if (deliveryGridindex.TryGetValue(itemId, out var value))
{
GameMain.mainPlayer.packageUtility.TakeItemFromAllPackages(value, ref itemId, ref count, ref inc, false);
if (packageItemCount.ContainsKey(itemId))
{
int num = packageItemCount[itemId] - count;
packageItemCount[itemId] = num;
if (num == 0)
{
packageItemCount.Remove(itemId);
}
}
else if (deliveryItemCount.ContainsKey(itemId))
{
int num2 = deliveryItemCount[itemId] - count;
deliveryItemCount[itemId] = num2;
if (num2 == 0)
{
deliveryItemCount.Remove(itemId);
}
}
return;
}
storage.TakeTailItems(ref itemId, ref count, ref inc, false);
if (packageItemCount.ContainsKey(itemId))
{
int num3 = packageItemCount[itemId] - count;
packageItemCount[itemId] = num3;
if (num3 == 0)
{
packageItemCount.Remove(itemId);
}
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(Mecha), "GameTick")]
public static void Prepare(Mecha __instance, long time)
{
if (__instance?.player != null && __instance.player == GameMain.mainPlayer)
{
Count(__instance.player.package);
Count(__instance.player.deliveryPackage);
if (time % 30 == 0L && Plugin.AutoRefillWarper.Value)
{
TryReillWarper(__instance);
}
}
}
private static void TryReillWarper(Mecha mecha)
{
if (!mecha.HasWarper())
{
int itemId = 1210;
int count = 1;
if (GetItemCount(null, itemId) > 0)
{
TakeTailItems(mecha.player.package, ref itemId, ref count, out var inc, _: false);
int num = default(int);
mecha.warpStorage.AddItem(itemId, count, inc, ref num, false);
}
}
}
[HarmonyPrefix]
[HarmonyPatch(typeof(StorageComponent), "Sort")]
public static void Sort_Prefix(StorageComponent __instance)
{
if (!Plugin.SortToDelieverySlots.Value)
{
return;
}
Player mainPlayer = GameMain.mainPlayer;
if (__instance != ((mainPlayer != null) ? mainPlayer.package : null))
{
return;
}
GRID[] grids = __instance.grids;
DeliveryPackage deliveryPackage = GameMain.mainPlayer.deliveryPackage;
int inc = default(int);
for (int num = ((__instance.size < __instance.grids.Length) ? __instance.size : __instance.grids.Length) - 1; num > 0; num--)
{
ref GRID reference = ref grids[num];
int itemId = reference.itemId;
if (itemId > 0 && deliveryGridindex.ContainsKey(itemId))
{
int num2 = deliveryPackage.AddItem(deliveryGridindex[itemId], itemId, reference.count, reference.inc, ref inc);
reference.count -= num2;
reference.inc = inc;
}
}
}
[HarmonyTranspiler]
[HarmonyPatch(typeof(ConstructionModuleComponent), "PlaceItems")]
public static IEnumerable<CodeInstruction> PlaceItems_Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_001e: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Expected O, but got Unknown
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Expected O, but got Unknown
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Expected O, but got Unknown
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Expected O, but got Unknown
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a0: Expected O, but got Unknown
//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ae: Expected O, but got Unknown
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: Expected O, but got Unknown
//IL_00de: Unknown result type (might be due to invalid IL or missing references)
//IL_00e4: Expected O, but got Unknown
//IL_0100: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Expected O, but got Unknown
//IL_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_012d: Expected O, but got Unknown
//IL_013b: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Expected O, but got Unknown
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
//IL_0155: Expected O, but got Unknown
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Expected O, but got Unknown
//IL_0177: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Expected O, but got Unknown
//IL_019f: Unknown result type (might be due to invalid IL or missing references)
//IL_01a5: Expected O, but got Unknown
try
{
CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null);
val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[5]
{
new CodeMatch((OpCode?)OpCodes.Br, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(ConstructionModuleComponent), "entityId"), (string)null),
new CodeMatch((OpCode?)OpCodes.Ldc_I4_0, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Ble, (object)null, (string)null)
}).Insert((CodeInstruction[])(object)new CodeInstruction[4]
{
new CodeInstruction(OpCodes.Ldarg_0, (object)null),
new CodeInstruction(OpCodes.Ldarg_2, (object)null),
new CodeInstruction(OpCodes.Ldloca_S, (object)(byte)0),
new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "AddConstructableCountsInStorage", (Type[])null, (Type[])null))
});
val.MatchForward(true, (CodeMatch[])(object)new CodeMatch[7]
{
new CodeMatch((OpCode?)OpCodes.Ldarg_2, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.DeclaredPropertyGetter(typeof(Player), "package"), (string)null),
new CodeMatch((OpCode?)OpCodes.Ldloca_S, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Ldloca_S, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Ldloca_S, (object)null, (string)null),
new CodeMatch((OpCode?)OpCodes.Ldc_I4_0, (object)null, (string)null),
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => i.opcode == OpCodes.Callvirt && ((MethodInfo)i.operand).Name == "TakeTailItems"), (string)null)
}).Repeat((Action<CodeMatcher>)delegate(CodeMatcher matcher)
{
matcher.SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "TakeTailItems", (Type[])null, (Type[])null));
}, (Action<string>)null);
return val.InstructionEnumeration();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Transpiler PlaceItems error");
Plugin.Log.LogWarning((object)ex);
return instructions;
}
}
private static void AddConstructableCountsInStorage(ConstructionModuleComponent constructionModule, Player player, ref int num)
{
if (((player != null) ? player.deliveryPackage : null) == null)
{
return;
}
ConstructableCount[] constructableCountsInStorage = constructionModule.constructableCountsInStorage;
GRID[] grids = player.deliveryPackage.grids;
for (int i = 0; i <= maxDeliveryGridIndex; i++)
{
int itemId = grids[i].itemId;
if (itemId > 0 && ItemProto.constructableIdHash.Contains(itemId))
{
int count = grids[i].count;
int num2 = ItemProto.constructableIndiceById[itemId];
constructableCountsInStorage[num2].haveCount += count;
num += count;
}
}
}
[HarmonyTranspiler]
[HarmonyPatch(typeof(MechaForge), "TryAddTask")]
[HarmonyPatch(typeof(MechaForge), "TryTaskWithTestPackage")]
public static IEnumerable<CodeInstruction> TryAddTask_Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
try
{
return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => i.opcode == OpCodes.Call && ((MethodInfo)i.operand).Name == "TryAddTaskIterate"), (string)null)
}).SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "TryAddTaskIterate", (Type[])null, (Type[])null)).InstructionEnumeration();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Transpiler TryAddTask error");
Plugin.Log.LogWarning((object)ex);
return instructions;
}
}
public static bool TryAddTaskIterate(MechaForge mechaForge, RecipeProto recipe, int count, out bool useBottleneckItem, bool predictBottleneckItems)
{
Count(mechaForge.player.deliveryPackage);
foreach (KeyValuePair<int, int> item in deliveryItemCount)
{
mechaForge._test_pack.Alter(item.Key, item.Value);
}
return mechaForge.TryAddTaskIterate(recipe, count, ref useBottleneckItem, predictBottleneckItems);
}
[HarmonyTranspiler]
[HarmonyPatch(typeof(MechaForge), "AddTaskIterate")]
[HarmonyPatch(typeof(Mecha), "AutoReplenishAmmo")]
public static IEnumerable<CodeInstruction> TakeItem_Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
try
{
return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => i.opcode == OpCodes.Callvirt && ((MethodInfo)i.operand).Name == "TakeItem"), (string)null)
}).Repeat((Action<CodeMatcher>)delegate(CodeMatcher matcher)
{
matcher.SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "TakeItem", (Type[])null, (Type[])null));
}, (Action<string>)null).InstructionEnumeration();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Transpiler StorageComponent.TakeItem error");
Plugin.Log.LogWarning((object)ex);
return instructions;
}
}
[HarmonyTranspiler]
[HarmonyPatch(typeof(BuildTool_Reform), "ReformAction")]
[HarmonyPatch(typeof(BuildTool_Reform), "RemoveBasePit")]
[HarmonyPatch(typeof(PlanetFactory), "EntityAutoReplenishIfNeeded")]
[HarmonyPatch(typeof(PlanetFactory), "StationAutoReplenishIfNeeded")]
[HarmonyPatch(typeof(PlayerAction_Inspect), "GameTick")]
[HarmonyPatch(typeof(UIBlueprintInspector), "OnPlayerPackageChange")]
[HarmonyPatch(typeof(UIBlueprintInspector), "SetComponentItem")]
[HarmonyPatch(typeof(UIBuildMenu), "_OnUpdate")]
[HarmonyPatch(typeof(UIBuildMenu), "OnChildButtonClick")]
[HarmonyPatch(typeof(UIHandTip), "_OnUpdate")]
[HarmonyPatch(typeof(UIRemoveBasePitButton), "_OnUpdate")]
[HarmonyPatch(typeof(UITurretWindow), "OnHandFillAmmoButtonClick")]
public static IEnumerable<CodeInstruction> UIBuildMenu_Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
try
{
return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => i.opcode == OpCodes.Callvirt && ((MethodInfo)i.operand).Name == "GetItemCount"), (string)null)
}).Repeat((Action<CodeMatcher>)delegate(CodeMatcher matcher)
{
matcher.SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "GetItemCount", (Type[])null, (Type[])null));
}, (Action<string>)null).InstructionEnumeration();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Transpiler UIBuildMenu._OnUpdate error");
Plugin.Log.LogWarning((object)ex);
return instructions;
}
}
[HarmonyTranspiler]
[HarmonyAfter(new string[] { "dsp.nebula-multiplayer" })]
[HarmonyPatch(typeof(BuildTool_Click), "CreatePrebuilds")]
[HarmonyPatch(typeof(BuildTool_Path), "CreatePrebuilds")]
[HarmonyPatch(typeof(BuildTool_Addon), "CreatePrebuilds")]
[HarmonyPatch(typeof(BuildTool_Inserter), "CreatePrebuilds")]
[HarmonyPatch(typeof(BuildTool_BlueprintPaste), "CreatePrebuilds")]
[HarmonyPatch(typeof(BuildTool_Reform), "ReformAction")]
[HarmonyPatch(typeof(BuildTool_Reform), "RemoveBasePit")]
[HarmonyPatch(typeof(PlanetFactory), "EntityAutoReplenishIfNeeded")]
[HarmonyPatch(typeof(PlanetFactory), "StationAutoReplenishIfNeeded")]
[HarmonyPatch(typeof(Player), "TakeItemFromPlayer")]
[HarmonyPatch(typeof(PlayerAction_Build), "DoUpgradeObject")]
[HarmonyPatch(typeof(PlayerAction_Inspect), "GameTick")]
[HarmonyPatch(typeof(UITurretWindow), "OnHandFillAmmoButtonClick")]
public static IEnumerable<CodeInstruction> CheckBuildConditions_Transpiler(IEnumerable<CodeInstruction> instructions, MethodBase __originalMethod)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Expected O, but got Unknown
try
{
int num = 1;
if (__originalMethod.Name == "StationAutoReplenishIfNeeded")
{
num = 2;
}
else if (__originalMethod.Name == "EntityAutoReplenishIfNeeded")
{
num = 3;
}
CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).End();
for (int j = 0; j < num; j++)
{
val.MatchBack(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => i.opcode == OpCodes.Callvirt && ((MethodInfo)i.operand).Name == "TakeTailItems"), (string)null)
}).SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "TakeTailItems", (Type[])null, (Type[])null));
}
return val.InstructionEnumeration();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Transpiler CreatePrebuilds error");
Plugin.Log.LogWarning((object)ex);
return instructions;
}
}
[HarmonyTranspiler]
[HarmonyPatch(typeof(PlayerAction_Build), "GameTick")]
public static IEnumerable<CodeInstruction> PlayerAction_Build_Transpiler(IEnumerable<CodeInstruction> instructions)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
//IL_0036: Expected O, but got Unknown
try
{
return new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => i.opcode == OpCodes.Callvirt && ((MethodInfo)i.operand).Name == "_GameTick"), (string)null)
}).SetAndAdvance(OpCodes.Call, (object)AccessTools.Method(typeof(DeliveryPackagePatch), "BuildTool_GameTick", (Type[])null, (Type[])null)).InstructionEnumeration();
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)"Transpiler PlayerAction_Build.GameTick error");
Plugin.Log.LogWarning((object)ex);
return instructions;
}
}
public static void BuildTool_GameTick(BuildTool @this, long time)
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Expected O, but got Unknown
if (@this.active)
{
@this.mouseRay = @this.mainCamera.ScreenPointToRay(Input.mousePosition);
@this.SetFactoryReferences();
int num = @this.player.package.size + maxDeliveryGridIndex + 1;
if (@this.tmpPackage == null)
{
@this.tmpPackage = new StorageComponent(num);
}
if (@this.tmpPackage.size != num)
{
@this.tmpPackage.SetSize(num);
}
Array.Copy(@this.player.package.grids, @this.tmpPackage.grids, @this.player.package.size);
GRID[] grids = @this.player.deliveryPackage.grids;
for (int i = @this.player.package.size; i < num; i++)
{
ref GRID reference = ref grids[i - @this.player.package.size];
@this.tmpPackage.grids[i].itemId = reference.itemId;
@this.tmpPackage.grids[i].count = reference.count;
}
@this.tmpInhandId = @this.player.inhandItemId;
@this.tmpInhandCount = @this.player.inhandItemCount;
try
{
@this._OnTick(time);
}
catch (Exception ex)
{
Debug.LogError((object)ex);
}
@this.frame++;
}
}
}
public class PlayerPackagePatch
{
private static int packageStacksize = 1000;
private static int packageStackMultiplier = 1;
public static void OnConfigChange()
{
packageStackMultiplier = 1;
if (Plugin.PlayerPackageStackSize.Value > 0)
{
packageStacksize = Plugin.PlayerPackageStackSize.Value;
Plugin.Log.LogDebug((object)("PlayerPackage stack count:" + packageStacksize));
if (GameMain.mainPlayer == null)
{
return;
}
GRID[] grids = GameMain.mainPlayer.package.grids;
for (int i = 0; i < GameMain.mainPlayer.package.size; i++)
{
if (grids[i].filter > 0)
{
grids[i].stackSize = packageStacksize;
}
}
}
else
{
if (Plugin.PlayerPackageStackMultiplier.Value <= 0)
{
return;
}
packageStackMultiplier = Plugin.PlayerPackageStackMultiplier.Value;
Plugin.Log.LogDebug((object)("PlayerPackage stack multiplier:" + packageStackMultiplier));
if (GameMain.mainPlayer == null)
{
return;
}
GRID[] grids2 = GameMain.mainPlayer.package.grids;
for (int j = 0; j < GameMain.mainPlayer.package.size; j++)
{
int filter = grids2[j].filter;
if (filter > 0 && filter < StorageComponent.itemStackCount.Length)
{
grids2[j].stackSize = StorageComponent.itemStackCount[filter] * packageStackMultiplier;
}
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(StorageComponent), "SetFilter")]
public static void OverwritePlayerPackageStacksize2(StorageComponent __instance, int gridIndex, int filterId)
{
if (filterId > 0 && IsPlayerStorage(__instance))
{
if (Plugin.PlayerPackageStackSize.Value > 0)
{
__instance.grids[gridIndex].stackSize = packageStacksize;
}
else
{
__instance.grids[gridIndex].stackSize = StorageComponent.itemStackCount[filterId] * packageStackMultiplier;
}
}
}
[HarmonyTranspiler]
[HarmonyPatch(/*Could not decode attribute arguments.*/)]
[HarmonyPatch(typeof(StorageComponent), "AddItemStacked")]
[HarmonyPatch(typeof(StorageComponent), "Sort")]
[HarmonyPatch(typeof(StorageComponent), "AddItemForSort")]
private static IEnumerable<CodeInstruction> OverwritePlayerPackageStacksize(IEnumerable<CodeInstruction> instructions, ILGenerator il)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Expected O, but got Unknown
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Expected O, but got Unknown
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0087: Expected O, but got Unknown
//IL_0160: Unknown result type (might be due to invalid IL or missing references)
//IL_0166: Expected O, but got Unknown
//IL_0183: Unknown result type (might be due to invalid IL or missing references)
//IL_0189: Expected O, but got Unknown
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
//IL_019c: Expected O, but got Unknown
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Expected O, but got Unknown
//IL_01c5: Unknown result type (might be due to invalid IL or missing references)
//IL_01cb: Expected O, but got Unknown
//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
//IL_00ce: Expected O, but got Unknown
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Expected O, but got Unknown
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Expected O, but got Unknown
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0112: Expected O, but got Unknown
//IL_012d: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Expected O, but got Unknown
//IL_0140: Unknown result type (might be due to invalid IL or missing references)
//IL_0146: Expected O, but got Unknown
CodeMatcher val = new CodeMatcher(instructions, il);
Label label = default(Label);
val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((OpCode?)OpCodes.Ldsfld, (object)AccessTools.Field(typeof(StorageComponent), "itemStackCount"), (string)null)
}).Advance(1).CreateLabelAt(val.Pos, ref label);
int pos = val.Pos;
Label label2 = default(Label);
val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => CodeInstructionExtensions.IsStloc(i, (LocalBuilder)null)), (string)null)
}).CreateLabelAt(val.Pos, ref label2);
if (Plugin.PlayerPackageStackSize.Value > 0)
{
val.Advance(pos - val.Pos);
val.Insert((CodeInstruction[])(object)new CodeInstruction[6]
{
new CodeInstruction(OpCodes.Ldarg_0, (object)null),
new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(PlayerPackagePatch), "IsPlayerStorage", (Type[])null, (Type[])null)),
new CodeInstruction(OpCodes.Brfalse_S, (object)label),
new CodeInstruction(OpCodes.Pop, (object)null),
new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(PlayerPackagePatch), "packageStacksize")),
new CodeInstruction(OpCodes.Br_S, (object)label2)
});
}
else
{
val.Insert((CodeInstruction[])(object)new CodeInstruction[5]
{
new CodeInstruction(OpCodes.Ldarg_0, (object)null),
new CodeInstruction(OpCodes.Call, (object)AccessTools.Method(typeof(PlayerPackagePatch), "IsPlayerStorage", (Type[])null, (Type[])null)),
new CodeInstruction(OpCodes.Brfalse_S, (object)label2),
new CodeInstruction(OpCodes.Ldsfld, (object)AccessTools.Field(typeof(PlayerPackagePatch), "packageStackMultiplier")),
new CodeInstruction(OpCodes.Mul, (object)null)
});
}
return val.Instructions();
}
public static bool IsPlayerStorage(StorageComponent storageComponent)
{
if (storageComponent != GameMain.mainPlayer.package)
{
return storageComponent == GameMain.mainPlayer.mecha.reactorStorage;
}
return true;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(PackageStatistics), "Count")]
private static bool CountOverwrite(PackageStatistics __instance, StorageComponent package)
{
if (!IsPlayerStorage(package))
{
return true;
}
__instance.itemBundle.Clear();
ref GRID[] grids = ref package.grids;
int num = 0;
if (packageStackMultiplier > 1)
{
int[] itemStackCount = StorageComponent.itemStackCount;
for (int i = 0; i < package.size; i++)
{
int itemId = grids[i].itemId;
if (itemId > 0)
{
__instance.itemBundle.Add(itemId, grids[i].count, itemStackCount[itemId] * packageStackMultiplier - grids[i].count);
}
else
{
num++;
}
}
if (num > 0)
{
int[] itemIds = ItemProto.itemIds;
int num2 = itemIds.Length;
for (int j = 0; j < num2; j++)
{
__instance.itemBundle.Add(itemIds[j], 0, itemStackCount[itemIds[j]] * packageStackMultiplier * num);
}
}
}
else
{
for (int k = 0; k < package.size; k++)
{
int itemId2 = grids[k].itemId;
if (itemId2 > 0)
{
__instance.itemBundle.Add(itemId2, grids[k].count, packageStacksize - grids[k].count);
}
else
{
num++;
}
}
if (num > 0)
{
int[] itemIds2 = ItemProto.itemIds;
for (int l = 0; l < itemIds2.Length; l++)
{
__instance.itemBundle.Add(itemIds2[l], 0, packageStacksize * num);
}
}
}
return false;
}
}
[BepInPlugin("starfi5h.plugin.DeliverySlotsTweaks", "DeliverySlotsTweaks", "1.5.9")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
public const string GUID = "starfi5h.plugin.DeliverySlotsTweaks";
public const string NAME = "DeliverySlotsTweaks";
public const string VERSION = "1.5.9";
public static Plugin Instance;
public static ManualLogSource Log;
public static ConfigEntry<bool> UseLogisticSlots;
public static ConfigEntry<bool> AutoRefillFuel;
public static ConfigEntry<bool> AutoRefillWarper;
public static ConfigEntry<int> ColCount;
public static ConfigEntry<int> StackSizeMultiplier;
public static ConfigEntry<bool> DeliveryFirst;
public static ConfigEntry<int> PlayerPackageStackSize;
public static ConfigEntry<int> PlayerPackageStackMultiplier;
public static ConfigEntry<bool> SortToDelieverySlots;
public static ConfigEntry<bool> EnableArchitectMode;
public static ConfigEntry<bool> EnableFastReplicator;
private Harmony harmony;
public void Start()
{
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Expected O, but got Unknown
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_0192: Expected O, but got Unknown
//IL_0219: Unknown result type (might be due to invalid IL or missing references)
//IL_0225: Expected O, but got Unknown
//IL_025a: Unknown result type (might be due to invalid IL or missing references)
//IL_0266: Expected O, but got Unknown
UseLogisticSlots = ((BaseUnityPlugin)this).Config.Bind<bool>("DeliveryPackage", "UseLogisticSlots", true, "Let replicator and build tools use items in logistic slots.\n使手动制造和建筑工具可以使用物流清单内的物品");
AutoRefillFuel = ((BaseUnityPlugin)this).Config.Bind<bool>("DeliveryPackage", "AutoRefillFuel", false, "Allow fuel chamber to also take from logistics slots.\n自动补充燃料时也会使用物流清单内的物品");
AutoRefillWarper = ((BaseUnityPlugin)this).Config.Bind<bool>("DeliveryPackage", "AutoRefillWarper", false, "Auto refill space warper from inventory and logistics slots.\n从背包和物流清单自动补充翘曲器");
ColCount = ((BaseUnityPlugin)this).Config.Bind<int>("DeliveryPackage", "ColCount", 0, new ConfigDescription("NoChange:0 TechMax:3 Limit:5\n物流清单容量-列(不改:0 原版科技:3 最高上限:5)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 5), Array.Empty<object>()));
StackSizeMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("DeliveryPackage", "StackSizeMultiplier", 0, "NoChange:0 TechMax:10\n物流清单物品堆叠倍率(不改:0 原版科技:10)");
DeliveryFirst = ((BaseUnityPlugin)this).Config.Bind<bool>("DeliveryPackage", "DeliveryFirst", true, "When logistic bots send items to mecha, send them to delivery slots first.\n配送机会优先将物品送入物流清单的栏位");
SortToDelieverySlots = ((BaseUnityPlugin)this).Config.Bind<bool>("DeliveryPackage", "SortToDelieverySlots", false, "When sorting inventory, send them to delivery slots first.\n整理背包时会先将物品送入物流清单的栏位");
PlayerPackageStackSize = ((BaseUnityPlugin)this).Config.Bind<int>("PlayerPackage", "StackSize", 0, "Overwrite stack size in inventory. NoChange:0\n统一修改玩家背包中的物品数量堆疊上限(每件物品皆相同) (不改:0)");
PlayerPackageStackMultiplier = ((BaseUnityPlugin)this).Config.Bind<int>("PlayerPackage", "StackMultiplier", 0, "Apply multiplier for stack size in inventory. NoChange:0\n修改玩家背包中的物品堆疊倍率乘积(上限=原物品堆叠*倍率) (不改:0)");
EnableArchitectMode = ((BaseUnityPlugin)this).Config.Bind<bool>("BuildTool", "EnableArchitectMode", false, "Build without requirement of items (infinite buildings)\n建筑师模式:建造无需物品");
EnableFastReplicator = ((BaseUnityPlugin)this).Config.Bind<bool>("BuildTool", "EnableFastReplicator", true, "Right click on hotbar to queue the building in replicator\n右键单击快捷栏中的建筑可直接在合成器排程制造");
Instance = this;
Log = ((BaseUnityPlugin)this).Logger;
harmony = new Harmony("starfi5h.plugin.DeliverySlotsTweaks");
Compatibility.Init(harmony);
harmony.PatchAll(typeof(Plugin));
if (UseLogisticSlots.Value)
{
harmony.PatchAll(typeof(DeliveryPackagePatch));
if (AutoRefillFuel.Value)
{
harmony.Patch((MethodBase)AccessTools.Method(typeof(Mecha), "AutoReplenishFuel", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(DeliveryPackagePatch), "TakeItem_Transpiler", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null);
harmony.Patch((MethodBase)AccessTools.Method(typeof(Mecha), "AutoReplenishFuelAll", (Type[])null, (Type[])null), (HarmonyMethod)null, (HarmonyMethod)null, new HarmonyMethod(AccessTools.Method(typeof(DeliveryPackagePatch), "TakeItem_Transpiler", (Type[])null, (Type[])null)), (HarmonyMethod)null, (HarmonyMethod)null);
}
}
StackSizeMultiplier.Value = Math.Min(StackSizeMultiplier.Value, 1000000);
PlayerPackageStackSize.Value = Math.Min(PlayerPackageStackSize.Value, 1000000000);
PlayerPackageStackMultiplier.Value = Math.Min(PlayerPackageStackMultiplier.Value, 1000000);
if (PlayerPackageStackSize.Value > 0 || PlayerPackageStackMultiplier.Value > 0)
{
harmony.PatchAll(typeof(PlayerPackagePatch));
}
if (EnableFastReplicator.Value)
{
harmony.PatchAll(typeof(UIBuildMenuPatch));
}
}
public void OnDestroy()
{
harmony.UnpatchSelf();
harmony = null;
}
[HarmonyPostfix]
[HarmonyPatch(typeof(UIOptionWindow), "OnApplyClick")]
internal static void OnApplyClick()
{
((BaseUnityPlugin)Instance).Config.Reload();
ApplyConfigs();
}
[HarmonyPostfix]
[HarmonyPatch(typeof(Player), "Import")]
[HarmonyPatch(typeof(Player), "SetForNewGame")]
internal static void ApplyConfigs()
{
ParameterOverwrite();
PlayerPackagePatch.OnConfigChange();
Player mainPlayer = GameMain.mainPlayer;
SetMaxDeliveryGridIndex((mainPlayer != null) ? mainPlayer.deliveryPackage : null);
DeliveryPackagePatch.architectMode = EnableArchitectMode.Value;
}
[HarmonyPostfix]
[HarmonyPriority(500)]
[HarmonyPatch(typeof(GameHistoryData), "UnlockTechFunction")]
private static void ParameterOverwrite()
{
Player mainPlayer = GameMain.mainPlayer;
DeliveryPackage val = ((mainPlayer != null) ? mainPlayer.deliveryPackage : null);
if (val != null)
{
if (ColCount.Value > 0 && ColCount.Value <= 5 && val.colCount != ColCount.Value)
{
val.colCount = ColCount.Value;
val.NotifySizeChange();
}
if (StackSizeMultiplier.Value > 0)
{
val.stackSizeMultiplier = StackSizeMultiplier.Value;
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(DeliveryPackage), "NotifySizeChange")]
private static void SetMaxDeliveryGridIndex(DeliveryPackage __instance)
{
if (!UseLogisticSlots.Value || __instance == null)
{
return;
}
Player mainPlayer = GameMain.mainPlayer;
if (__instance != ((mainPlayer != null) ? mainPlayer.deliveryPackage : null))
{
return;
}
DeliveryPackagePatch.maxDeliveryGridIndex = 0;
for (int num = __instance.gridLength - 1; num >= 0; num--)
{
if (__instance.IsGridActive(num))
{
DeliveryPackagePatch.maxDeliveryGridIndex = num;
break;
}
}
Log.LogDebug((object)$"DeliveryPackage:{__instance.rowCount}x{__instance.colCount} stack:{__instance.stackSizeMultiplier} maxIndex:{DeliveryPackagePatch.maxDeliveryGridIndex}");
}
[HarmonyPrefix]
[HarmonyPatch(typeof(PlayerPackageUtility), "AddItemToAllPackages")]
private static void AddItemToAllPackages(ref bool deliveryFirst)
{
deliveryFirst = DeliveryFirst.Value;
}
}
public class UIBuildMenuPatch
{
private static bool Initialized;
[HarmonyPostfix]
[HarmonyPatch(typeof(UIBuildMenu), "_OnRegEvent")]
public static void AddEvents(UIBuildMenu __instance)
{
if (Initialized)
{
return;
}
Initialized = true;
for (int i = 0; i < __instance.childButtons.Length; i++)
{
UIButton val = __instance.childButtons[i];
if (!((Object)(object)val == (Object)null))
{
val.data = i;
val.onRightClick += OnChildButtonRightClick;
}
}
}
private static void OnChildButtonRightClick(int index)
{
UIBuildMenu buildMenu = UIRoot.instance.uiGame.buildMenu;
if (UIBuildMenu.protos[buildMenu.currentCategory, index] != null)
{
int iD = ((Proto)UIBuildMenu.protos[buildMenu.currentCategory, index]).ID;
ItemProto val = ((ProtoSet<ItemProto>)(object)LDB.items).Select(iD);
if (val != null && val.maincraft != null)
{
TryReplicateItem(val);
}
}
}
private static void TryReplicateItem(ItemProto itemProto)
{
RecipeProto maincraft = itemProto.maincraft;
if (maincraft == null)
{
return;
}
int iD = ((Proto)maincraft).ID;
int num = 1;
if (!maincraft.Handcraft)
{
UIRealtimeTip.Popup(Localization.Translate("该配方") + maincraft.madeFromString + Localization.Translate("生产"), true, 0);
return;
}
if (!GameMain.history.RecipeUnlocked(iD))
{
UIRealtimeTip.Popup(Localization.Translate("配方未解锁"), true, 0);
return;
}
MechaForge forge = GameMain.mainPlayer.mecha.forge;
int num2 = forge.PredictTaskCount(iD, 99, false);
if (num > num2)
{
num = num2;
}
if (num == 0)
{
UIRealtimeTip.Popup(Localization.Translate("材料不足"), true, 0);
return;
}
if (forge.AddTask(iD, num) == null)
{
UIRealtimeTip.Popup(Localization.Translate("材料不足"), true, 0);
return;
}
GameMain.history.RegFeatureKey(1000104);
int num3 = 0;
if (maincraft.ResultCounts != null && maincraft.ResultCounts.Length != 0)
{
num3 = maincraft.ResultCounts[0];
}
UIRealtimeTip.Popup(string.Format(Localization.Translate("Crafting {0} [{1}]"), ((Proto)itemProto).name, num3), false, 0);
}
}