using System;
using System.Collections;
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 ExitGames.Client.Photon;
using HarmonyLib;
using MapVote;
using MapVoteWithPreview.Preview;
using MenuLib.MonoBehaviors;
using Microsoft.CodeAnalysis;
using MonoMod.RuntimeDetour;
using Photon.Pun;
using REPOLib.Modules;
using TMPro;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.PostProcessing;
using UnityEngine.SceneManagement;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[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("Discord.Sdk")]
[assembly: IgnoresAccessChecksTo("Domain_Reload")]
[assembly: IgnoresAccessChecksTo("Facepunch.Steamworks.Win64")]
[assembly: IgnoresAccessChecksTo("FbxBuildTestAssets")]
[assembly: IgnoresAccessChecksTo("Klattersynth")]
[assembly: IgnoresAccessChecksTo("Patrick.MapVote")]
[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.Burst")]
[assembly: IgnoresAccessChecksTo("Unity.Burst.Unsafe")]
[assembly: IgnoresAccessChecksTo("Unity.Collections")]
[assembly: IgnoresAccessChecksTo("Unity.Collections.LowLevel.ILSupport")]
[assembly: IgnoresAccessChecksTo("Unity.Formats.Fbx.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem")]
[assembly: IgnoresAccessChecksTo("Unity.InputSystem.ForUI")]
[assembly: IgnoresAccessChecksTo("Unity.Mathematics")]
[assembly: IgnoresAccessChecksTo("Unity.MemoryProfiler")]
[assembly: IgnoresAccessChecksTo("Unity.Postprocessing.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.Profiling.Core")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.Runtime")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.Core.ShaderLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.RenderPipelines.ShaderGraph.ShaderGraphLibrary")]
[assembly: IgnoresAccessChecksTo("Unity.Splines")]
[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("MapVoteWithPreview")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("0.0.2.0")]
[assembly: AssemblyInformationalVersion("0.0.2+c867a109f2645d317723cb3164d568b519d19519")]
[assembly: AssemblyProduct("MapVoteWithPreview")]
[assembly: AssemblyTitle("MapVoteWithPreview")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.0.2.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 MapVoteWithPreview
{
[BepInPlugin("MARCROCK22.MapVoteWithPreview", "MapVoteWithPreview", "0.0.2")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class Plugin : BaseUnityPlugin
{
[HarmonyPatch(typeof(MapVote))]
internal static class CreateVotePopupPatch
{
[HarmonyPatch("CreateVotePopup")]
[HarmonyPostfix]
private static void Postfix()
{
if (!PreviewEnabled.Value)
{
return;
}
foreach (VoteOptionButton voteOptionButton in MapVote.VoteOptionButtons)
{
if (voteOptionButton.IsRandomButton)
{
continue;
}
REPOButton button = voteOptionButton.Button;
string levelName = voteOptionButton.Level;
Action originalOnClick = button.onClick;
button.onClick = delegate
{
if (!MapVote.DisableInput)
{
if (Input.GetKey((KeyCode)304))
{
MapPreviewManager.StartPreview(levelName);
}
else
{
originalOnClick?.Invoke();
}
}
};
}
}
}
[HarmonyPatch(typeof(VoteOptionButton))]
internal static class UpdateLabelPatch
{
[HarmonyPatch("UpdateLabel")]
[HarmonyPostfix]
private static void Postfix(VoteOptionButton __instance)
{
VoteOptionButton __instance2 = __instance;
if (!__instance2.IsRandomButton && PreviewingPlayers.Values.Any((string v) => v == __instance2.Level))
{
TextMeshProUGUI labelTMP = __instance2.Button.labelTMP;
((TMP_Text)labelTMP).text = ((TMP_Text)labelTMP).text + " (previewing) ";
}
}
}
internal static ManualLogSource Log;
public static ConfigEntry PreviewEnabled;
public static ConfigEntry FreecamSpeed;
public static NetworkedEvent OnPreviewStart;
public static NetworkedEvent OnPreviewEnd;
public static Dictionary PreviewingPlayers = new Dictionary();
private readonly Harmony _harmony = new Harmony("MARCROCK22.MapVoteWithPreview");
private static Hook _setRunLevelHook;
private static Hook _buttonStartHook;
private void Awake()
{
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Expected O, but got Unknown
//IL_008b: 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_009c: 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)
//IL_00d4: Expected O, but got Unknown
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Expected O, but got Unknown
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_018c: Expected O, but got Unknown
//IL_01bd: Unknown result type (might be due to invalid IL or missing references)
//IL_01c7: Expected O, but got Unknown
Log = ((BaseUnityPlugin)this).Logger;
((Component)this).gameObject.transform.parent = null;
((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
PreviewEnabled = ((BaseUnityPlugin)this).Config.Bind("Preview", "Preview Enabled", true, "When true - enables the map preview freecam feature (Shift+Click on a map)");
FreecamSpeed = ((BaseUnityPlugin)this).Config.Bind("Preview", "Freecam Speed", 10f, new ConfigDescription("Speed of the freecam when previewing a map", (AcceptableValueBase)(object)new AcceptableValueRange(1f, 50f), Array.Empty()));
GameObject val = new GameObject("MapPreviewManager");
val.transform.parent = null;
((Object)val).hideFlags = (HideFlags)61;
val.AddComponent();
OnPreviewStart = new NetworkedEvent("MapVotePreview_Start", (Action)HandlePreviewStart);
OnPreviewEnd = new NetworkedEvent("MapVotePreview_End", (Action)HandlePreviewEnd);
try
{
_harmony.PatchAll(typeof(CreateVotePopupPatch));
_harmony.PatchAll(typeof(UpdateLabelPatch));
Log.LogInfo((object)"Harmony patches applied");
}
catch (Exception arg)
{
Log.LogError((object)$"Failed to apply Harmony patches: {arg}");
}
_setRunLevelHook = new Hook((MethodBase)AccessTools.DeclaredMethod(typeof(RunManager), "SetRunLevel", (Type[])null, (Type[])null), (Delegate)new Action, RunManager>(HookSetRunLevel));
_buttonStartHook = new Hook((MethodBase)AccessTools.DeclaredMethod(typeof(MenuPageLobby), "ButtonStart", (Type[])null, (Type[])null), (Delegate)new Action, MenuPageLobby>(HookButtonStart));
((BaseUnityPlugin)this).Logger.LogInfo((object)"MapVoteWithPreview v0.0.2 loaded!");
}
private static void HookSetRunLevel(Action orig, RunManager self)
{
MapPreviewManager.ForceClose();
orig(self);
}
private static void HookButtonStart(Action orig, MenuPageLobby self)
{
MapPreviewManager.ForceClose();
orig(self);
}
private static void HandlePreviewStart(EventData data)
{
string[] array = ((string)data.CustomData).Split('|');
if (array.Length >= 2)
{
PreviewingPlayers[array[0]] = array[1];
MapVote.UpdateButtonLabels();
}
}
private static void HandlePreviewEnd(EventData data)
{
string key = (string)data.CustomData;
PreviewingPlayers.Remove(key);
MapVote.UpdateButtonLabels();
}
}
public static class MyPluginInfo
{
public const string PLUGIN_GUID = "MapVoteWithPreview";
public const string PLUGIN_NAME = "MapVoteWithPreview";
public const string PLUGIN_VERSION = "0.0.2";
}
}
namespace MapVoteWithPreview.Preview
{
public class FreecamController : MonoBehaviour
{
private float _yaw;
private float _pitch;
private float _speed;
private PostProcessVolume _ppVolume;
private RenderTexture _renderTexture;
private Camera _camera;
public void Initialize(float speed, Vector3 startPosition)
{
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0063: Expected O, but got Unknown
//IL_0099: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
_speed = speed;
((Component)this).transform.position = startPosition;
Camera val = ((Component)this).gameObject.AddComponent();
val.nearClipPlane = 0.1f;
val.farClipPlane = 1000f;
val.fieldOfView = 75f;
val.depth = 100f;
int num = Screen.width / 3;
int num2 = Screen.height / 3;
RenderTexture val2 = new RenderTexture(num, num2, 24);
((Texture)val2).filterMode = (FilterMode)0;
val.targetTexture = val2;
_renderTexture = val2;
_camera = val;
try
{
PostProcessLayer val3 = ((Component)this).gameObject.AddComponent();
val3.volumeTrigger = ((Component)this).transform;
val3.volumeLayer = LayerMask.op_Implicit(-1);
PostProcessResources[] array = Resources.FindObjectsOfTypeAll();
if (array != null && array.Length != 0)
{
val3.Init(array[0]);
}
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)("[PREVIEW] PostProcessLayer setup failed: " + ex.Message));
}
((Component)this).gameObject.AddComponent();
_yaw = ((Component)this).transform.eulerAngles.y;
_pitch = ((Component)this).transform.eulerAngles.x;
Cursor.lockState = (CursorLockMode)0;
Cursor.visible = true;
}
public void ApplyLevelEffects(Level level)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Expected O, but got Unknown
//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_013e: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_02f3: Unknown result type (might be due to invalid IL or missing references)
GameObject val = new GameObject("PreviewPostProcess");
((Object)val).hideFlags = (HideFlags)61;
val.transform.SetParent(((Component)this).transform, false);
_ppVolume = val.AddComponent();
_ppVolume.isGlobal = true;
_ppVolume.priority = 100f;
PostProcessProfile val2 = ScriptableObject.CreateInstance();
Bloom val3 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val3).enabled).value = true;
((ParameterOverride)val3.intensity).overrideState = true;
((ParameterOverride)(object)val3.intensity).value = Mathf.Min(level.BloomIntensity * 0.3f, 3f);
((ParameterOverride)val3.threshold).overrideState = true;
((ParameterOverride)(object)val3.threshold).value = Mathf.Max(level.BloomThreshold, 1f);
val2.AddSettings((PostProcessEffectSettings)(object)val3);
ColorGrading val4 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val4).enabled).value = true;
((ParameterOverride)val4.colorFilter).overrideState = true;
((ParameterOverride)(object)val4.colorFilter).value = level.ColorFilter;
((ParameterOverride)val4.temperature).overrideState = true;
((ParameterOverride)(object)val4.temperature).value = level.ColorTemperature;
val2.AddSettings((PostProcessEffectSettings)(object)val4);
Vignette val5 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val5).enabled).value = true;
((ParameterOverride)val5.color).overrideState = true;
((ParameterOverride)(object)val5.color).value = level.VignetteColor;
((ParameterOverride)val5.intensity).overrideState = true;
((ParameterOverride)(object)val5.intensity).value = level.VignetteIntensity;
((ParameterOverride)val5.smoothness).overrideState = true;
((ParameterOverride)(object)val5.smoothness).value = level.VignetteSmoothness;
val2.AddSettings((PostProcessEffectSettings)(object)val5);
ChromaticAberration val6 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val6).enabled).value = true;
((ParameterOverride)val6.intensity).overrideState = true;
((ParameterOverride)(object)val6.intensity).value = 0.15f;
val2.AddSettings((PostProcessEffectSettings)(object)val6);
Grain val7 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val7).enabled).value = true;
((ParameterOverride)val7.intensity).overrideState = true;
((ParameterOverride)(object)val7.intensity).value = 0.3f;
((ParameterOverride)val7.size).overrideState = true;
((ParameterOverride)(object)val7.size).value = 1.2f;
val2.AddSettings((PostProcessEffectSettings)(object)val7);
MotionBlur val8 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val8).enabled).value = true;
((ParameterOverride)val8.shutterAngle).overrideState = true;
((ParameterOverride)(object)val8.shutterAngle).value = 150f;
((ParameterOverride)val8.sampleCount).overrideState = true;
((ParameterOverride)(object)val8.sampleCount).value = 8;
val2.AddSettings((PostProcessEffectSettings)(object)val8);
AutoExposure val9 = ScriptableObject.CreateInstance();
((ParameterOverride)(object)((PostProcessEffectSettings)val9).enabled).value = true;
((ParameterOverride)val9.minLuminance).overrideState = true;
((ParameterOverride)(object)val9.minLuminance).value = -2f;
((ParameterOverride)val9.maxLuminance).overrideState = true;
((ParameterOverride)(object)val9.maxLuminance).value = 2f;
val2.AddSettings((PostProcessEffectSettings)(object)val9);
_ppVolume.profile = val2;
Plugin.Log.LogInfo((object)$"[PREVIEW] Applied post-processing: bloom={level.BloomIntensity}, colorFilter={level.ColorFilter}, vignette={level.VignetteIntensity}, +chromaticAberration, grain, motionBlur, autoExposure");
}
private void Update()
{
//IL_0083: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Unknown result type (might be due to invalid IL or missing references)
//IL_00c5: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Unknown result type (might be due to invalid IL or missing references)
//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Unknown result type (might be due to invalid IL or missing references)
//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
//IL_0102: Unknown result type (might be due to invalid IL or missing references)
//IL_0107: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Unknown result type (might be due to invalid IL or missing references)
//IL_0116: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: 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_0127: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_015c: Unknown result type (might be due to invalid IL or missing references)
//IL_0163: Unknown result type (might be due to invalid IL or missing references)
//IL_0169: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Unknown result type (might be due to invalid IL or missing references)
//IL_014f: Unknown result type (might be due to invalid IL or missing references)
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetMouseButton(1))
{
Cursor.lockState = (CursorLockMode)1;
Cursor.visible = false;
_yaw += Input.GetAxis("Mouse X") * 3f;
_pitch -= Input.GetAxis("Mouse Y") * 3f;
_pitch = Mathf.Clamp(_pitch, -90f, 90f);
((Component)this).transform.rotation = Quaternion.Euler(_pitch, _yaw, 0f);
}
else
{
Cursor.lockState = (CursorLockMode)0;
Cursor.visible = true;
}
float num = _speed;
if (Input.GetKey((KeyCode)304))
{
num *= 3f;
}
Vector3 val = Vector3.zero;
if (Input.GetKey((KeyCode)119))
{
val += ((Component)this).transform.forward;
}
if (Input.GetKey((KeyCode)115))
{
val -= ((Component)this).transform.forward;
}
if (Input.GetKey((KeyCode)97))
{
val -= ((Component)this).transform.right;
}
if (Input.GetKey((KeyCode)100))
{
val += ((Component)this).transform.right;
}
if (Input.GetKey((KeyCode)32))
{
val += Vector3.up;
}
if (Input.GetKey((KeyCode)306))
{
val -= Vector3.up;
}
Transform transform = ((Component)this).transform;
transform.position += ((Vector3)(ref val)).normalized * num * Time.deltaTime;
}
private void OnGUI()
{
//IL_0013: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Invalid comparison between Unknown and I4
//IL_0031: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)_renderTexture != (Object)null && (int)Event.current.type == 7)
{
GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)_renderTexture, (ScaleMode)0);
}
}
private void OnDestroy()
{
Cursor.lockState = (CursorLockMode)0;
Cursor.visible = true;
if ((Object)(object)_ppVolume != (Object)null && (Object)(object)_ppVolume.profile != (Object)null)
{
Object.Destroy((Object)(object)_ppVolume.profile);
}
if ((Object)(object)_renderTexture != (Object)null)
{
if ((Object)(object)_camera != (Object)null)
{
_camera.targetTexture = null;
}
Object.Destroy((Object)(object)_renderTexture);
}
}
}
public enum PreviewState
{
Idle,
Loading,
Previewing,
Unloading
}
public class MapPreviewManager : MonoBehaviour
{
private class PreviewTile
{
public int x;
public int y;
public bool active;
public bool first;
public Type type;
public bool connectedTop;
public bool connectedBot;
public bool connectedRight;
public bool connectedLeft;
public int connections;
}
[CompilerGenerated]
private sealed class <>c__DisplayClass31_0
{
public string levelName;
internal bool b__0(Level l)
{
return ((Object)l).name == levelName;
}
}
[CompilerGenerated]
private sealed class d__35 : IEnumerator, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public Level level;
private Vector3 5__2;
private List 5__3;
private int 5__4;
private int 5__5;
private int 5__6;
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public d__35(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
5__3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_022d: Unknown result type (might be due to invalid IL or missing references)
//IL_0249: Unknown result type (might be due to invalid IL or missing references)
//IL_024e: Unknown result type (might be due to invalid IL or missing references)
//IL_0253: Unknown result type (might be due to invalid IL or missing references)
//IL_0266: Unknown result type (might be due to invalid IL or missing references)
//IL_0268: Unknown result type (might be due to invalid IL or missing references)
int num = <>1__state;
if (num != 0)
{
if (num != 1)
{
return false;
}
<>1__state = -1;
goto IL_02a3;
}
<>1__state = -1;
5__2 = new Vector3(0f, -3000f, 0f);
_previewRoot = new GameObject("MapPreviewRoot");
_previewRoot.transform.position = 5__2;
5__3 = new List();
if (level.StartRooms != null)
{
foreach (PrefabRef startRoom in level.StartRooms)
{
if (startRoom != null)
{
GameObject prefab = startRoom.Prefab;
if ((Object)(object)prefab != (Object)null)
{
5__3.Add(prefab);
}
}
}
}
AddPrefabRefs(5__3, level.ModulesNormal1);
AddPrefabRefs(5__3, level.ModulesNormal2);
AddPrefabRefs(5__3, level.ModulesNormal3);
AddPrefabRefs(5__3, level.ModulesPassage1);
AddPrefabRefs(5__3, level.ModulesPassage2);
AddPrefabRefs(5__3, level.ModulesPassage3);
AddPrefabRefs(5__3, level.ModulesDeadEnd1);
AddPrefabRefs(5__3, level.ModulesDeadEnd2);
AddPrefabRefs(5__3, level.ModulesDeadEnd3);
AddPrefabRefs(5__3, level.ModulesExtraction1);
AddPrefabRefs(5__3, level.ModulesExtraction2);
AddPrefabRefs(5__3, level.ModulesExtraction3);
if (5__3.Count == 0)
{
return false;
}
5__4 = 5__3.Count;
5__5 = Mathf.CeilToInt(Mathf.Sqrt((float)5__4));
5__6 = 0;
goto IL_02b5;
IL_02b5:
if (5__6 < 5__4)
{
int num2 = 5__6 / 5__5;
int num3 = 5__6 % 5__5;
Vector3 val = 5__2 + new Vector3((float)num3 * 15f, 0f, (float)num2 * 15f);
StripComponents(Object.Instantiate(5__3[5__6], val, Quaternion.identity, _previewRoot.transform));
if (5__6 % 3 == 2)
{
<>2__current = null;
<>1__state = 1;
return true;
}
goto IL_02a3;
}
return false;
IL_02a3:
5__6++;
goto IL_02b5;
}
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 d__31 : IEnumerator, IEnumerator, IDisposable
{
private int <>1__state;
private object <>2__current;
public string levelName;
private <>c__DisplayClass31_0 <>8__1;
private RunManager 5__2;
private Level 5__3;
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public d__31(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>8__1 = null;
5__2 = null;
5__3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0178: Unknown result type (might be due to invalid IL or missing references)
//IL_017d: Unknown result type (might be due to invalid IL or missing references)
//IL_0196: Unknown result type (might be due to invalid IL or missing references)
//IL_019b: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
//IL_021f: Unknown result type (might be due to invalid IL or missing references)
//IL_026e: Unknown result type (might be due to invalid IL or missing references)
//IL_02b5: Unknown result type (might be due to invalid IL or missing references)
//IL_02c9: Unknown result type (might be due to invalid IL or missing references)
//IL_02ce: Unknown result type (might be due to invalid IL or missing references)
//IL_02a4: Unknown result type (might be due to invalid IL or missing references)
//IL_02d3: Unknown result type (might be due to invalid IL or missing references)
//IL_02d9: Unknown result type (might be due to invalid IL or missing references)
//IL_02de: Unknown result type (might be due to invalid IL or missing references)
//IL_02ff: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>8__1 = new <>c__DisplayClass31_0();
<>8__1.levelName = levelName;
State = PreviewState.Loading;
Plugin.Log.LogInfo((object)("[PREVIEW] Building preview for: " + <>8__1.levelName));
5__2 = Object.FindObjectOfType();
if ((Object)(object)5__2 == (Object)null)
{
Plugin.Log.LogError((object)"[PREVIEW] RunManager not found");
State = PreviewState.Idle;
return false;
}
5__3 = 5__2.levels.Find((Level l) => ((Object)l).name == <>8__1.levelName);
if ((Object)(object)5__3 == (Object)null)
{
Plugin.Log.LogError((object)("[PREVIEW] Level '" + <>8__1.levelName + "' not found"));
State = PreviewState.Idle;
return false;
}
if ((Object)(object)MapVote.VotePopup != (Object)null)
{
MapVote.VotePopup.ClosePage(true);
}
_loadingLevelName = <>8__1.levelName.Replace("Level - ", "");
_showLoadingScreen = true;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<>2__current = null;
<>1__state = 2;
return true;
case 2:
{
<>1__state = -1;
LevelGenerator levelGen = Object.FindObjectOfType();
DisableLobby();
_savedFog = RenderSettings.fog;
_savedFogColor = RenderSettings.fogColor;
_savedFogStart = RenderSettings.fogStartDistance;
_savedFogEnd = RenderSettings.fogEndDistance;
_savedFogMode = RenderSettings.fogMode;
_savedAmbientLight = RenderSettings.ambientLight;
bool flag = false;
try
{
flag = TryProceduralGeneration(5__2, 5__3, levelGen);
}
catch (Exception ex)
{
Plugin.Log.LogWarning((object)("[PREVIEW] Procedural generation failed: " + ex.Message + ", falling back to grid"));
}
if (!flag)
{
<>2__current = ((MonoBehaviour)Instance).StartCoroutine(BuildGridPreview(5__3));
<>1__state = 3;
return true;
}
break;
}
case 3:
<>1__state = -1;
break;
}
RenderSettings.fog = true;
RenderSettings.fogColor = 5__3.FogColor;
RenderSettings.fogMode = (FogMode)1;
RenderSettings.fogStartDistance = 5__3.FogStartDistance;
RenderSettings.fogEndDistance = ((5__3.FogEndDistance > 0f) ? 5__3.FogEndDistance : 15f);
RenderSettings.ambientLight = 5__3.AmbientColor;
RenderSettings.ambientIntensity = 1f;
RenderSettings.ambientMode = (AmbientMode)3;
Vector3 startPosition = (Vector3)(((Object)(object)_previewRoot != (Object)null) ? (_previewRoot.transform.position + new Vector3(15f, 8f, 15f)) : new Vector3(0f, 5f, 0f));
_freecam = new GameObject("MapPreviewFreecam")
{
hideFlags = (HideFlags)61
}.AddComponent();
_freecam.Initialize(Plugin.FreecamSpeed.Value, startPosition);
_freecam.ApplyLevelEffects(5__3);
_showLoadingScreen = false;
BroadcastPreviewStart(<>8__1.levelName);
State = PreviewState.Previewing;
Plugin.Log.LogInfo((object)("[PREVIEW] Now previewing: " + <>8__1.levelName));
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 static string _previewLevelName;
private static FreecamController _freecam;
private static GameObject _previewRoot;
private static List _disabledRootObjects = new List();
private static bool _cancelRequested;
private static bool _savedFog;
private static Color _savedFogColor;
private static float _savedFogStart;
private static float _savedFogEnd;
private static FogMode _savedFogMode;
private static Color _savedAmbientLight;
private const float MODULE_SPACING = 15f;
private static bool _showLoadingScreen;
private static string _loadingLevelName;
private static Texture2D _blackTex;
private static Level _savedLevel;
private static readonly HashSet KEEP_ACTIVE = new HashSet
{
"MapPreviewRoot", "MapPreviewFreecam", "MapVotePreview", "MapVoteWithPreview", "REPOPingMod", "BepInEx_Manager", "PhotonMono", "PunVoiceClient(Clone)", "NetworkManager", "Steam Manager",
"PhotonHandler"
};
public static MapPreviewManager Instance { get; private set; }
public static PreviewState State { get; private set; } = PreviewState.Idle;
private void Awake()
{
if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this)
{
Object.Destroy((Object)(object)this);
}
else
{
Instance = this;
}
}
public static void StartPreview(string levelName)
{
if (State == PreviewState.Idle && Plugin.PreviewEnabled.Value && !((Object)(object)Instance == (Object)null))
{
_previewLevelName = levelName;
_cancelRequested = false;
((MonoBehaviour)Instance).StartCoroutine(BuildPreview(levelName));
}
}
public static void StopPreview()
{
if (State == PreviewState.Previewing && !((Object)(object)Instance == (Object)null))
{
CleanupPreview();
RestoreLobby();
BroadcastPreviewEnd();
MapVote.CreateVotePopup(((Object)RunManager.instance.levelCurrent).name != "Level - Lobby");
State = PreviewState.Idle;
_previewLevelName = null;
Plugin.Log.LogInfo((object)"[PREVIEW] Preview closed");
}
}
public static void ForceClose()
{
if (State != 0)
{
_cancelRequested = true;
if ((Object)(object)Instance != (Object)null)
{
((MonoBehaviour)Instance).StopAllCoroutines();
}
CleanupPreview();
RestoreLobby();
BroadcastPreviewEnd();
State = PreviewState.Idle;
_previewLevelName = null;
_cancelRequested = false;
}
}
private static void CleanupPreview()
{
_showLoadingScreen = false;
if ((Object)(object)_freecam != (Object)null)
{
Object.Destroy((Object)(object)((Component)_freecam).gameObject);
_freecam = null;
}
if ((Object)(object)_previewRoot != (Object)null)
{
Object.Destroy((Object)(object)_previewRoot);
_previewRoot = null;
}
}
public static void HandlePreviewStart(EventData data)
{
string[] array = ((string)data.CustomData).Split('|');
if (array.Length >= 2)
{
Plugin.PreviewingPlayers[array[0]] = array[1];
MapVote.UpdateButtonLabels();
}
}
public static void HandlePreviewEnd(EventData data)
{
string key = (string)data.CustomData;
Plugin.PreviewingPlayers.Remove(key);
MapVote.UpdateButtonLabels();
}
[IteratorStateMachine(typeof(d__31))]
private static IEnumerator BuildPreview(string levelName)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new d__31(0)
{
levelName = levelName
};
}
private static bool GridCheck(PreviewTile[,] grid, int x, int y, int w, int h)
{
if (x >= 0 && x < w && y >= 0 && y < h)
{
return grid[x, y].active;
}
return false;
}
private static bool TryProceduralGeneration(RunManager runManager, Level level, LevelGenerator levelGen)
{
//IL_0829: Unknown result type (might be due to invalid IL or missing references)
//IL_07cf: Unknown result type (might be due to invalid IL or missing references)
//IL_07d1: Unknown result type (might be due to invalid IL or missing references)
//IL_07e8: Unknown result type (might be due to invalid IL or missing references)
//IL_07ea: Unknown result type (might be due to invalid IL or missing references)
//IL_08a6: Unknown result type (might be due to invalid IL or missing references)
//IL_08c6: Unknown result type (might be due to invalid IL or missing references)
//IL_08cb: Unknown result type (might be due to invalid IL or missing references)
//IL_08d0: Unknown result type (might be due to invalid IL or missing references)
//IL_08d2: Unknown result type (might be due to invalid IL or missing references)
//IL_08d7: Unknown result type (might be due to invalid IL or missing references)
//IL_08e7: Unknown result type (might be due to invalid IL or missing references)
//IL_08ed: Invalid comparison between Unknown and I4
//IL_09b2: Unknown result type (might be due to invalid IL or missing references)
//IL_09b8: Invalid comparison between Unknown and I4
//IL_0923: Unknown result type (might be due to invalid IL or missing references)
//IL_0928: Unknown result type (might be due to invalid IL or missing references)
//IL_09ee: Unknown result type (might be due to invalid IL or missing references)
//IL_09f3: Unknown result type (might be due to invalid IL or missing references)
//IL_05ea: Unknown result type (might be due to invalid IL or missing references)
//IL_05f4: Expected O, but got Unknown
//IL_05fe: Unknown result type (might be due to invalid IL or missing references)
//IL_0c90: Unknown result type (might be due to invalid IL or missing references)
//IL_0c9d: Unknown result type (might be due to invalid IL or missing references)
//IL_0c9f: Unknown result type (might be due to invalid IL or missing references)
//IL_0ca1: Unknown result type (might be due to invalid IL or missing references)
//IL_0cae: Unknown result type (might be due to invalid IL or missing references)
//IL_0ccc: Unknown result type (might be due to invalid IL or missing references)
//IL_0cce: Unknown result type (might be due to invalid IL or missing references)
//IL_0cd0: Unknown result type (might be due to invalid IL or missing references)
//IL_04bb: Unknown result type (might be due to invalid IL or missing references)
//IL_0e82: Unknown result type (might be due to invalid IL or missing references)
//IL_0e95: Unknown result type (might be due to invalid IL or missing references)
//IL_0e9a: Unknown result type (might be due to invalid IL or missing references)
//IL_0e9f: Unknown result type (might be due to invalid IL or missing references)
//IL_0edd: Unknown result type (might be due to invalid IL or missing references)
//IL_0edf: Unknown result type (might be due to invalid IL or missing references)
//IL_0ee1: Unknown result type (might be due to invalid IL or missing references)
//IL_0efc: Unknown result type (might be due to invalid IL or missing references)
//IL_0efe: Unknown result type (might be due to invalid IL or missing references)
//IL_0f60: Unknown result type (might be due to invalid IL or missing references)
//IL_0f73: Unknown result type (might be due to invalid IL or missing references)
//IL_0f78: Unknown result type (might be due to invalid IL or missing references)
//IL_0f7d: Unknown result type (might be due to invalid IL or missing references)
//IL_0fbb: Unknown result type (might be due to invalid IL or missing references)
//IL_0fbd: Unknown result type (might be due to invalid IL or missing references)
//IL_0fbf: Unknown result type (might be due to invalid IL or missing references)
//IL_0fda: Unknown result type (might be due to invalid IL or missing references)
//IL_0feb: Unknown result type (might be due to invalid IL or missing references)
//IL_0726: Unknown result type (might be due to invalid IL or missing references)
//IL_0728: Unknown result type (might be due to invalid IL or missing references)
//IL_0385: Unknown result type (might be due to invalid IL or missing references)
//IL_104d: Unknown result type (might be due to invalid IL or missing references)
//IL_1060: Unknown result type (might be due to invalid IL or missing references)
//IL_1065: Unknown result type (might be due to invalid IL or missing references)
//IL_106a: Unknown result type (might be due to invalid IL or missing references)
//IL_10a8: Unknown result type (might be due to invalid IL or missing references)
//IL_10aa: Unknown result type (might be due to invalid IL or missing references)
//IL_10ac: Unknown result type (might be due to invalid IL or missing references)
//IL_10c7: Unknown result type (might be due to invalid IL or missing references)
//IL_10c9: Unknown result type (might be due to invalid IL or missing references)
//IL_0b8b: Unknown result type (might be due to invalid IL or missing references)
//IL_0b75: Unknown result type (might be due to invalid IL or missing references)
//IL_030d: Unknown result type (might be due to invalid IL or missing references)
//IL_0322: Unknown result type (might be due to invalid IL or missing references)
//IL_112b: Unknown result type (might be due to invalid IL or missing references)
//IL_113e: Unknown result type (might be due to invalid IL or missing references)
//IL_1143: Unknown result type (might be due to invalid IL or missing references)
//IL_1148: Unknown result type (might be due to invalid IL or missing references)
//IL_1186: Unknown result type (might be due to invalid IL or missing references)
//IL_1188: Unknown result type (might be due to invalid IL or missing references)
//IL_118a: Unknown result type (might be due to invalid IL or missing references)
//IL_11a5: Unknown result type (might be due to invalid IL or missing references)
//IL_11a7: Unknown result type (might be due to invalid IL or missing references)
//IL_0bf5: Unknown result type (might be due to invalid IL or missing references)
//IL_0bdf: Unknown result type (might be due to invalid IL or missing references)
//IL_0b90: Unknown result type (might be due to invalid IL or missing references)
//IL_0bfa: Unknown result type (might be due to invalid IL or missing references)
Plugin.Log.LogInfo((object)"[PREVIEW] Attempting procedural generation (exact game algorithm)...");
_savedLevel = runManager.levelCurrent;
float num = 5f;
float num2 = 3f * num;
int num3 = 9;
int num4 = 9;
int num5 = Mathf.Max((level.ModuleAmount > 0) ? level.ModuleAmount : 6, 6);
num5 = Mathf.Min(num5 * 2, num3 * num4 - 1);
int num6 = Mathf.CeilToInt((float)num5 / 3f);
int num7 = ((num5 >= 15) ? 4 : ((num5 >= 10) ? 3 : ((num5 >= 8) ? 2 : ((num5 >= 6) ? 1 : 0))));
PreviewTile[,] array = new PreviewTile[num3, num4];
for (int i = 0; i < num3; i++)
{
for (int j = 0; j < num4; j++)
{
array[i, j] = new PreviewTile
{
x = i,
y = j
};
}
}
int num8 = num3 / 2;
int num9 = 0;
array[num8, num9].active = true;
array[num8, num9].first = true;
int num10 = num5;
int num11 = num8;
int num12 = num9;
int num13 = 10000;
while (num10 > 0 && num13-- > 0)
{
int num14 = -999;
int num15 = -999;
while (num11 + num14 < 0 || num11 + num14 >= num3 || num12 + num15 < 0 || num12 + num15 >= num4)
{
num14 = 0;
num15 = 0;
switch ((num12 == 1) ? Random.Range(0, 3) : Random.Range(0, 4))
{
case 0:
num14 = -1;
break;
case 1:
num14 = 1;
break;
case 2:
num15 = 1;
break;
case 3:
num15 = -1;
break;
}
}
num11 += num14;
num12 += num15;
if (!array[num11, num12].active)
{
array[num11, num12].active = true;
num10--;
}
}
List list = new List();
for (int k = 0; k < num3; k++)
{
for (int l = 0; l < num4; l++)
{
if (!array[k, l].active)
{
int num16 = 0;
if (GridCheck(array, k, l + 1, num3, num4))
{
num16++;
}
if (GridCheck(array, k + 1, l, num3, num4))
{
num16++;
}
if (GridCheck(array, k, l - 1, num3, num4))
{
num16++;
}
if (GridCheck(array, k - 1, l, num3, num4))
{
num16++;
}
if (num16 == 1)
{
list.Add(array[k, l]);
}
}
}
}
PreviewTile item = new PreviewTile
{
x = num8,
y = -1
};
List list2 = new List { item };
int num17 = num7;
while (num17 > 0 && list.Count > 0)
{
PreviewTile previewTile = null;
float num18 = 0f;
foreach (PreviewTile item2 in list)
{
float num19 = float.MaxValue;
foreach (PreviewTile item3 in list2)
{
float num20 = Vector2.Distance(new Vector2((float)item3.x, (float)item3.y), new Vector2((float)item2.x, (float)item2.y));
if (num20 < num19)
{
num19 = num20;
}
}
if (num19 > num18)
{
num18 = num19;
previewTile = item2;
}
}
if (previewTile == null)
{
break;
}
previewTile.type = (Type)3;
previewTile.active = true;
list2.Add(previewTile);
list.Remove(previewTile);
bool flag = true;
while (flag)
{
flag = false;
foreach (PreviewTile item4 in list)
{
if ((item4.x == previewTile.x && item4.y == previewTile.y - 1) || (item4.x == previewTile.x + 1 && item4.y == previewTile.y) || (item4.x == previewTile.x && item4.y == previewTile.y + 1) || (item4.x == previewTile.x - 1 && item4.y == previewTile.y))
{
list.Remove(item4);
flag = true;
break;
}
}
}
num17--;
}
int num21 = num6;
while (num21 > 0 && list.Count > 0)
{
PreviewTile previewTile2 = list[Random.Range(0, list.Count)];
previewTile2.type = (Type)2;
previewTile2.active = true;
list2.Add(previewTile2);
list.Remove(previewTile2);
bool flag2 = true;
while (flag2)
{
flag2 = false;
foreach (PreviewTile item5 in list)
{
if ((item5.x == previewTile2.x && item5.y == previewTile2.y - 1) || (item5.x == previewTile2.x + 1 && item5.y == previewTile2.y) || (item5.x == previewTile2.x && item5.y == previewTile2.y + 1) || (item5.x == previewTile2.x - 1 && item5.y == previewTile2.y))
{
list.Remove(item5);
flag2 = true;
break;
}
}
}
num21--;
}
Vector3 val = default(Vector3);
((Vector3)(ref val))..ctor(0f, -3000f, 0f);
_previewRoot = new GameObject("MapPreviewRoot");
_previewRoot.transform.position = val;
List list3 = new List();
AddPrefabRefs(list3, level.ModulesNormal1);
AddPrefabRefs(list3, level.ModulesNormal2);
AddPrefabRefs(list3, level.ModulesNormal3);
List list4 = new List();
AddPrefabRefs(list4, level.ModulesPassage1);
AddPrefabRefs(list4, level.ModulesPassage2);
AddPrefabRefs(list4, level.ModulesPassage3);
List list5 = new List();
AddPrefabRefs(list5, level.ModulesDeadEnd1);
AddPrefabRefs(list5, level.ModulesDeadEnd2);
AddPrefabRefs(list5, level.ModulesDeadEnd3);
List list6 = new List();
AddPrefabRefs(list6, level.ModulesExtraction1);
AddPrefabRefs(list6, level.ModulesExtraction2);
AddPrefabRefs(list6, level.ModulesExtraction3);
if (level.StartRooms != null && level.StartRooms.Count > 0)
{
PrefabRef val2 = level.StartRooms[Random.Range(0, level.StartRooms.Count)];
if (val2 != null && (Object)(object)val2.Prefab != (Object)null)
{
Plugin.Log.LogInfo((object)"[PREVIEW] Start room at origin (0,0,0) — game exact");
GameObject val3 = Object.Instantiate(val2.Prefab, val, Quaternion.identity, _previewRoot.transform);
Module component = val3.GetComponent();
if ((Object)(object)component != (Object)null)
{
component.ConnectingTop = true;
component.ConnectingBottom = true;
component.ConnectingRight = false;
component.ConnectingLeft = false;
component.First = true;
component.SetupDone = true;
ModulePropSwitch[] componentsInChildren = val3.GetComponentsInChildren(true);
foreach (ModulePropSwitch val4 in componentsInChildren)
{
val4.Module = component;
try
{
val4.Setup();
}
catch
{
}
}
}
StripComponents(val3);
}
}
if ((Object)(object)level.ConnectObject != (Object)null)
{
Vector3 val5 = val;
Plugin.Log.LogInfo((object)"[CONN] Truck connection at pos=(0,0,0)");
StripComponents(Object.Instantiate(level.ConnectObject, val5, Quaternion.identity, _previewRoot.transform));
}
Plugin.Log.LogInfo((object)$"[PREVIEW] Start room at grid({num8},{num9}), world origin={val}, moduleWidth={num2}");
Plugin.Log.LogInfo((object)$"[PREVIEW] Start grid formula: x={(float)num8 * num2 - (float)(num3 / 2) * num2}, z={(float)num9 * num2 + num2 / 2f}");
int num22 = 0;
int num23 = 0;
for (int n = 0; n < num3; n++)
{
for (int num24 = 0; num24 < num4; num24++)
{
if (!array[n, num24].active)
{
continue;
}
Vector3 val6 = val + new Vector3((float)n * num2 - (float)(num3 / 2) * num2, 0f, (float)num24 * num2 + num2 / 2f);
Vector3 val7 = Vector3.zero;
GameObject val8 = null;
if ((int)array[n, num24].type == 3)
{
if (list6.Count > 0)
{
val8 = list6[Random.Range(0, list6.Count)];
}
if (GridCheck(array, n, num24 - 1, num3, num4))
{
val7 = Vector3.zero;
}
if (GridCheck(array, n - 1, num24, num3, num4))
{
((Vector3)(ref val7))..ctor(0f, 90f, 0f);
}
if (GridCheck(array, n, num24 + 1, num3, num4))
{
((Vector3)(ref val7))..ctor(0f, 180f, 0f);
}
if (GridCheck(array, n + 1, num24, num3, num4))
{
((Vector3)(ref val7))..ctor(0f, -90f, 0f);
}
}
else if ((int)array[n, num24].type == 2)
{
if (list5.Count > 0)
{
val8 = list5[Random.Range(0, list5.Count)];
}
if (GridCheck(array, n, num24 - 1, num3, num4))
{
val7 = Vector3.zero;
}
if (GridCheck(array, n - 1, num24, num3, num4))
{
((Vector3)(ref val7))..ctor(0f, 90f, 0f);
}
if (GridCheck(array, n, num24 + 1, num3, num4))
{
((Vector3)(ref val7))..ctor(0f, 180f, 0f);
}
if (GridCheck(array, n + 1, num24, num3, num4))
{
((Vector3)(ref val7))..ctor(0f, -90f, 0f);
}
}
else
{
bool flag3 = num23 < ((level.PassageMaxAmount > 0) ? level.PassageMaxAmount : 2);
bool flag4 = GridCheck(array, n, num24 + 1, num3, num4) && (GridCheck(array, n, num24 - 1, num3, num4) || array[n, num24].first) && !GridCheck(array, n + 1, num24, num3, num4) && !GridCheck(array, n - 1, num24, num3, num4);
bool flag5 = !array[n, num24].first && GridCheck(array, n + 1, num24, num3, num4) && GridCheck(array, n - 1, num24, num3, num4) && !GridCheck(array, n, num24 + 1, num3, num4) && !GridCheck(array, n, num24 - 1, num3, num4);
if (flag3 && flag4 && list4.Count > 0)
{
val8 = list4[Random.Range(0, list4.Count)];
val7 = (Vector3)((Random.Range(0, 100) < 50) ? new Vector3(0f, 180f, 0f) : Vector3.zero);
num23++;
}
else if (flag3 && flag5 && list4.Count > 0)
{
val8 = list4[Random.Range(0, list4.Count)];
val7 = ((Random.Range(0, 100) < 50) ? new Vector3(0f, -90f, 0f) : new Vector3(0f, 90f, 0f));
num23++;
}
else
{
if (list3.Count > 0)
{
val8 = list3[Random.Range(0, list3.Count)];
}
float[] array2 = new float[4] { 0f, 90f, 180f, 270f };
((Vector3)(ref val7))..ctor(0f, array2[Random.Range(0, 4)], 0f);
}
}
if (!((Object)(object)val8 != (Object)null))
{
continue;
}
Plugin.Log.LogInfo((object)$"[PREVIEW] Module grid({n},{num24}) type={array[n, num24].type} pos={val6 - val} rot={val7} prefab={((Object)val8).name}");
GameObject val9 = Object.Instantiate(val8, val6, Quaternion.Euler(val7), _previewRoot.transform);
bool connectingTop = GridCheck(array, n, num24 + 1, num3, num4);
bool connectingBottom = GridCheck(array, n, num24 - 1, num3, num4) || array[n, num24].first;
bool connectingRight = GridCheck(array, n + 1, num24, num3, num4);
bool connectingLeft = GridCheck(array, n - 1, num24, num3, num4);
Module component2 = val9.GetComponent();
if ((Object)(object)component2 != (Object)null)
{
component2.ConnectingTop = connectingTop;
component2.ConnectingBottom = connectingBottom;
component2.ConnectingRight = connectingRight;
component2.ConnectingLeft = connectingLeft;
component2.First = array[n, num24].first;
component2.SetupDone = true;
ModulePropSwitch[] componentsInChildren = val9.GetComponentsInChildren(true);
foreach (ModulePropSwitch val10 in componentsInChildren)
{
val10.Module = component2;
try
{
val10.Setup();
}
catch
{
}
}
}
StripComponents(val9);
num22++;
}
}
if ((Object)(object)level.ConnectObject != (Object)null)
{
for (int num25 = 0; num25 < num3; num25++)
{
for (int num26 = 0; num26 < num4; num26++)
{
if (array[num25, num26].active)
{
float num27 = (float)num25 * num2 - (float)(num3 / 2) * num2;
float num28 = (float)num26 * num2 + num2 / 2f;
if (num26 + 1 < num4 && array[num25, num26 + 1].active && !array[num25, num26 + 1].connectedBot)
{
Vector3 val11 = val + new Vector3(num27, 0f, num28 + num2 / 2f);
Plugin.Log.LogInfo((object)$"[CONN] Top: grid({num25},{num26})->({num25},{num26 + 1}) pos={val11 - val}");
StripComponents(Object.Instantiate(level.ConnectObject, val11, Quaternion.identity, _previewRoot.transform));
array[num25, num26].connectedTop = true;
}
if (num25 + 1 < num3 && array[num25 + 1, num26].active && !array[num25 + 1, num26].connectedLeft)
{
Vector3 val12 = val + new Vector3(num27 + num2 / 2f, 0f, num28);
Plugin.Log.LogInfo((object)$"[CONN] Right: grid({num25},{num26})->({num25 + 1},{num26}) pos={val12 - val} rot=90");
StripComponents(Object.Instantiate(level.ConnectObject, val12, Quaternion.Euler(0f, 90f, 0f), _previewRoot.transform));
array[num25, num26].connectedRight = true;
}
if (num26 - 1 >= 0 && array[num25, num26 - 1].active && !array[num25, num26 - 1].connectedTop)
{
Vector3 val13 = val + new Vector3(num27, 0f, num28 - num2 / 2f);
Plugin.Log.LogInfo((object)$"[CONN] Bottom: grid({num25},{num26})->({num25},{num26 - 1}) pos={val13 - val}");
StripComponents(Object.Instantiate(level.ConnectObject, val13, Quaternion.identity, _previewRoot.transform));
array[num25, num26].connectedBot = true;
}
if (num25 - 1 >= 0 && array[num25 - 1, num26].active && !array[num25 - 1, num26].connectedRight)
{
Vector3 val14 = val + new Vector3(num27 - num2 / 2f, 0f, num28);
Plugin.Log.LogInfo((object)$"[CONN] Left: grid({num25},{num26})->({num25 - 1},{num26}) pos={val14 - val}");
StripComponents(Object.Instantiate(level.ConnectObject, val14, Quaternion.identity, _previewRoot.transform));
array[num25, num26].connectedLeft = true;
}
}
}
}
}
runManager.levelCurrent = _savedLevel;
Plugin.Log.LogInfo((object)$"[PREVIEW] Procedural generation complete: {num22} modules + start room on {num3}x{num4} grid");
return num22 > 0;
}
[IteratorStateMachine(typeof(d__35))]
private static IEnumerator BuildGridPreview(Level level)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new d__35(0)
{
level = level
};
}
private static void AddPrefabRefs(List list, List source)
{
if (source == null)
{
return;
}
foreach (PrefabRef item in source)
{
if (item != null)
{
GameObject prefab = item.Prefab;
if ((Object)(object)prefab != (Object)null)
{
list.Add(prefab);
}
}
}
}
private static void StripComponents(GameObject obj)
{
MonoBehaviour[] componentsInChildren = obj.GetComponentsInChildren(true);
foreach (MonoBehaviour val in componentsInChildren)
{
if ((Object)(object)val != (Object)null)
{
((Behaviour)val).enabled = false;
}
}
Collider[] componentsInChildren2 = obj.GetComponentsInChildren(true);
foreach (Collider val2 in componentsInChildren2)
{
if ((Object)(object)val2 != (Object)null)
{
val2.enabled = false;
}
}
Rigidbody[] componentsInChildren3 = obj.GetComponentsInChildren(true);
foreach (Rigidbody val3 in componentsInChildren3)
{
if ((Object)(object)val3 != (Object)null)
{
val3.isKinematic = true;
}
}
AudioSource[] componentsInChildren4 = obj.GetComponentsInChildren(true);
foreach (AudioSource val4 in componentsInChildren4)
{
if ((Object)(object)val4 != (Object)null)
{
((Behaviour)val4).enabled = false;
}
}
Animator[] componentsInChildren5 = obj.GetComponentsInChildren(true);
foreach (Animator val5 in componentsInChildren5)
{
if ((Object)(object)val5 != (Object)null)
{
((Behaviour)val5).enabled = false;
}
}
ParticleSystem[] componentsInChildren6 = obj.GetComponentsInChildren(true);
foreach (ParticleSystem val6 in componentsInChildren6)
{
if ((Object)(object)val6 != (Object)null)
{
val6.Stop();
}
}
}
private static void DisableLobby()
{
//IL_000a: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: 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_004b: Invalid comparison between Unknown and I4
_disabledRootObjects.Clear();
Scene activeScene = SceneManager.GetActiveScene();
GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects();
foreach (GameObject val in rootGameObjects)
{
if (!((Object)(object)val == (Object)null) && val.activeSelf && !KEEP_ACTIVE.Contains(((Object)val).name) && (int)((Object)val).hideFlags != 61)
{
val.SetActive(false);
_disabledRootObjects.Add(val);
}
}
Plugin.Log.LogInfo((object)$"[PREVIEW] Disabled {_disabledRootObjects.Count} root objects");
}
private static void RestoreLobby()
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0066: Unknown result type (might be due to invalid IL or missing references)
//IL_0070: Unknown result type (might be due to invalid IL or missing references)
foreach (GameObject disabledRootObject in _disabledRootObjects)
{
if ((Object)(object)disabledRootObject != (Object)null)
{
disabledRootObject.SetActive(true);
}
}
RenderSettings.fog = _savedFog;
RenderSettings.fogColor = _savedFogColor;
RenderSettings.fogStartDistance = _savedFogStart;
RenderSettings.fogEndDistance = _savedFogEnd;
RenderSettings.fogMode = _savedFogMode;
RenderSettings.ambientLight = _savedAmbientLight;
Plugin.Log.LogInfo((object)$"[PREVIEW] Re-enabled {_disabledRootObjects.Count} root objects");
_disabledRootObjects.Clear();
}
private static void BroadcastPreviewStart(string levelName)
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
if (SemiFunc.IsMultiplayer())
{
string nickName = PhotonNetwork.LocalPlayer.NickName;
NetworkedEvent onPreviewStart = Plugin.OnPreviewStart;
if (onPreviewStart != null)
{
onPreviewStart.RaiseEvent((object)(nickName + "|" + levelName), NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
}
}
}
private static void BroadcastPreviewEnd()
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
if (SemiFunc.IsMultiplayer())
{
string nickName = PhotonNetwork.LocalPlayer.NickName;
NetworkedEvent onPreviewEnd = Plugin.OnPreviewEnd;
if (onPreviewEnd != null)
{
onPreviewEnd.RaiseEvent((object)nickName, NetworkingEvents.RaiseOthers, SendOptions.SendReliable);
}
}
}
private void OnGUI()
{
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0083: Expected O, but got Unknown
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_009e: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Expected O, but got Unknown
//IL_00ca: Unknown result type (might be due to invalid IL or missing references)
//IL_00f6: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Unknown result type (might be due to invalid IL or missing references)
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_002a: Unknown result type (might be due to invalid IL or missing references)
//IL_01ae: Unknown result type (might be due to invalid IL or missing references)
//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
//IL_01bd: Expected O, but got Unknown
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: Unknown result type (might be due to invalid IL or missing references)
if (_showLoadingScreen)
{
if ((Object)(object)_blackTex == (Object)null)
{
_blackTex = new Texture2D(1, 1);
_blackTex.SetPixel(0, 0, Color.black);
_blackTex.Apply();
}
GUI.DrawTexture(new Rect(0f, 0f, (float)Screen.width, (float)Screen.height), (Texture)(object)_blackTex);
GUIStyle val = new GUIStyle(GUI.skin.label)
{
fontSize = 36,
alignment = (TextAnchor)4
};
val.normal.textColor = Color.white;
GUIStyle val2 = new GUIStyle(GUI.skin.label)
{
fontSize = 18,
alignment = (TextAnchor)4
};
val2.normal.textColor = new Color(0.7f, 0.7f, 0.7f);
GUI.Label(new Rect(0f, (float)Screen.height / 2f - 40f, (float)Screen.width, 50f), _loadingLevelName, val);
GUI.Label(new Rect(0f, (float)Screen.height / 2f + 20f, (float)Screen.width, 30f), "Loading preview...", val2);
}
else if (State == PreviewState.Previewing)
{
float num = 150f;
float num2 = 40f;
float num3 = ((float)Screen.width - num) / 2f;
float num4 = (float)Screen.height - num2 - 20f;
if (GUI.Button(new Rect(num3, num4, num, num2), "Back to Vote"))
{
StopPreview();
}
string text = (_previewLevelName ?? "").Replace("Level - ", "");
GUIStyle val3 = new GUIStyle(GUI.skin.label)
{
fontSize = 16
};
val3.normal.textColor = Color.white;
GUI.Label(new Rect(10f, 10f, 600f, 30f), "Previewing: " + text + " | WASD move | Mouse look | Shift fast | Space/Ctrl up/down", val3);
}
}
}
}