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