Decompiled source of Ash TeleportVote v1.0.1

plugin/Ash_TeleportVote.dll

Decompiled 3 weeks ago
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using On.RoR2;
using RoR2;
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(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("0.0.0.0")]
namespace Ash_TeleportVote;

[BepInPlugin("Ashen_O.Ash_TeleportVote", "Ash_TeleportVote", "1.0.1")]
public class Ash_TeleportVote : BaseUnityPlugin
{
	private static readonly HashSet<NetworkUser> readyPlayers = new HashSet<NetworkUser>();

	private static TeleporterInteraction currentTeleporter;

	public void Awake()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		//IL_0012: Expected O, but got Unknown
		//IL_001a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Expected O, but got Unknown
		TeleporterInteraction.OnInteractionBegin += new hook_OnInteractionBegin(TeleporterIntercept);
		Chat.CCSay += new hook_CCSay(ProcessMessage);
	}

	private static void ProcessMessage(orig_CCSay orig, ConCommandArgs args)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0033: Unknown result type (might be due to invalid IL or missing references)
		//IL_0155: Unknown result type (might be due to invalid IL or missing references)
		NetworkUser sender = args.sender;
		string text = ((ConCommandArgs)(ref args))[0].Trim().ToLowerInvariant();
		if ((Object)(object)sender == (Object)null)
		{
			Debug.Log((object)"[Ash][TeleportVote][Message] Server message received");
			orig.Invoke(args);
		}
		else if (text == "r")
		{
			Debug.Log((object)"[Ash][TeleportVote][Message] User message received");
			UserReady(sender);
		}
		else if (text == "start")
		{
			Debug.Log((object)"[Ash][TeleportVote][Message] User message received");
			if (!AllReady())
			{
				return;
			}
			if ((Object)(object)currentTeleporter == (Object)null)
			{
				currentTeleporter = Object.FindObjectOfType<TeleporterInteraction>();
				if ((Object)(object)currentTeleporter == (Object)null)
				{
					return;
				}
			}
			NetworkUser val = GetAliveUsers().FirstOrDefault();
			object obj;
			if (val == null)
			{
				obj = null;
			}
			else
			{
				CharacterMaster master = val.master;
				obj = ((master != null) ? master.GetBody() : null);
			}
			CharacterBody val2 = (CharacterBody)obj;
			if (!((Object)(object)val2 == (Object)null))
			{
				Interactor component = ((Component)val2).GetComponent<Interactor>();
				if ((Object)(object)component == (Object)null)
				{
					Debug.Log((object)("[Ash][TeleportVote][Interaction] No Interactor found on " + ((Object)val2).name + ", cannot simulate teleporter interaction"));
					return;
				}
				currentTeleporter.OnInteractionBegin(component);
				readyPlayers.Clear();
			}
		}
		else
		{
			orig.Invoke(args);
		}
	}

	private void TeleporterIntercept(orig_OnInteractionBegin orig, TeleporterInteraction self, Interactor activator)
	{
		Debug.Log((object)"[Ash][TeleportVote][Interaction] Starting teleporter interaction");
		CharacterBody val = ((activator != null) ? ((Component)activator).GetComponent<CharacterBody>() : null);
		object obj;
		if (val == null)
		{
			obj = null;
		}
		else
		{
			CharacterMaster master = val.master;
			if (master == null)
			{
				obj = null;
			}
			else
			{
				PlayerCharacterMasterController playerCharacterMasterController = master.playerCharacterMasterController;
				obj = ((playerCharacterMasterController != null) ? playerCharacterMasterController.networkUser : null);
			}
		}
		NetworkUser val2 = (NetworkUser)obj;
		if (!((Object)(object)val2 == (Object)null))
		{
			UserReady(val2);
			if (AllReady())
			{
				readyPlayers.Clear();
				orig.Invoke(self, activator);
			}
		}
	}

	private static void UserReady(NetworkUser user)
	{
		//IL_0037: 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_0080: Expected O, but got Unknown
		//IL_008f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a4: Expected O, but got Unknown
		List<NetworkUser> aliveUsers = GetAliveUsers();
		if (readyPlayers.Add(user))
		{
			Debug.Log((object)("[Ash][TeleportVote][Interaction] " + user.userName + " is ready"));
			Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
			{
				baseToken = "<color=orange>" + user.userName + "</color> is ready! " + $"(<color=yellow>{readyPlayers.Count}</color>/<color=yellow>{aliveUsers.Count}</color>)"
			});
			if (AllReady())
			{
				Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage
				{
					baseToken = "<color=red>[Ash]</color> All players are ready!"
				});
			}
		}
	}

	private static List<NetworkUser> GetAliveUsers()
	{
		return NetworkUser.readOnlyInstancesList.Where(delegate(NetworkUser u)
		{
			int result;
			if (u == null)
			{
				result = 0;
			}
			else
			{
				CharacterMaster master = u.master;
				bool? obj;
				if (master == null)
				{
					obj = null;
				}
				else
				{
					CharacterBody body = master.GetBody();
					if (body == null)
					{
						obj = null;
					}
					else
					{
						HealthComponent healthComponent = body.healthComponent;
						obj = ((healthComponent != null) ? new bool?(healthComponent.alive) : null);
					}
				}
				bool? flag = obj;
				result = (flag.GetValueOrDefault() ? 1 : 0);
			}
			return (byte)result != 0;
		}).ToList();
	}

	private static bool AllReady()
	{
		List<NetworkUser> aliveUsers = GetAliveUsers();
		bool flag = aliveUsers.All((NetworkUser u) => readyPlayers.Contains(u));
		if (flag)
		{
			Debug.Log((object)"[Ash][TeleportVote][Interaction] All players are ready");
		}
		return flag;
	}
}