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;
}
}
}