Decompiled source of ShipTurrets v1.0.4

ShipTurrets.dll

Decompiled 3 weeks ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
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.Configuration;
using BepInEx.Logging;
using GameNetcodeStuff;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using ShipTurrets.Patches;
using TerminalApi;
using TerminalApi.Classes;
using Unity.Netcode;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("ShipTurrets")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Plugin that spawns two turrets on the front and rear of the player ship that targets and neutralises enemies instead of players.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ShipTurrets")]
[assembly: AssemblyTitle("ShipTurrets")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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 ShipTurrets
{
	[BepInPlugin("ShipTurrets", "ShipTurrets", "1.0.0")]
	public class Plugin : BaseUnityPlugin
	{
		public static ManualLogSource logger;

		public static ConfigEntry<bool> isFrontTurretSpawned;

		public static ConfigEntry<bool> isRearTurretSpawned;

		public static ConfigEntry<bool> isTurretFF;

		public static ConfigEntry<bool> isTerminalHostBuy;

		private readonly Harmony harmony = new Harmony("ShipTurrets");

		private void Awake()
		{
			isFrontTurretSpawned = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Ship front turret spawn", true, "Is the front turret spawned onto the player ship");
			isRearTurretSpawned = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Ship rear turret spawn", true, "Is the rear turret spawned onto the player ship");
			isTurretFF = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Ship turret friendly fire", false, "Is the turret friendly fire on (it shoots players & enemies)");
			isTerminalHostBuy = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Terminal Host Turret Buying", false, "Does the host have to buy front and rear turrets before they are enabled. (Disable front and rear turrets otherwise they will already be bought)");
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin ShipTurrets is loaded successfully");
			logger = ((BaseUnityPlugin)this).Logger;
			harmony.PatchAll(typeof(Plugin));
			harmony.PatchAll(typeof(RoundManagerPatch));
			harmony.PatchAll(typeof(TurretPatch));
			harmony.PatchAll(typeof(TerminalPatch));
		}
	}
	public static class PluginInfo
	{
		public const string PLUGIN_GUID = "ShipTurrets";

		public const string PLUGIN_NAME = "ShipTurrets";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace ShipTurrets.Patches
{
	[HarmonyPatch(typeof(RoundManager))]
	internal class RoundManagerPatch
	{
		internal static GameObject mapPropsContainer;

		[HarmonyPatch("SpawnMapObjects")]
		[HarmonyPostfix]
		private static void spawnTurret(ref RoundManager __instance)
		{
			//IL_0021: Unknown result type (might be due to invalid IL or missing references)
			//IL_0026: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
			//IL_0112: Unknown result type (might be due to invalid IL or missing references)
			//IL_0113: Unknown result type (might be due to invalid IL or missing references)
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			mapPropsContainer = GameObject.FindGameObjectWithTag("MapPropsContainer");
			Vector3 position = ((Component)__instance.playersManager.localPlayerController).transform.position;
			Vector3 val = default(Vector3);
			((Vector3)(ref val))..ctor(8.894f, 7.2597f, -14.0808f);
			Vector3 val2 = default(Vector3);
			((Vector3)(ref val2))..ctor(-5.0311f, 5.4649f, -14.1322f);
			SpawnableMapObject[] spawnableMapObjects = __instance.currentLevel.spawnableMapObjects;
			foreach (SpawnableMapObject val3 in spawnableMapObjects)
			{
				if (!((Object)(object)val3.prefabToSpawn.GetComponentInChildren<Turret>() == (Object)null))
				{
					if (Plugin.isFrontTurretSpawned.Value)
					{
						GameObject val4 = Object.Instantiate<GameObject>(val3.prefabToSpawn, val, Quaternion.identity, mapPropsContainer.transform);
						val4.transform.position = val;
						val4.transform.forward = new Vector3(1f, 0f, 0f);
						val4.GetComponent<NetworkObject>().Spawn(true);
					}
					if (Plugin.isRearTurretSpawned.Value)
					{
						GameObject val5 = Object.Instantiate<GameObject>(val3.prefabToSpawn, val2, Quaternion.identity, mapPropsContainer.transform);
						val5.transform.position = val2;
						val5.transform.forward = new Vector3(-1f, 0f, 0f);
						val5.GetComponent<NetworkObject>().Spawn(true);
					}
				}
			}
		}
	}
	[HarmonyPatch(typeof(Terminal))]
	internal class TerminalPatch : NetworkBehaviour
	{
		internal static GameObject mapPropsContainer;

		internal static int boughtTurret;

		internal static int tempGroupCredits;

		[ServerRpc(RequireOwnership = false)]
		[HarmonyPatch("Start")]
		[HarmonyPostfix]
		private static void addCommands(ref Terminal __instance)
		{
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_004f: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006e: Expected O, but got Unknown
			//IL_0074: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ab: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			tempGroupCredits = __instance.groupCredits;
			if (!Plugin.isTerminalHostBuy.Value)
			{
				return;
			}
			TerminalApi.AddCommand("Front Turret", new CommandInfo
			{
				DisplayTextSupplier = delegate
				{
					if (tempGroupCredits > 1000)
					{
						boughtTurret++;
						Plugin.logger.LogWarning((object)"Front Turret Enabled.");
						Plugin.isFrontTurretSpawned.Value = true;
						return "Front Turret Enabled";
					}
					Plugin.logger.LogWarning((object)"Can't afford Front Turret.");
					return "You do not have enough credits to purchase the Front Turret.";
				},
				Category = "store",
				Description = "Buy the front turret for your ship. (Costs 1000)"
			}, (string)null, true);
			TerminalApi.AddCommand("Rear Turret", new CommandInfo
			{
				DisplayTextSupplier = delegate
				{
					if (tempGroupCredits > 1000)
					{
						boughtTurret++;
						Plugin.logger.LogWarning((object)"Rear Turret Enabled.");
						Plugin.isRearTurretSpawned.Value = true;
						return "Rear Turret Enabled";
					}
					Plugin.logger.LogWarning((object)"Can't afford rear Turret.");
					return "You do not have enough credits to purchase the rear Turret.";
				},
				Category = "store",
				Description = "Buy the rear turret for your ship. (Costs 1000"
			}, (string)null, true);
		}

		[HarmonyPatch("Update")]
		[HarmonyPostfix]
		private static void PatchUpdate(ref Terminal __instance)
		{
			tempGroupCredits = __instance.groupCredits;
			if (boughtTurret > 0)
			{
				Terminal obj = __instance;
				obj.groupCredits -= 1000;
				boughtTurret--;
			}
		}
	}
	[HarmonyPatch(typeof(Turret))]
	internal class TurretPatch
	{
		public static float viewRadius = 20f;

		public static float viewAngle = 180f;

		public static float missChance = 0.97f;

		private static Vector3 turretLocFront = new Vector3(8.9f, 8.19f, -14.09f);

		private static Vector3 turretLocRear = new Vector3(-5.04f, 6.4f, -14.12f);

		[HarmonyPatch("Update")]
		[HarmonyPrefix]
		public static void PatchUpdateBefore(ref Turret __instance)
		{
			//IL_002b: 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_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0034: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Unknown result type (might be due to invalid IL or missing references)
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Invalid comparison between Unknown and I4
			//IL_008e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0094: Invalid comparison between Unknown and I4
			//IL_0098: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Invalid comparison between Unknown and I4
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ca: Invalid comparison between Unknown and I4
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Invalid comparison between Unknown and I4
			//IL_00df: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0177: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0150: Unknown result type (might be due to invalid IL or missing references)
			if (!isShipTurret(__instance))
			{
				return;
			}
			TurretMode val = (TurretMode)AccessTools.Field(typeof(Turret), "turretModeLastFrame").GetValue(__instance);
			TurretMode val2 = val;
			TurretMode val3 = val2;
			List<EnemyAICollisionDetect> enemies;
			if ((int)val3 != 0)
			{
				if ((int)val3 == 1)
				{
					enemies = GetEnemies(GetTargets(__instance));
					if (enemies.Any())
					{
						__instance.turretMode = (TurretMode)2;
					}
				}
			}
			else
			{
				enemies = GetEnemies(GetTargets(__instance));
				if (enemies.Any())
				{
					__instance.turretMode = (TurretMode)1;
				}
			}
			if ((int)__instance.turretMode != 2 && (int)__instance.turretMode != 3)
			{
				return;
			}
			enemies = GetEnemies(GetTargets(__instance));
			if (!TargetEnemies(__instance, enemies) && ((int)val == 2 || (int)val == 3))
			{
				__instance.turretMode = (TurretMode)0;
			}
			if (Plugin.isTurretFF.Value && (Object)(object)__instance.CheckForPlayersInLineOfSight(3f, false) == (Object)(object)GameNetworkManager.Instance.localPlayerController)
			{
				if (GameNetworkManager.Instance.localPlayerController.health - 34 > 0)
				{
					GameNetworkManager.Instance.localPlayerController.DamagePlayer(34, true, true, (CauseOfDeath)7, 0, false, default(Vector3));
				}
				else
				{
					GameNetworkManager.Instance.localPlayerController.KillPlayer(__instance.aimPoint.forward * 40f, true, (CauseOfDeath)7, 0);
				}
			}
		}

		[HarmonyPatch("TurnTowardsTargetIfHasLOS")]
		[HarmonyPrefix]
		public static void PatchTurnTowardsTargetIfHasLOS(ref Turret __instance)
		{
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
			//IL_0109: Unknown result type (might be due to invalid IL or missing references)
			//IL_010e: Unknown result type (might be due to invalid IL or missing references)
			bool flag = (bool)AccessTools.Field(typeof(Turret), "hasLineOfSight").GetValue(__instance);
			float num = (float)AccessTools.Field(typeof(Turret), "lostLOSTimer").GetValue(__instance);
			List<EnemyAICollisionDetect> enemies = GetEnemies(GetTargets(__instance));
			if (enemies.Any())
			{
				using List<EnemyAICollisionDetect>.Enumerator enumerator = enemies.GetEnumerator();
				if (enumerator.MoveNext())
				{
					EnemyAICollisionDetect current = enumerator.Current;
					flag = true;
					num = 0f;
					AccessTools.Field(typeof(Turret), "hasLineOfSight").SetValue(__instance, true);
					AccessTools.Field(typeof(Turret), "lostLOSTimer").SetValue(__instance, 0f);
					__instance.tempTransform.position = ((Component)current.mainScript).transform.position;
					Transform tempTransform = __instance.tempTransform;
					tempTransform.position -= Vector3.up * 0.15f;
					__instance.turnTowardsObjectCompass.LookAt(__instance.tempTransform);
				}
			}
			if (flag)
			{
				flag = false;
				num = 0f;
				AccessTools.Field(typeof(Turret), "hasLineOfSight").SetValue(__instance, false);
				AccessTools.Field(typeof(Turret), "lostLOSTimer").SetValue(__instance, 0f);
			}
		}

		public static List<EnemyAICollisionDetect> GetTargets(Turret turret)
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_0040: Expected O, but got Unknown
			List<EnemyAICollisionDetect> list = new List<EnemyAICollisionDetect>();
			Collider[] array = Physics.OverlapSphere(turret.aimPoint.position, viewRadius);
			for (int i = 0; i < array.Length; i++)
			{
				Transform transform = ((Component)array[i]).transform;
				EnemyAICollisionDetect component = ((Component)transform).GetComponent<EnemyAICollisionDetect>();
				if ((Object)component != (Object)null)
				{
					EnemyAICollisionDetect component2 = ((Component)transform).GetComponent<EnemyAICollisionDetect>();
					list.Add(component2);
				}
			}
			return list;
		}

		public static List<EnemyAICollisionDetect> GetEnemies(List<EnemyAICollisionDetect> targets)
		{
			List<EnemyAICollisionDetect> retList = new List<EnemyAICollisionDetect>();
			targets.ForEach(delegate(EnemyAICollisionDetect target)
			{
				if (!target.mainScript.isEnemyDead && target.mainScript.enemyType.enemyName != "Manticoil" && target.mainScript.enemyType.enemyName != "Red Locust Bees" && target.mainScript.enemyType.enemyName != "Docile Roaming Locust")
				{
					retList.Add(target);
				}
			});
			return retList;
		}

		public static bool TargetEnemies(Turret turret, List<EnemyAICollisionDetect> visibleEnemies)
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			bool result = false;
			if (visibleEnemies.Count > 0)
			{
				if (Random.Range(0f, 1f) > missChance)
				{
					visibleEnemies[0].mainScript.HitEnemyOnLocalClient(3, default(Vector3), (PlayerControllerB)null, false, -1);
					Plugin.logger.LogInfo((object)(visibleEnemies[0].mainScript.enemyType.enemyName + " was hit."));
					result = true;
				}
				else
				{
					result = false;
				}
			}
			return result;
		}

		private static bool isShipTurret(Turret turret)
		{
			//IL_0007: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_002d: Unknown result type (might be due to invalid IL or missing references)
			if ((double)Vector3.Distance(((Component)turret).transform.position, turretLocFront) < 1.0 || (double)Vector3.Distance(((Component)turret).transform.position, turretLocRear) < 1.0)
			{
				return true;
			}
			return false;
		}
	}
}