Decompiled source of Scoop Me Up v1.0.0

ScoopMeUp.dll

Decompiled 6 hours 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 CG;
using CG.Game;
using CG.Game.Player;
using CG.Network;
using CG.Objects;
using CG.Ship.Hull;
using CG.Ship.Modules;
using CG.Space;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using ResourceAssets;
using UnityEngine;
using VoidManager;
using VoidManager.CustomGUI;
using VoidManager.MPModChecks;
using VoidManager.ModMessages;
using VoidManager.Utilities;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("ScoopMeUp")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ScoopMeUp")]
[assembly: AssemblyTitle("Adds a client keybind for players to be attracted to the gravity scoop")]
[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 ScoopMeUp
{
	[HarmonyPatch(typeof(CarryableAttractor), "FinalAttractionOfObject")]
	internal class CarryableAttractorPatch
	{
		private static void Prefix(CarryableAttractor __instance, CarryableAttractorLink link)
		{
			Player player2 = null;
			CarryableObject val = null;
			foreach (Player key in HostSide.playerInfo.Keys)
			{
				var (val2, flag) = HostSide.playerInfo[key];
				if (!((Object)(object)val2 != (Object)(object)link.carryable))
				{
					player2 = key;
					val = val2;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				return;
			}
			CarryableObject payload;
			switch (Configs.ScoopMode.Value)
			{
			case HostSide.ScoopModes.Stop:
				HostSide.DestroyItem(player2);
				break;
			case HostSide.ScoopModes.Transport:
				MessageHandler.Send(player2, MessageHandler.MessageType.Teleport, ((MonoBehaviourPun)__instance).photonView.ViewID);
				Tools.DelayDo((Action)delegate
				{
					if (HostSide.playerInfo.ContainsKey(player2))
					{
						HostSide.DestroyItem(player2);
					}
				}, 100.0);
				break;
			case HostSide.ScoopModes.Kill:
				HostSide.DestroyItem(player2);
				payload = Player.GetByActorId(player2.ActorNumber).Payload;
				if ((Object)(object)payload != (Object)null)
				{
					if (!((OrbitObject)payload).AmOwner)
					{
						CarryableObject obj = payload;
						obj.OwnerChange = (Action<Player>)Delegate.Combine(obj.OwnerChange, new Action<Player>(putInSocket));
						((MonoBehaviourPun)payload).photonView.RequestOwnership();
					}
					else
					{
						link.socket.TryInsertCarryable(payload);
					}
				}
				MessageHandler.Send(player2, MessageHandler.MessageType.Kill, ((MonoBehaviourPun)link.socket).photonView.ViewID);
				break;
			}
			void putInSocket(Player player)
			{
				CarryableObject obj2 = payload;
				obj2.OwnerChange = (Action<Player>)Delegate.Remove(obj2.OwnerChange, new Action<Player>(putInSocket));
				link.socket.TryInsertCarryable(payload);
			}
		}
	}
	internal class ClientSide
	{
		internal static CarryableObject itemToFollow;

		private static bool keyHeld;

		internal static void CheckKeysDown(object player, EventArgs e)
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_001a: Invalid comparison between Unknown and I4
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			if (VoidManagerPlugin.Enabled && (int)Configs.ActivateScoop.Value != 0)
			{
				bool flag = UnityInput.Current.GetKey(Configs.ActivateScoop.Value) && !((Player)LocalPlayer.Instance).IsBeingSimulated;
				if (flag != keyHeld)
				{
					keyHeld = !keyHeld;
					MessageHandler.Send(keyHeld);
				}
			}
		}

		internal static void FollowItem(object sender, EventArgs e)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: 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)
			if (!((Object)(object)itemToFollow == (Object)null))
			{
				if (!VoidManagerPlugin.Enabled)
				{
					Events.Instance.LateUpdate -= FollowItem;
				}
				else
				{
					((Player)LocalPlayer.Instance).Position = itemToFollow.Position - Vector3.up;
				}
			}
		}

		internal static void Teleport(CarryableAttractor scoop)
		{
			//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_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0027: 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)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			Vector3 val = ((Component)scoop).transform.rotation * Vector3.back;
			((Player)LocalPlayer.Instance).Position = ((Component)scoop).transform.position + val + Vector3.up;
			Tools.DelayDo((Action)delegate
			{
				if (((Player)LocalPlayer.Instance).HasJetpack)
				{
					((Component)ClientGame.Current.PlayerShip).gameObject.GetComponentsInChildren<JetpackEquipper>().FirstOrDefault().ToggleEquippedItem();
				}
			}, 300.0);
		}

		internal static void Die(CarryablesSocket socket)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			((Player)LocalPlayer.Instance).Position = ((Component)socket).transform.position;
			((Player)LocalPlayer.Instance).Die((DeathCause)2);
		}

		internal static void NewItem(CarryableObject carryable)
		{
			((OrbitObject)carryable).Sector = null;
			((OrbitObject)carryable).showMarker = false;
			((OrbitObject)carryable).Sector = GameSessionManager.ActiveSector;
			CollectionExtensions.Do<Collider>(((OrbitObject)carryable).Colliders, (Action<Collider>)delegate(Collider collider)
			{
				collider.enabled = false;
			});
			CollectionExtensions.Do<MeshRenderer>((IEnumerable<MeshRenderer>)((Component)carryable).gameObject.GetComponentsInChildren<MeshRenderer>(), (Action<MeshRenderer>)delegate(MeshRenderer renderer)
			{
				((Component)renderer).gameObject.SetActive(false);
			});
		}
	}
	internal class Configs
	{
		internal static ConfigEntry<KeyCode> ActivateScoop;

		internal static ConfigEntry<HostSide.ScoopModes> ScoopMode;

		internal static void Load(BepinPlugin plugin)
		{
			ActivateScoop = ((BaseUnityPlugin)plugin).Config.Bind<KeyCode>("ScoopMeUp", "ActivateScoop", (KeyCode)114, (ConfigDescription)null);
			ScoopMode = ((BaseUnityPlugin)plugin).Config.Bind<HostSide.ScoopModes>("ScoopMeUp", "ScoopMode", HostSide.ScoopModes.Transport, (ConfigDescription)null);
		}
	}
	internal class GUI : ModSettingsMenu
	{
		public override string Name()
		{
			return "Scoop Me Up";
		}

		public override void Draw()
		{
			GUILayout.Label("", Array.Empty<GUILayoutOption>());
			GUITools.DrawChangeKeybindButton("Change Activate Scoop Keybind", ref Configs.ActivateScoop);
			GUILayout.Label("", Array.Empty<GUILayoutOption>());
			GUILayout.Label("When the Scoop finsihes (Host only):", Array.Empty<GUILayoutOption>());
			if (GUILayout.Toggle(Configs.ScoopMode.Value == HostSide.ScoopModes.Stop, "Stop attracting near the ship", Array.Empty<GUILayoutOption>()))
			{
				Configs.ScoopMode.Value = HostSide.ScoopModes.Stop;
			}
			if (GUILayout.Toggle(Configs.ScoopMode.Value == HostSide.ScoopModes.Transport, "Move the player into the ship", Array.Empty<GUILayoutOption>()))
			{
				Configs.ScoopMode.Value = HostSide.ScoopModes.Transport;
			}
			if (GUILayout.Toggle(Configs.ScoopMode.Value == HostSide.ScoopModes.Kill, "Squash the player into the scoop (this kills the player)", Array.Empty<GUILayoutOption>()))
			{
				Configs.ScoopMode.Value = HostSide.ScoopModes.Kill;
			}
		}
	}
	internal class HostSide
	{
		internal enum ScoopModes
		{
			Stop,
			Transport,
			Kill
		}

		internal static Dictionary<Player, (CarryableObject item, bool pulling)> playerInfo = new Dictionary<Player, (CarryableObject, bool)>();

		internal static void CheckItemsPulled(object sender, EventArgs e)
		{
			//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_0104: Unknown result type (might be due to invalid IL or missing references)
			if (!PhotonNetwork.IsMasterClient)
			{
				return;
			}
			Player[] array = playerInfo.Keys.ToArray();
			Player[] array2 = array;
			foreach (Player val in array2)
			{
				bool flag = false;
				(CarryableObject item, bool pulling) tuple = playerInfo[val];
				CarryableObject item = tuple.item;
				bool item2 = tuple.pulling;
				CarryableAttractor[] componentsInChildren = ((Component)ClientGame.Current.PlayerShip).gameObject.GetComponentsInChildren<CarryableAttractor>();
				foreach (CarryableAttractor val2 in componentsInChildren)
				{
					foreach (CarryableAttractorLink attractorLink in val2.AttractorLinks)
					{
						if ((Object)(object)attractorLink.carryable == (Object)(object)item)
						{
							flag = true;
							break;
						}
					}
				}
				if (flag == item2)
				{
					if (!flag)
					{
						item.Position = Player.GetByActorId(val.ActorNumber).Position + Vector3.up;
					}
					continue;
				}
				if (flag)
				{
					MessageHandler.Send(val, MessageHandler.MessageType.PullingStarted, ((MonoBehaviourPun)item).photonView.ViewID);
				}
				else
				{
					MessageHandler.Send(val, MessageHandler.MessageType.PullingStopped, ((MonoBehaviourPun)item).photonView.ViewID);
				}
				playerInfo[val] = (item, flag);
			}
		}

		internal static void CreateItem(Player client)
		{
			//IL_001e: 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_002e: Unknown result type (might be due to invalid IL or missing references)
			Player byActorId = Player.GetByActorId(client.ActorNumber);
			CloneStarObjectDef assetDefByName = ((ResourceAssetContainer<CloneStarObjectContainer, AbstractCloneStarObject, CloneStarObjectDef>)(object)ResourceAssetContainer<CloneStarObjectContainer, AbstractCloneStarObject, CloneStarObjectDef>.Instance).GetAssetDefByName("Item_Biomass_01");
			AbstractCloneStarObject val = ObjectFactory.InstantiateSpaceObjectByGUID(((ResourceAssetDef<AbstractCloneStarObject>)(object)assetDefByName).AssetGuid, ((Component)byActorId).transform.position, Quaternion.identity, (Dictionary<byte, object>)null);
			CarryableObject val2 = (CarryableObject)(object)((val is CarryableObject) ? val : null);
			MessageHandler.Send((ReceiverGroup)1, MessageHandler.MessageType.TemporaryItem, ((MonoBehaviourPun)val2).photonView.ViewID);
			playerInfo.Add(client, (val2, false));
		}

		internal static void DestroyItem(Player client)
		{
			CarryableObject item = playerInfo[client].item;
			if ((Object)(object)item != (Object)null)
			{
				MessageHandler.Send(client, MessageHandler.MessageType.PullingStopped, ((MonoBehaviourPun)item).photonView.ViewID);
				CarryableAttractor[] componentsInChildren = ((Component)ClientGame.Current.PlayerShip).gameObject.GetComponentsInChildren<CarryableAttractor>();
				foreach (CarryableAttractor val in componentsInChildren)
				{
					for (int j = 0; j < val.AttractorLinks.Count; j++)
					{
						if ((Object)(object)val.AttractorLinks[j].carryable == (Object)(object)item)
						{
							val.RemoveLink(j);
						}
					}
				}
				((OrbitObject)item).sector = null;
				((AbstractCloneStarObject)item).Destroy();
			}
			playerInfo.Remove(client);
		}
	}
	internal class MessageHandler : ModMessage
	{
		internal enum MessageType
		{
			ButtonPressed,
			ButtonReleased,
			PullingStarted,
			PullingStopped,
			Teleport,
			Kill,
			TemporaryItem
		}

		private const int version = 1;

		public override void Handle(object[] arguments, Player sender)
		{
			if (arguments.Length < 1 || !(arguments[0] is int))
			{
				return;
			}
			int num = (int)arguments[0];
			if (num != 1)
			{
				BepinPlugin.Log.LogInfo((object)$"Got version {num} from {sender.NickName}, expected version {1}");
			}
			else
			{
				if (arguments.Length < 2 || !(arguments[1] is int))
				{
					return;
				}
				MessageType messageType = (MessageType)arguments[1];
				int num2 = 0;
				if (messageType != 0 && messageType != MessageType.ButtonReleased)
				{
					if (!sender.IsMasterClient || arguments.Length < 3 || !(arguments[2] is int))
					{
						return;
					}
					num2 = (int)arguments[2];
				}
				switch (messageType)
				{
				case MessageType.ButtonPressed:
					if (PhotonNetwork.IsMasterClient)
					{
						HostSide.CreateItem(sender);
					}
					break;
				case MessageType.ButtonReleased:
					if (PhotonNetwork.IsMasterClient && HostSide.playerInfo.ContainsKey(sender))
					{
						HostSide.DestroyItem(sender);
					}
					break;
				case MessageType.PullingStarted:
				{
					PhotonView obj3 = PhotonView.Find(num2);
					object itemToFollow;
					if (obj3 == null)
					{
						itemToFollow = null;
					}
					else
					{
						GameObject gameObject2 = ((Component)obj3).gameObject;
						itemToFollow = ((gameObject2 != null) ? gameObject2.GetComponent<CarryableObject>() : null);
					}
					ClientSide.itemToFollow = (CarryableObject)itemToFollow;
					Events.Instance.LateUpdate += ClientSide.FollowItem;
					break;
				}
				case MessageType.PullingStopped:
					if (sender.IsMasterClient)
					{
						ClientSide.itemToFollow = null;
						Events.Instance.LateUpdate -= ClientSide.FollowItem;
					}
					break;
				case MessageType.Teleport:
					if (sender.IsMasterClient)
					{
						ClientSide.Teleport(((Component)PhotonView.Find(num2)).gameObject.GetComponent<CarryableAttractor>());
					}
					break;
				case MessageType.Kill:
					if (sender.IsMasterClient)
					{
						ClientSide.Die(((Component)PhotonView.Find(num2)).gameObject.GetComponent<CarryablesSocket>());
					}
					break;
				case MessageType.TemporaryItem:
				{
					PhotonView obj = PhotonView.Find(num2);
					object obj2;
					if (obj == null)
					{
						obj2 = null;
					}
					else
					{
						GameObject gameObject = ((Component)obj).gameObject;
						obj2 = ((gameObject != null) ? gameObject.GetComponent<CarryableObject>() : null);
					}
					CarryableObject val = (CarryableObject)obj2;
					if (!((Object)(object)val == (Object)null))
					{
						ClientSide.NewItem(val);
					}
					break;
				}
				}
			}
		}

		internal static void Send(bool buttonDown)
		{
			ModMessage.Send("id107.scoopmeup", ModMessage.GetIdentifier(typeof(MessageHandler)), PhotonNetwork.MasterClient, new object[2]
			{
				1,
				(!buttonDown) ? MessageType.ButtonReleased : MessageType.ButtonPressed
			}, false);
		}

		internal static void Send(Player target, MessageType message, int viewId)
		{
			ModMessage.Send("id107.scoopmeup", ModMessage.GetIdentifier(typeof(MessageHandler)), target, new object[3] { 1, message, viewId }, false);
		}

		internal static void Send(ReceiverGroup group, MessageType message, int viewId)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			ModMessage.Send("id107.scoopmeup", ModMessage.GetIdentifier(typeof(MessageHandler)), group, new object[3] { 1, message, viewId }, false);
		}
	}
	public class MyPluginInfo
	{
		public const string PLUGIN_GUID = "id107.scoopmeup";

		public const string PLUGIN_NAME = "ScoopMeUp";

		public const string USERS_PLUGIN_NAME = "Scoop Me Up";

		public const string PLUGIN_VERSION = "1.0.0";

		public const string PLUGIN_DESCRIPTION = "Adds a client keybind for players to be attracted to the gravity scoop";

		public const string PLUGIN_ORIGINAL_AUTHOR = "18107";

		public const string PLUGIN_AUTHORS = "18107";

		public const string PLUGIN_THUNDERSTORE_ID = "";
	}
	[BepInPlugin("id107.scoopmeup", "Scoop Me Up", "1.0.0")]
	[BepInProcess("Void Crew.exe")]
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	public class BepinPlugin : BaseUnityPlugin
	{
		internal static ManualLogSource Log;

		private void Awake()
		{
			Log = ((BaseUnityPlugin)this).Logger;
			Configs.Load(this);
			Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin id107.scoopmeup is loaded!");
		}
	}
	public class VoidManagerPlugin : VoidPlugin
	{
		public static bool Enabled { get; private set; }

		public override MultiplayerType MPType => (MultiplayerType)14;

		public override string Author => "18107";

		public override string Description => "Adds a client keybind for players to be attracted to the gravity scoop";

		public override string ThunderstoreID => "";

		public VoidManagerPlugin()
		{
			Events.Instance.LateUpdate += HostSide.CheckItemsPulled;
		}

		public override SessionChangedReturn OnSessionChange(SessionChangedInput input)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0081: Unknown result type (might be due to invalid IL or missing references)
			//IL_008f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_0093: Unknown result type (might be due to invalid IL or missing references)
			if (Enabled != input.HostHasMod)
			{
				if (input.HostHasMod)
				{
					Events.Instance.LateUpdate += ClientSide.CheckKeysDown;
				}
				else
				{
					Events.Instance.LateUpdate -= ClientSide.CheckKeysDown;
				}
			}
			Enabled = input.HostHasMod;
			SessionChangedReturn result = default(SessionChangedReturn);
			result.SetMod_Session = true;
			return result;
		}
	}
}