using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
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.Bootstrap;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using MenuLib;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using REPOLib.Modules;
using Sirenix.Serialization.Utilities;
using TMPro;
using Unity.VisualScripting;
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: IgnoresAccessChecksTo("Assembly-CSharp-firstpass")]
[assembly: IgnoresAccessChecksTo("Assembly-CSharp")]
[assembly: IgnoresAccessChecksTo("Autodesk.Fbx")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")]
[assembly: IgnoresAccessChecksTo("Klattersynth")]
[assembly: IgnoresAccessChecksTo("Photon3Unity3D")]
[assembly: IgnoresAccessChecksTo("PhotonChat")]
[assembly: IgnoresAccessChecksTo("PhotonRealtime")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking")]
[assembly: IgnoresAccessChecksTo("PhotonUnityNetworking.Utilities")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.API")]
[assembly: IgnoresAccessChecksTo("PhotonVoice")]
[assembly: IgnoresAccessChecksTo("PhotonVoice.PUN")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime")]
[assembly: IgnoresAccessChecksTo("SingularityGroup.HotReload.Runtime.Public")]
[assembly: IgnoresAccessChecksTo("Sirenix.OdinInspector.Attributes")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization.Config")]
[assembly: IgnoresAccessChecksTo("Sirenix.Serialization")]
[assembly: IgnoresAccessChecksTo("Sirenix.Utilities")]
[assembly: IgnoresAccessChecksTo("Unity.AI.Navigation")]
[assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.TextMeshPro")]
[assembly: IgnoresAccessChecksTo("Unity.Timeline")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Antlr3.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Core")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.Flow")]
[assembly: IgnoresAccessChecksTo("Unity.VisualScripting.State")]
[assembly: IgnoresAccessChecksTo("UnityEngine.ARModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.NVIDIAModule")]
[assembly: IgnoresAccessChecksTo("UnityEngine.UI")]
[assembly: IgnoresAccessChecksTo("websocket-sharp")]
[assembly: AssemblyCompany("Patrick")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyDescription("Mod to vote for a specific map in R.E.P.O.")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+7abb575c0ce225a97d2702504afe3ea22f088ffc")]
[assembly: AssemblyProduct("MapVote")]
[assembly: AssemblyTitle("MapVote")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/pneben/Repo-MapVote")]
[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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
internal sealed class NullableAttribute : Attribute
{
public readonly byte[] NullableFlags;
public NullableAttribute(byte P_0)
{
NullableFlags = new byte[1] { P_0 };
}
public NullableAttribute(byte[] P_0)
{
NullableFlags = P_0;
}
}
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
internal sealed class NullableContextAttribute : Attribute
{
public readonly byte Flag;
public NullableContextAttribute(byte P_0)
{
Flag = P_0;
}
}
[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 MapVote
{
internal class CompatibilityPatches
{
private static Dictionary<string, Action> Patches = new Dictionary<string, Action>();
public static void PopulatePatches()
{
Patches.Add("ViViKo.StartInShop", delegate
{
MapVote.HideInMenu = true;
});
}
public static void RunPatches(List<string> pluginGUIDs)
{
List<string> pluginGUIDs2 = pluginGUIDs;
PopulatePatches();
LinqExtensions.ForEach<KeyValuePair<string, Action>>(Patches.Where<KeyValuePair<string, Action>>((KeyValuePair<string, Action> x) => pluginGUIDs2.Contains(x.Key)), (Action<KeyValuePair<string, Action>>)delegate(KeyValuePair<string, Action> plugin)
{
plugin.Value();
MapVote.Logger.LogInfo((object)("Ran Compatibility Patch for " + plugin.Key));
});
}
}
internal class DebugManager
{
public static void InitializeDebug()
{
PopulateMockData();
}
private static void PopulateMockData()
{
MapVote.CurrentVotes[10] = "Level - Arctic";
MapVote.CurrentVotes[11] = "Level - Manor";
MapVote.CurrentVotes[12] = "Level - Wizard";
MapVote.CurrentVotes[13] = "Level - Wizard";
MapVote.CurrentVotes[14] = "Level - Wizard";
MapVote.CurrentVotes[15] = "Random";
}
}
internal static class LevelColorDictionary
{
private static readonly Dictionary<string, string> _dictionary = new Dictionary<string, string>
{
{ "Random", "#ff0000" },
{ "Level - Manor", "#A47551" },
{ "Level - Arctic", "#4FC3F7" },
{ "Level - Wizard", "#B066FF" }
};
public static string GetColor(string key)
{
string value;
return _dictionary.TryGetValue(key, out value) ? value : "#ffffff";
}
}
[BepInPlugin("Patrick.MapVote", "MapVote", "1.0.1")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
internal sealed class MapVote : BaseUnityPlugin
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static Predicate<Level> <>9__29_0;
public static Func<KeyValuePair<string, PluginInfo>, string> <>9__33_0;
public static Action <>9__36_1;
public static BuilderDelegate <>9__36_0;
public static Action<KeyValuePair<int, string>> <>9__39_0;
public static Func<VoteOptionButton, global::<>f__AnonymousType0<VoteOptionButton, int>> <>9__42_0;
public static Func<global::<>f__AnonymousType0<VoteOptionButton, int>, int> <>9__42_1;
public static Func<global::<>f__AnonymousType0<VoteOptionButton, int>, VoteOptionButton> <>9__42_2;
public static Func<Level, int, (Level level, int index)> <>9__46_2;
public static Action <>9__46_5;
public static ScrollViewBuilderDelegate <>9__46_0;
public static Action<VoteOptionButton> <>9__47_0;
public static Func<VoteOptionButton, int> <>9__48_0;
public static Func<IGrouping<int, VoteOptionButton>, int> <>9__48_1;
public static Predicate<VoteOptionButton> <>9__48_3;
public static Predicate<VoteOptionButton> <>9__48_2;
internal bool <HookRunManagerSetRunLevel>b__29_0(Level x)
{
return ((Object)x).name == WonMap;
}
internal string <Awake>b__33_0(KeyValuePair<string, PluginInfo> x)
{
return x.Key;
}
internal void <Initialize>b__36_0(Transform parent)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
MenuAPI.CreateREPOButton("Map Vote", (Action)delegate
{
CreateVotePopup(isInMenu: true);
}, parent, new Vector2(175.2f, 62.8f));
}
internal void <Initialize>b__36_1()
{
CreateVotePopup(isInMenu: true);
}
internal void <HandleOnSyncVotes>b__39_0(KeyValuePair<int, string> x)
{
CurrentVotes[x.Key] = x.Value;
}
internal global::<>f__AnonymousType0<VoteOptionButton, int> <GetSortedVoteOptions>b__42_0(VoteOptionButton b)
{
return new
{
Item = b,
Count = b.GetVotes(CurrentVotes.Values)
};
}
internal int <GetSortedVoteOptions>b__42_1(global::<>f__AnonymousType0<VoteOptionButton, int> b)
{
return b.Count;
}
internal VoteOptionButton <GetSortedVoteOptions>b__42_2(global::<>f__AnonymousType0<VoteOptionButton, int> b)
{
return b.Item;
}
internal (Level level, int index) <CreateVotePopup>b__46_2(Level level, int index)
{
return (level, index);
}
internal RectTransform <CreateVotePopup>b__46_0(Transform parent)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
REPOButton val = MenuAPI.CreateREPOButton((string)null, (Action)delegate
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
if (!DisableInput)
{
OwnVoteLevel = "Random";
NetworkedEvent? onVoteEvent = OnVoteEvent;
if (onVoteEvent != null)
{
onVoteEvent.RaiseEvent((object)"Random", NetworkingEvents.RaiseAll, SendOptions.SendReliable);
}
}
}, parent, default(Vector2));
VoteOptionButtons.Add(new VoteOptionButton("Random", 0, val, _isRandomButton: true));
return ((REPOElement)val).rectTransform;
}
internal void <CreateVotePopup>b__46_5()
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
if (!DisableInput)
{
OwnVoteLevel = "Random";
NetworkedEvent? onVoteEvent = OnVoteEvent;
if (onVoteEvent != null)
{
onVoteEvent.RaiseEvent((object)"Random", NetworkingEvents.RaiseAll, SendOptions.SendReliable);
}
}
}
internal void <UpdateButtonLabels>b__47_0(VoteOptionButton b)
{
b.UpdateLabel(CurrentVotes.Values, OwnVoteLevel);
}
internal int <GetEligibleOptions>b__48_0(VoteOptionButton x)
{
return x.GetVotes(CurrentVotes.Values);
}
internal int <GetEligibleOptions>b__48_1(IGrouping<int, VoteOptionButton> x)
{
return x.Key;
}
internal bool <GetEligibleOptions>b__48_3(VoteOptionButton x)
{
return x.Level == "Random";
}
internal bool <GetEligibleOptions>b__48_2(VoteOptionButton x)
{
return !x.IsRandomButton;
}
}
[CompilerGenerated]
private sealed class <>c__DisplayClass50_0
{
public string winningMap;
internal bool <OnVotingDone>b__0(VoteOptionButton x)
{
return x.Level == winningMap;
}
}
[CompilerGenerated]
private sealed class <BlinkButton>d__51 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public VoteOptionButton voteOption;
private int <maxBlinks>5__1;
private int <currentBlink>5__2;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <BlinkButton>d__51(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00aa: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Expected O, but got Unknown
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0078: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<maxBlinks>5__1 = (int)Mathf.Ceil(6f);
<currentBlink>5__2 = 0;
break;
case 1:
<>1__state = -1;
voteOption.UpdateLabel(CurrentVotes.Values, OwnVoteLevel);
<>2__current = (object)new WaitForSeconds(0.25f);
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
<currentBlink>5__2++;
break;
}
if (<currentBlink>5__2 < <maxBlinks>5__1)
{
voteOption.UpdateLabel(CurrentVotes.Values, OwnVoteLevel, _highlight: true);
<>2__current = (object)new WaitForSeconds(0.25f);
<>1__state = 1;
return true;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <OnVotingDone>d__50 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public string winningMap;
private <>c__DisplayClass50_0 <>8__1;
private List<VoteOptionButton> <eligibleOptions>5__2;
private int <winningIndex>5__3;
private VoteOptionButton <wonOption>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <OnVotingDone>d__50(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>8__1 = null;
<eligibleOptions>5__2 = null;
<wonOption>5__4 = null;
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>8__1 = new <>c__DisplayClass50_0();
<>8__1.winningMap = winningMap;
DisableInput = true;
ShouldHookRunMangerSetRunLevel = true;
WonMap = <>8__1.winningMap;
<eligibleOptions>5__2 = GetEligibleOptions();
if (<eligibleOptions>5__2.Count > 1)
{
<winningIndex>5__3 = <eligibleOptions>5__2.FindIndex((VoteOptionButton x) => x.Level == <>8__1.winningMap);
<>2__current = ((MonoBehaviour)Instance).StartCoroutine(SpinWheelOptions(<eligibleOptions>5__2, <winningIndex>5__3));
<>1__state = 1;
return true;
}
<wonOption>5__4 = <eligibleOptions>5__2.FirstOrDefault();
if (<wonOption>5__4 != null)
{
<>2__current = ((MonoBehaviour)Instance).StartCoroutine(BlinkButton(<wonOption>5__4));
<>1__state = 3;
return true;
}
goto IL_016b;
case 1:
<>1__state = -1;
<>2__current = ((MonoBehaviour)Instance).StartCoroutine(BlinkButton(<eligibleOptions>5__2[<winningIndex>5__3]));
<>1__state = 2;
return true;
case 2:
<>1__state = -1;
break;
case 3:
{
<>1__state = -1;
goto IL_016b;
}
IL_016b:
<wonOption>5__4 = null;
break;
}
DisableInput = false;
if (SemiFunc.RunIsLobby())
{
CreateNextMapLabel(WonMap);
if ((Object)(object)VotePopup != (Object)null)
{
VotePopup.ClosePage(true);
}
MenuAPI.CloseAllPagesAddedOnTop();
}
if (SemiFunc.IsMasterClient() && SemiFunc.RunIsLobbyMenu())
{
MenuPageLobby.instance.ButtonStart();
}
Reset();
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <SpinWheelOptions>d__52 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public List<VoteOptionButton> eligibleOptions;
public int winningIndex;
private float <delay>5__1;
private int <index>5__2;
private int <endIndex>5__3;
private int <recentIndex>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <SpinWheelOptions>d__52(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_00b5: Unknown result type (might be due to invalid IL or missing references)
//IL_00bf: Expected O, but got Unknown
int num = <>1__state;
if (num != 0)
{
if (num != 1)
{
return false;
}
<>1__state = -1;
if (<delay>5__1 > 0.4f && <index>5__2 == <endIndex>5__3)
{
goto IL_0152;
}
<delay>5__1 *= 1.15f;
<recentIndex>5__4 = <index>5__2;
<index>5__2 = (<index>5__2 + 1) % eligibleOptions.Count;
}
else
{
<>1__state = -1;
<delay>5__1 = 0.05f;
<index>5__2 = 0;
<endIndex>5__3 = winningIndex;
<recentIndex>5__4 = -1;
}
if (<index>5__2 != <endIndex>5__3 || <delay>5__1 < 0.5f)
{
eligibleOptions[<index>5__2].UpdateLabel(CurrentVotes.Values, OwnVoteLevel, _highlight: true);
if (<recentIndex>5__4 >= 0)
{
eligibleOptions[<recentIndex>5__4].UpdateLabel(CurrentVotes.Values, OwnVoteLevel);
}
<>2__current = (object)new WaitForSeconds(<delay>5__1);
<>1__state = 1;
return true;
}
goto IL_0152;
IL_0152:
eligibleOptions[<recentIndex>5__4].UpdateLabel(CurrentVotes.Values, OwnVoteLevel);
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <StartCountdown>d__45 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
private string <format>5__1;
private NumberFormatInfo <nfi>5__2;
private string <map>5__3;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <StartCountdown>d__45(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<format>5__1 = null;
<nfi>5__2 = null;
<map>5__3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_016b: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
if (SemiFunc.IsMasterClientOrSingleplayer())
{
VotingTimeLeft = VotingTime.Value;
NetworkedEvent? onStartCountdown = OnStartCountdown;
if (onStartCountdown != null)
{
onStartCountdown.RaiseEvent((object)VotingTimeLeft, NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
}
}
<format>5__1 = "00.00";
<nfi>5__2 = new NumberFormatInfo
{
NumberDecimalSeparator = ":"
};
break;
case 1:
<>1__state = -1;
break;
}
if (VotingTimeLeft > 0f)
{
VotingTimeLeft -= Time.deltaTime;
if ((Object)(object)VotingTimeLabel != (Object)null)
{
((TMP_Text)VotingTimeLabel.labelTMP).text = "<mspace=0.5em>" + VotingTimeLeft.ToString(<format>5__1, <nfi>5__2) + "</mspace> Seconds Left";
}
<>2__current = null;
<>1__state = 1;
return true;
}
if ((Object)(object)VotingTimeLabel != (Object)null && (Object)(object)((Component)VotingTimeLabel).gameObject != (Object)null)
{
Object.Destroy((Object)(object)((Component)VotingTimeLabel).gameObject);
}
if (SemiFunc.IsMasterClientOrSingleplayer())
{
<map>5__3 = GetWinningMap();
NetworkedEvent? onVoteEndedEvent = OnVoteEndedEvent;
if (onVoteEndedEvent != null)
{
onVoteEndedEvent.RaiseEvent((object)<map>5__3, NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
}
((MonoBehaviour)Instance).StartCoroutine(OnVotingDone(<map>5__3));
<map>5__3 = null;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <WaitForVote>d__44 : IEnumerator<object>, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <WaitForVote>d__44(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
break;
case 1:
<>1__state = -1;
break;
}
if (CurrentVotes.Values.Count <= 0)
{
UpdateButtonLabels();
<>2__current = (object)new WaitForSeconds(0.5f);
<>1__state = 1;
return true;
}
if (!SemiFunc.IsMasterClientOrSingleplayer())
{
return false;
}
((MonoBehaviour)Instance).StartCoroutine(StartCountdown());
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private const string MOD_GUID = "Patrick.MapVote";
private const string MOD_NAME = "MapVote";
private const string MOD_VERSION = "1.0.1";
public const string VOTE_RANDOM_LABEL = "Random";
public const string TRUCK_LEVEL_NAME = "Level - Lobby";
public const string REQUEST_VOTE_LEVEL = "Level - Lobby";
public const bool IS_DEBUG = false;
public static bool HideInMenu = false;
internal static readonly ManualLogSource Logger = Logger.CreateLogSource("MapVote");
public static NetworkedEvent? OnVoteEvent;
public static NetworkedEvent? OnVoteEndedEvent;
public static NetworkedEvent? OnSyncVotes;
public static NetworkedEvent? OnStartCountdown;
public static ConfigEntry<int> VotingTime;
public static VotesDictionary CurrentVotes = new VotesDictionary();
public static readonly List<VoteOptionButton> VoteOptionButtons = new List<VoteOptionButton>();
public static string? OwnVoteLevel;
public static string? WonMap;
public static REPOPopupPage? VotePopup;
public static float VotingTimeLeft = 0f;
public static REPOLabel? VotingTimeLabel;
public static bool DisableInput = false;
public static bool ShouldHookRunMangerSetRunLevel = false;
public static MapVote Instance;
private static Hook RunManagerSetRunLevelHook = new Hook((MethodBase)AccessTools.DeclaredMethod(typeof(RunManager), "SetRunLevel", (Type[])null, (Type[])null), (Delegate)new Action<Action<RunManager>, RunManager>(HookRunManagerSetRunLevel));
private static int ButtonStartHookRunAmount = 0;
private static Hook ButtonStartHook = new Hook((MethodBase)AccessTools.DeclaredMethod(typeof(MenuPageLobby), "ButtonStart", (Type[])null, (Type[])null), (Delegate)new Action<Action<MenuPageLobby>, MenuPageLobby>(HookButtonStart));
internal Harmony? Harmony { get; set; }
private static void HookRunManagerSetRunLevel(Action<RunManager> orig, RunManager self)
{
if (SemiFunc.IsMasterClientOrSingleplayer() && ShouldHookRunMangerSetRunLevel)
{
self.levelCurrent = self.levels.Find((Level x) => ((Object)x).name == WonMap);
ShouldHookRunMangerSetRunLevel = false;
Reset();
WonMap = null;
}
else
{
orig(self);
}
}
private static void HookButtonStart(Action<MenuPageLobby> orig, MenuPageLobby self)
{
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
if (DisableInput)
{
return;
}
if (ButtonStartHookRunAmount > 0 || HideInMenu)
{
ButtonStartHookRunAmount = 0;
orig(self);
return;
}
ButtonStartHookRunAmount++;
string winningMap = GetWinningMap();
NetworkedEvent? onVoteEndedEvent = OnVoteEndedEvent;
if (onVoteEndedEvent != null)
{
onVoteEndedEvent.RaiseEvent((object)winningMap, NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
}
((MonoBehaviour)Instance).StartCoroutine(OnVotingDone(winningMap));
}
public void Awake()
{
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Expected O, but got Unknown
Instance = this;
((Component)this).gameObject.transform.parent = null;
((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
Patch();
VotingTime = ((BaseUnityPlugin)this).Config.Bind<int>("General", "Voting Time", 10, new ConfigDescription("The amount of seconds until the voting ends, after the first player voted.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(3, 30), Array.Empty<object>()));
CompatibilityPatches.RunPatches(Chainloader.PluginInfos.Select((KeyValuePair<string, PluginInfo> x) => x.Key).ToList());
Initialize();
}
internal void Patch()
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Expected O, but got Unknown
//IL_0027: Expected O, but got Unknown
try
{
if (Harmony == null)
{
Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID);
Harmony val2 = val;
Harmony = val;
}
Harmony.PatchAll();
Logger.LogDebug((object)"Loaded MapVote!");
}
catch (Exception ex)
{
Logger.LogError((object)ex);
}
}
internal void Unpatch()
{
Harmony? harmony = Harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
internal static void Initialize()
{
//IL_0021: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Expected O, but got Unknown
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Expected O, but got Unknown
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Expected O, but got Unknown
//IL_009f: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Expected O, but got Unknown
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
//IL_00d5: Expected O, but got Unknown
OnVoteEvent = new NetworkedEvent("OnVoteEvent", (Action<EventData>)HandleOnVoteEvent);
OnVoteEndedEvent = new NetworkedEvent("OnVoteEndedEvent", (Action<EventData>)HandleOnVoteEndEvent);
OnSyncVotes = new NetworkedEvent("OnSyncVotes", (Action<EventData>)HandleOnSyncVotes);
OnStartCountdown = new NetworkedEvent("OnStartCountdown", (Action<EventData>)HandleOnStartCountdown);
if (HideInMenu)
{
return;
}
object obj = <>c.<>9__36_0;
if (obj == null)
{
BuilderDelegate val = delegate(Transform parent)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
MenuAPI.CreateREPOButton("Map Vote", (Action)delegate
{
CreateVotePopup(isInMenu: true);
}, parent, new Vector2(175.2f, 62.8f));
};
<>c.<>9__36_0 = val;
obj = (object)val;
}
MenuAPI.AddElementToLobbyMenu((BuilderDelegate)obj);
}
public static void Reset()
{
CurrentVotes.Values.Clear();
VoteOptionButtons.Clear();
OwnVoteLevel = null;
UpdateButtonLabels();
}
private static void HandleOnStartCountdown(EventData data)
{
if (!SemiFunc.IsMasterClient())
{
float votingTimeLeft = (float)data.CustomData;
VotingTimeLeft = votingTimeLeft;
((MonoBehaviour)Instance).StartCoroutine(StartCountdown());
}
}
private static void HandleOnSyncVotes(EventData data)
{
if (SemiFunc.IsMasterClient())
{
UpdateButtonLabels();
return;
}
Dictionary<int, string> dictionary = (Dictionary<int, string>)data.CustomData;
if (dictionary != null)
{
Reset();
WonMap = null;
LinqExtensions.ForEach<KeyValuePair<int, string>>((IEnumerable<KeyValuePair<int, string>>)dictionary, (Action<KeyValuePair<int, string>>)delegate(KeyValuePair<int, string> x)
{
CurrentVotes[x.Key] = x.Value;
});
UpdateButtonLabels();
}
}
private static void HandleOnVoteEvent(EventData data)
{
string value = (string)data.CustomData;
CurrentVotes[data.sender] = value;
}
private static void HandleOnVoteEndEvent(EventData data)
{
string winningMap = (string)data.CustomData;
((MonoBehaviour)Instance).StartCoroutine(OnVotingDone(winningMap));
}
public static List<VoteOptionButton> GetSortedVoteOptions()
{
return (from b in VoteOptionButtons
select new
{
Item = b,
Count = b.GetVotes(CurrentVotes.Values)
} into b
orderby b.Count descending
select b.Item).ToList();
}
public static void CreateNextMapLabel(string mapName)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
REPOLabel val = MenuAPI.CreateREPOLabel((string)null, GameObject.Find("Game Hud").transform, new Vector2(-100f, 110f));
((TMP_Text)val.labelTMP).horizontalAlignment = (HorizontalAlignmentOptions)2;
((TMP_Text)val.labelTMP).text = "Next Map: <color=" + LevelColorDictionary.GetColor(mapName) + "><size=32>" + Utilities.RemoveLevelPrefix(mapName) + "</size></color>";
}
[IteratorStateMachine(typeof(<WaitForVote>d__44))]
public static IEnumerator WaitForVote()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <WaitForVote>d__44(0);
}
[IteratorStateMachine(typeof(<StartCountdown>d__45))]
public static IEnumerator StartCountdown()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <StartCountdown>d__45(0);
}
public static void CreateVotePopup(bool isInMenu = false)
{
//IL_009d: Unknown result type (might be due to invalid IL or missing references)
//IL_008c: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Expected O, but got Unknown
//IL_0190: Unknown result type (might be due to invalid IL or missing references)
//IL_019a: Expected O, but got Unknown
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
//IL_016e: Unknown result type (might be due to invalid IL or missing references)
//IL_0174: Expected O, but got Unknown
MenuAPI.CloseAllPagesAddedOnTop();
VoteOptionButtons.Clear();
if ((Object)(object)VotePopup != (Object)null)
{
VotePopup.ClosePage(true);
VotePopup = null;
}
if (((Object)RunManager.instance.levelCurrent).name == "Level - Lobby")
{
GameDirector.instance.DisableInput = true;
}
VotePopup = MenuAPI.CreateREPOPopupPage("Next map", true, false, 0f, (Vector2?)(isInMenu ? new Vector2(40f, 0f) : new Vector2(-100f, 0f)));
RunManager val = Object.FindObjectOfType<RunManager>();
List<Level> levels = val.levels;
foreach (var item in levels.Select((Level level, int index) => (level, index)))
{
var (level2, num) = item;
VotePopup.AddElementToScrollView((ScrollViewBuilderDelegate)delegate(Transform parent)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
REPOButton val4 = MenuAPI.CreateREPOButton((string)null, (Action)delegate
{
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
if (!DisableInput)
{
OwnVoteLevel = ((Object)level2).name;
NetworkedEvent? onVoteEvent2 = OnVoteEvent;
if (onVoteEvent2 != null)
{
onVoteEvent2.RaiseEvent((object)((Object)level2).name, NetworkingEvents.RaiseAll, SendOptions.SendReliable);
}
}
}, parent, default(Vector2));
VoteOptionButtons.Add(new VoteOptionButton(((Object)level2).name, 0, val4));
return ((REPOElement)val4).rectTransform;
}, 0f, 0f);
}
REPOPopupPage? votePopup = VotePopup;
object obj = <>c.<>9__46_0;
if (obj == null)
{
ScrollViewBuilderDelegate val2 = delegate(Transform parent)
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
REPOButton val3 = MenuAPI.CreateREPOButton((string)null, (Action)delegate
{
//IL_002c: Unknown result type (might be due to invalid IL or missing references)
if (!DisableInput)
{
OwnVoteLevel = "Random";
NetworkedEvent? onVoteEvent = OnVoteEvent;
if (onVoteEvent != null)
{
onVoteEvent.RaiseEvent((object)"Random", NetworkingEvents.RaiseAll, SendOptions.SendReliable);
}
}
}, parent, default(Vector2));
VoteOptionButtons.Add(new VoteOptionButton("Random", 0, val3, _isRandomButton: true));
return ((REPOElement)val3).rectTransform;
};
<>c.<>9__46_0 = val2;
obj = (object)val2;
}
votePopup.AddElementToScrollView((ScrollViewBuilderDelegate)obj, 0f, 0f);
VotePopup.AddElement((BuilderDelegate)delegate(Transform parent)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
VotingTimeLabel = MenuAPI.CreateREPOLabel((string)null, parent, new Vector2(isInMenu ? 394f : 254f, 30f));
});
VotePopup.OpenPage(true);
UpdateButtonLabels();
((Component)VotePopup).GetComponent<MenuPage>().PageStateSet((PageState)1);
}
public static void UpdateButtonLabels()
{
VoteOptionButtons.ForEach(delegate(VoteOptionButton b)
{
b.UpdateLabel(CurrentVotes.Values, OwnVoteLevel);
});
}
public static List<VoteOptionButton> GetEligibleOptions()
{
if (CurrentVotes.Values.Count == 0)
{
return new List<VoteOptionButton>();
}
List<VoteOptionButton> list = new List<VoteOptionButton>();
List<VoteOptionButton> sortedVoteOptions = GetSortedVoteOptions();
List<VoteOptionButton> list2 = (from x in sortedVoteOptions
group x by x.GetVotes(CurrentVotes.Values) into x
orderby x.Key descending
select x).FirstOrDefault().ToList();
list = ((list2.Find((VoteOptionButton x) => x.Level == "Random") == null) ? (list2 ?? list) : VoteOptionButtons);
return list.FindAll((VoteOptionButton x) => !x.IsRandomButton);
}
public static string GetWinningMap()
{
List<VoteOptionButton> eligibleOptions = GetEligibleOptions();
int index = Random.RandomRangeInt(0, eligibleOptions.Count);
return eligibleOptions[index].Level;
}
[IteratorStateMachine(typeof(<OnVotingDone>d__50))]
public static IEnumerator OnVotingDone(string winningMap)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <OnVotingDone>d__50(0)
{
winningMap = winningMap
};
}
[IteratorStateMachine(typeof(<BlinkButton>d__51))]
public static IEnumerator BlinkButton(VoteOptionButton voteOption)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <BlinkButton>d__51(0)
{
voteOption = voteOption
};
}
[IteratorStateMachine(typeof(<SpinWheelOptions>d__52))]
public static IEnumerator SpinWheelOptions(List<VoteOptionButton> eligibleOptions, int winningIndex)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <SpinWheelOptions>d__52(0)
{
eligibleOptions = eligibleOptions,
winningIndex = winningIndex
};
}
}
internal sealed class Utilities
{
public static string ColorString(string text, string colorHex)
{
return "<color=#" + colorHex + ">" + text + "</color>";
}
public static string ColorString(string text, Color color)
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
return "<color=#" + XColor.ToHexString(color) + ">" + text + "</color>";
}
public static string RemoveLevelPrefix(string text)
{
return text.Replace("Level - ", "");
}
}
internal sealed class VoteOptionButton
{
public string Level { get; set; }
public REPOButton Button { get; set; }
public bool IsRandomButton { get; set; }
public VoteOptionButton(string _level, int _votes, REPOButton _button, bool _isRandomButton = false)
{
Level = _level;
Button = _button;
IsRandomButton = _isRandomButton;
}
public int GetVotes(Dictionary<int, string> votes)
{
int num = 0;
foreach (KeyValuePair<int, string> vote in votes)
{
if (vote.Value == Level)
{
num++;
}
}
return num;
}
public void UpdateLabel(Dictionary<int, string> votes, string? _ownVote, bool _highlight = false)
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: 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_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00ba: Unknown result type (might be due to invalid IL or missing references)
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
int num = Math.Min(GameDirector.instance.PlayerList.Count, 12);
int votes2 = GetVotes(votes);
Color color = (_highlight ? Color.green : ((_ownVote == Level) ? Color.yellow : Color.white));
((TMP_Text)Button.labelTMP).text = Utilities.ColorString("Vote for <color=" + LevelColorDictionary.GetColor(Level) + ">" + (IsRandomButton ? "Random" : Utilities.RemoveLevelPrefix(Level)) + "</color>\t " + Utilities.ColorString(new string('I', votes2), Color.green) + Utilities.ColorString(new string('I', num - votes2), Color.gray), color) ?? "";
}
}
public class VotesDictionary
{
public readonly Dictionary<int, string> Values = new Dictionary<int, string>();
public string this[int key]
{
get
{
return Values[key];
}
set
{
Values[key] = value;
MapVote.UpdateButtonLabels();
}
}
}
}
namespace MapVote.Patches
{
[HarmonyPatch(typeof(HealthUI))]
public class HealthUIPatch
{
[HarmonyPatch("Start")]
[HarmonyPostfix]
private static void PostfixStart(HealthUI __instance)
{
if (((Object)RunManager.instance.levelCurrent).name == "Level - Lobby")
{
((MonoBehaviour)MapVote.Instance).StartCoroutine(MapVote.WaitForVote());
MapVote.CreateVotePopup();
}
}
}
[HarmonyPatch(typeof(MenuManager))]
internal class MenuManagerPatch
{
[HarmonyPatch("PageOpen")]
[HarmonyPostfix]
private static void PageOpenPostfix(MenuPageIndex menuPageIndex)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
if ((int)menuPageIndex == 8)
{
if (SemiFunc.IsMasterClientOrSingleplayer())
{
MapVote.Reset();
MapVote.WonMap = null;
}
if (!MapVote.HideInMenu)
{
MapVote.CreateVotePopup(isInMenu: true);
}
bool flag = false;
}
}
}
[HarmonyPatch(typeof(MenuPageLobby))]
internal class SteamManagerPatch
{
[HarmonyPatch("PlayerAdd")]
[HarmonyPostfix]
public static void PostfixJoiningPlayer()
{
//IL_0025: Unknown result type (might be due to invalid IL or missing references)
if (SemiFunc.IsMasterClient())
{
NetworkedEvent? onSyncVotes = MapVote.OnSyncVotes;
if (onSyncVotes != null)
{
onSyncVotes.RaiseEvent((object)MapVote.CurrentVotes.Values, NetworkingEvents.RaiseAll, SendOptions.SendReliable);
}
}
}
}
}