Decompiled source of PlanetwideSpray v1.1.3

PlanetwideSpray.dll

Decompiled 2 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Threading;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using UnityEngine;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("PlanetwideSpray")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.1.3.0")]
[module: UnverifiableCode]
namespace PlanetwideSpray;

public class Main_Patch
{
	public class Status
	{
		public int incLevel;

		public readonly int[] incCount = new int[11];

		public int incDebt;
	}

	public class Station_Patch
	{
		[HarmonyPostfix]
		[HarmonyPatch(typeof(CargoTraffic), "TryPickItemAtRear")]
		private static void TryPickItemAtRear(CargoTraffic __instance, int __result, ref byte stack, ref byte inc)
		{
			if (__result != 0 && __result != 1210)
			{
				Status status = statusArr[__instance.factory.index];
				int num = stack * status.incLevel - inc;
				if (num > 0 && status.incDebt < status.incCount[status.incLevel])
				{
					Interlocked.Add(ref status.incDebt, stack);
					inc += (byte)num;
				}
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch(typeof(CargoPath), "TryPickItemAtRear")]
		private static void TryPickItemAtRear(CargoPath __instance, int __result, ref byte stack, ref byte inc)
		{
			if (__result != 0 && __result != 1210 && !containerToIndex.TryGetValue(__instance.cargoContainer, out var value))
			{
				Status status = statusArr[value];
				int num = stack * status.incLevel - inc;
				if (num > 0 && status.incDebt < status.incCount[status.incLevel])
				{
					Interlocked.Add(ref status.incDebt, stack);
					inc += (byte)num;
				}
			}
		}
	}

	public static bool LimitSpray = true;

	private static Status[] statusArr = null;

	private static Dictionary<CargoContainer, int> containerToIndex = new Dictionary<CargoContainer, int>();

	private const int MAX_INC_COUNT = 11;

	[HarmonyPostfix]
	[HarmonyPatch(typeof(GameMain), "Begin")]
	public static void SetArray()
	{
		statusArr = new Status[GameMain.data.factories.Length];
		for (int i = 0; i < statusArr.Length; i++)
		{
			statusArr[i] = new Status();
		}
		containerToIndex.Clear();
	}

	[HarmonyPrefix]
	[HarmonyPriority(600)]
	[HarmonyPatch(typeof(PlanetFactory), "InsertInto")]
	private static void AddItemInc(PlanetFactory __instance, int entityId, byte itemCount, ref byte itemInc)
	{
		ref EntityData reference = ref __instance.entityPool[entityId];
		if (reference.assemblerId != 0 || reference.labId != 0 || !LimitSpray)
		{
			Status status = statusArr[__instance.index];
			int num = itemCount * status.incLevel - itemInc;
			if (num > 0 && status.incDebt < status.incCount[status.incLevel])
			{
				Interlocked.Add(ref status.incDebt, itemCount);
				itemInc += (byte)num;
			}
		}
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(FractionatorComponent), "InternalUpdate")]
	private static void FractionatorSetInc(PlanetFactory factory, ref FractionatorComponent __instance)
	{
		Status status = statusArr[factory.index];
		int num = __instance.fluidInputCount * status.incLevel - __instance.fluidInputInc;
		if (num > 0 && status.incDebt < status.incCount[status.incLevel])
		{
			Interlocked.Add(ref status.incDebt, num / status.incLevel);
			__instance.fluidInputInc += num;
		}
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(TurretComponent), "InternalUpdate")]
	private static void TurretSetInc(PlanetFactory factory, ref TurretComponent __instance)
	{
		Status status = statusArr[factory.index];
		int num = __instance.itemCount * status.incLevel - __instance.itemInc;
		if (num > 0 && status.incDebt < status.incCount[status.incLevel])
		{
			Interlocked.Add(ref status.incDebt, num / status.incLevel);
			__instance.itemInc += (short)num;
		}
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(CargoTraffic), "SpraycoaterGameTick")]
	private static void SpraycoaterGameTick_Prefix(CargoTraffic __instance)
	{
		if (statusArr == null)
		{
			SetArray();
		}
		Status status = statusArr[__instance.factory.index];
		if (status == null)
		{
			status = new Status();
			statusArr[__instance.factory.index] = status;
			containerToIndex[__instance.factory.cargoContainer] = __instance.factory.index;
		}
		Array.Clear(status.incCount, 0, 11);
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(SpraycoaterComponent), "InternalUpdate")]
	private static void InternalUpdate(ref SpraycoaterComponent __instance, CargoTraffic _traffic, AnimData[] _animPool, int[] consumeRegister)
	{
		if (__instance.cargoBeltId > 0 || __instance.incCount <= 0)
		{
			return;
		}
		bool flag = false;
		Status status = statusArr[_traffic.factory.index];
		if (status.incDebt > 0)
		{
			flag = true;
			int num = ((__instance.incSprayTimes * 2 < status.incDebt) ? (__instance.incSprayTimes * 2) : status.incDebt);
			status.incDebt -= num;
			__instance.extraIncCount -= num;
			if (__instance.extraIncCount < 0)
			{
				int incCount = __instance.incCount;
				__instance.incCount += __instance.extraIncCount;
				__instance.extraIncCount = 0;
				consumeRegister[__instance.incItemId] += incCount / __instance.incSprayTimes - __instance.incCount / __instance.incSprayTimes;
				if (__instance.incCount <= 0)
				{
					__instance.incItemId = 0;
					__instance.incAbility = 0;
				}
			}
		}
		status.incCount[__instance.incAbility] += __instance.extraIncCount + __instance.incCount;
		int num2 = Mathf.RoundToInt((float)_animPool[__instance.entityId].state * 0.001f);
		if (flag)
		{
			if (num2 < 15)
			{
				num2 = 60 - num2;
			}
			else if (num2 < 45)
			{
				num2 = 45;
			}
		}
		_animPool[__instance.entityId].state = (uint)(1 + __instance.incAbility * 10 + 100 + num2 * 1000);
		_animPool[__instance.entityId].time = (float)(__instance.incCount + __instance.extraIncCount) / (float)__instance.incCapacity;
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(CargoTraffic), "SpraycoaterGameTick")]
	private static void SpraycoaterGameTick_Postfix(CargoTraffic __instance)
	{
		Status status = statusArr[__instance.factory.index];
		int num = 10;
		while (num > 0 && status.incCount[num] <= 0)
		{
			num--;
		}
		status.incLevel = num;
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(UISpraycoaterWindow), "RefreshSpraycoaterWindow")]
	private static void RefreshSpraycoaterWindow(UISpraycoaterWindow __instance, SpraycoaterComponent spraycoater)
	{
		//IL_0000: 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_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0038: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f7: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		if (spraycoater.cargoBeltId > 0)
		{
			return;
		}
		if (spraycoater.incAbility == 0)
		{
			__instance.stateText.text = "[PlanetwideSpray] " + Localization.Translate("Insufficient supply");
			((Graphic)__instance.stateText).color = __instance.powerLowColor;
			return;
		}
		float power = __instance.factory.entityAnimPool[spraycoater.entityId].power;
		if (power == 1f)
		{
			__instance.stateText.text = "[PlanetwideSpray] " + Localization.Translate("正常运转");
			((Graphic)__instance.stateText).color = __instance.workNormalColor;
		}
		else if (power > 0.1f)
		{
			__instance.stateText.text = "[PlanetwideSpray] " + Localization.Translate("电力不足");
			((Graphic)__instance.stateText).color = __instance.powerLowColor;
		}
		else
		{
			__instance.stateText.text = "[PlanetwideSpray] " + Localization.Translate("停止运转");
			((Graphic)__instance.stateText).color = __instance.powerOffColor;
		}
	}
}
[BepInPlugin("starfi5h.plugin.PlanetwideSpray", "PlanetwideSpray", "1.1.3")]
public class Plugin : BaseUnityPlugin
{
	public const string GUID = "starfi5h.plugin.PlanetwideSpray";

	public const string NAME = "PlanetwideSpray";

	public const string VERSION = "1.1.3";

	public static ManualLogSource Log;

	private static Harmony harmony;

	public void Awake()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Expected O, but got Unknown
		//IL_003d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0047: Expected O, but got Unknown
		Log = ((BaseUnityPlugin)this).Logger;
		harmony = new Harmony("starfi5h.plugin.PlanetwideSpray");
		ConfigEntry<int> val = ((BaseUnityPlugin)this).Config.Bind<int>("Cheat", "Force Proliferator Level", 0, new ConfigDescription("Spray everything insert by sorters if this value > 0\n(作弊选项)当此值>0, 使分捡器抓取的货物皆为此增产等级", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 10), Array.Empty<object>()));
		ConfigEntry<bool> val2 = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Spray All Cargo", false, "Spray every item transfer by sorters (including products)\n喷涂任何分捡器抓取的货物(包含产物)");
		ConfigEntry<bool> val3 = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Spray Station Input", false, "Spray every item flow into station or mega assemblers(GenesisBook mod)\n喷涂流入物流塔/塔厂(创世之书mod)的货物");
		if (val.Value > 0)
		{
			val.Value = Math.Min(val.Value, 10);
			harmony.PatchAll(typeof(Cheat_Patch));
			Cheat_Patch.IncAbility = val.Value;
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Cheat mode: Force Proliferator Level = " + Cheat_Patch.IncAbility));
			return;
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)$"Normal mode: spray all [{val2.Value}], station input [{val3.Value}]");
		harmony.PatchAll(typeof(Main_Patch));
		Main_Patch.LimitSpray = !val2.Value;
		if (val3.Value)
		{
			harmony.PatchAll(typeof(Main_Patch.Station_Patch));
		}
	}
}
public class Cheat_Patch
{
	public static int IncAbility;

	[HarmonyPrefix]
	[HarmonyPatch(typeof(PlanetFactory), "InsertInto")]
	private static void AddItemInc(byte itemCount, ref byte itemInc)
	{
		itemInc = (byte)(itemCount * IncAbility);
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(CargoTraffic), "TryPickItemAtRear")]
	[HarmonyPatch(typeof(CargoPath), "TryPickItemAtRear")]
	private static void TryPickItemAtRear(ref byte stack, ref byte inc)
	{
		inc = (byte)(stack * IncAbility);
	}

	[HarmonyPrefix]
	[HarmonyPatch(typeof(StationComponent), "InputItem")]
	private static void InputItemSetInc(int stack, ref int inc)
	{
		inc = stack * IncAbility;
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(FractionatorComponent), "InternalUpdate")]
	private static void FractionatorSetInc(ref FractionatorComponent __instance)
	{
		__instance.fluidInputInc = __instance.fluidInputCount * IncAbility;
	}

	[HarmonyPostfix]
	[HarmonyPatch(typeof(TurretComponent), "BeltUpdate")]
	private static void TurretSetInc(ref TurretComponent __instance)
	{
		__instance.itemInc = (short)(__instance.itemCount * IncAbility);
	}
}