Decompiled source of REPO PVP v1.0.0
Celling.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; 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 Microsoft.CodeAnalysis; using Photon.Pun; using Photon.Realtime; using RepoMods.PVP; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; [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: AssemblyCompany("Omniscye")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+bf6bd61ad1cd75a34f8c445711a37e032a8fe412")] [assembly: AssemblyProduct("Celling")] [assembly: AssemblyTitle("Celling")] [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 Empress.RepoMods { [BepInPlugin("com.empress.repo.logo-replacer", "REPO Logo Replacer", "1.0.0")] public sealed class RepoLogoReplacer : BaseUnityPlugin { [HarmonyPatch] internal static class ResourcesLoadPatch { private static MethodBase TargetMethod() { return AccessTools.Method(typeof(Resources), "Load", new Type[2] { typeof(string), typeof(Type) }, (Type[])null); } private static void Postfix(string path, Type systemTypeInstance, ref Object __result) { if (__result == (Object)null) { return; } try { bool flag = false; if (!string.IsNullOrEmpty(path)) { string text = path.Replace('\\', '/').Split('/')?.LastOrDefault(); if (!string.IsNullOrEmpty(text)) { flag = string.Equals(text, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase) || string.Equals(text, "repo_logo_shadow_alpha.png", StringComparison.OrdinalIgnoreCase); } } if (systemTypeInstance == typeof(Sprite) || __result is Sprite) { Object obj = __result; Sprite val = (Sprite)(object)((obj is Sprite) ? obj : null); if ((flag || ((Object)(object)val != (Object)null && string.Equals(((Object)val).name, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase))) && (Object)(object)ReplacementSprite != (Object)null) { __result = (Object)(object)ReplacementSprite; } } else if (systemTypeInstance == typeof(Texture2D) || __result is Texture2D) { Object obj2 = __result; Texture2D val2 = (Texture2D)(object)((obj2 is Texture2D) ? obj2 : null); if ((flag || ((Object)(object)val2 != (Object)null && string.Equals(((Object)val2).name, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase))) && (Object)(object)ReplacementTexture != (Object)null) { __result = (Object)(object)ReplacementTexture; } } } catch (Exception arg) { ManualLogSource logS = LogS; if (logS != null) { logS.LogError((object)$"Resources.Load Postfix error: {arg}"); } } } } [CompilerGenerated] private sealed class <DelayedSweep>d__10 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public float delay; public RepoLogoReplacer <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DelayedSweep>d__10(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(delay); <>1__state = 1; return true; case 1: <>1__state = -1; TryReplaceInAll(); 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 <RepeatedSweep>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public float duration; public float interval; public RepoLogoReplacer <>4__this; private float <t>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RepeatedSweep>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <t>5__1 = 0f; break; case 1: <>1__state = -1; <t>5__1 += interval; break; } if (<t>5__1 < duration) { TryReplaceInAll(); <>2__current = (object)new WaitForSeconds(interval); <>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(); } } public const string PluginGuid = "com.empress.repo.logo-replacer"; public const string PluginName = "REPO Logo Replacer"; public const string PluginVersion = "1.0.0"; private const string TargetSpriteName = "repo_logo_shadow_alpha"; private const string TargetPngFileName = "repo_logo_shadow_alpha.png"; internal static ManualLogSource LogS; internal static Sprite ReplacementSprite; internal static Texture2D ReplacementTexture; private Harmony _harmony; private void Awake() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown LogS = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("com.empress.repo.logo-replacer"); try { LoadReplacementFromDisk(); } catch (Exception arg) { LogS.LogError((object)$"Failed to load replacement PNG: {arg}"); } try { _harmony.PatchAll(typeof(ResourcesLoadPatch)); } catch (Exception arg2) { LogS.LogError((object)$"Failed to patch Resources.Load: {arg2}"); } SceneManager.sceneLoaded += OnSceneLoaded; ((MonoBehaviour)this).StartCoroutine(DelayedSweep(0.25f)); } [IteratorStateMachine(typeof(<DelayedSweep>d__10))] private IEnumerator DelayedSweep(float delay) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DelayedSweep>d__10(0) { <>4__this = this, delay = delay }; } [IteratorStateMachine(typeof(<RepeatedSweep>d__11))] private IEnumerator RepeatedSweep(float duration, float interval) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RepeatedSweep>d__11(0) { <>4__this = this, duration = duration, interval = interval }; } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { ((MonoBehaviour)this).StartCoroutine(RepeatedSweep(2f, 0.15f)); } private static void TryReplaceInAll() { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ReplacementSprite == (Object)null) { Sprite val = ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite s) => Object.op_Implicit((Object)(object)s) && string.Equals(((Object)s).name, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase))); if ((Object)(object)val != (Object)null && (Object)(object)ReplacementTexture != (Object)null) { Texture2D replacementTexture = ReplacementTexture; Rect val2 = new Rect(0f, 0f, (float)((Texture)ReplacementTexture).width, (float)((Texture)ReplacementTexture).height); Vector2 pivot = val.pivot; Rect rect = val.rect; ReplacementSprite = Sprite.Create(replacementTexture, val2, pivot / ((Rect)(ref rect)).size, val.pixelsPerUnit, 0u, (SpriteMeshType)1); ((Object)ReplacementSprite).name = "repo_logo_shadow_alpha"; } } int num = 0; if ((Object)(object)ReplacementSprite != (Object)null) { Image[] array = Resources.FindObjectsOfTypeAll<Image>(); foreach (Image val3 in array) { if (!((Object)(object)val3 == (Object)null)) { Sprite sprite = val3.sprite; if ((Object)(object)sprite != (Object)null && string.Equals(((Object)sprite).name, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase)) { val3.sprite = ReplacementSprite; ((Graphic)val3).SetAllDirty(); num++; } } } SpriteRenderer[] array2 = Resources.FindObjectsOfTypeAll<SpriteRenderer>(); foreach (SpriteRenderer val4 in array2) { if (!((Object)(object)val4 == (Object)null)) { Sprite sprite2 = val4.sprite; if ((Object)(object)sprite2 != (Object)null && string.Equals(((Object)sprite2).name, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase)) { val4.sprite = ReplacementSprite; num++; } } } } if (!((Object)(object)ReplacementTexture != (Object)null)) { return; } RawImage[] array3 = Resources.FindObjectsOfTypeAll<RawImage>(); foreach (RawImage val5 in array3) { if (!((Object)(object)val5 == (Object)null)) { Texture texture = val5.texture; Texture2D val6 = (Texture2D)(object)((texture is Texture2D) ? texture : null); if ((Object)(object)val6 != (Object)null && string.Equals(((Object)val6).name, "repo_logo_shadow_alpha", StringComparison.OrdinalIgnoreCase)) { val5.texture = (Texture)(object)ReplacementTexture; ((Graphic)val5).SetAllDirty(); num++; } } } } private void OnDestroy() { if (_harmony != null) { try { _harmony.UnpatchSelf(); } catch { } } SceneManager.sceneLoaded -= OnSceneLoaded; } private static void LoadReplacementFromDisk() { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Expected O, but got Unknown //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) string directoryName = Path.GetDirectoryName(typeof(RepoLogoReplacer).Assembly.Location); if (string.IsNullOrEmpty(directoryName)) { ManualLogSource logS = LogS; if (logS != null) { logS.LogWarning((object)"Assembly location unknown; cannot load replacement image."); } return; } string text = Path.Combine(directoryName, "repo_logo_shadow_alpha.png"); if (!File.Exists(text)) { ManualLogSource logS2 = LogS; if (logS2 != null) { logS2.LogWarning((object)("Replacement PNG not found: " + text)); } return; } byte[] array = File.ReadAllBytes(text); Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false, true); if (!ImageConversion.LoadImage(val, array, false)) { ManualLogSource logS3 = LogS; if (logS3 != null) { logS3.LogError((object)"Texture2D.LoadImage returned false for replacement PNG."); } Object.Destroy((Object)(object)val); } else { ((Object)val).name = "repo_logo_shadow_alpha"; ((Texture)val).wrapMode = (TextureWrapMode)1; ((Texture)val).filterMode = (FilterMode)1; ReplacementTexture = val; ReplacementSprite = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f, 0u, (SpriteMeshType)1); ((Object)ReplacementSprite).name = "repo_logo_shadow_alpha"; } } } } namespace RepoMods.PVP { public class PvpBullet : MonoBehaviour { public PvpManager Manager; public bool VisualOnly; public int Damage = 10; public float Life = 3f; public int OwnerActor = -1; public bool Explosive = false; public float ArmingTime = 0.1f; public Collider[] IgnoreOwnerColliders; private float _dieAt; private float _bornAt; private Collider _col; private void Start() { _bornAt = Time.time; _dieAt = Time.time + Mathf.Max(0.2f, Life); _col = ((Component)this).GetComponent<Collider>(); if (!((Object)(object)_col != (Object)null) || IgnoreOwnerColliders == null) { return; } Collider[] ignoreOwnerColliders = IgnoreOwnerColliders; foreach (Collider val in ignoreOwnerColliders) { if ((Object)(object)val != (Object)null) { Physics.IgnoreCollision(_col, val, true); } } } private void Update() { if (Time.time >= _dieAt) { TryVanish(); } } private void OnTriggerEnter(Collider other) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0227: 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_0141: Unknown result type (might be due to invalid IL or missing references) //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: 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) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) if (VisualOnly || Time.time < _bornAt + ArmingTime) { return; } try { PvpShield componentInParent = ((Component)other).GetComponentInParent<PvpShield>(); if ((Object)(object)componentInParent != (Object)null) { if (componentInParent.OwnerActor != OwnerActor) { if (Explosive) { SpawnExpandingHazard(((Component)this).transform.position); } TryVanish(); } return; } PlayerAvatar val = (Object.op_Implicit((Object)(object)other) ? ((Component)other).GetComponentInParent<PlayerAvatar>() : null); if ((Object)(object)val != (Object)null && (Object)(object)val.photonView != (Object)null && val.photonView.Owner != null) { int ownerActorNr = val.photonView.OwnerActorNr; if (OwnerActor >= 0 && ownerActorNr == OwnerActor) { return; } int num = Damage; if ((Object)(object)Manager != (Object)null && Manager.HasPowerup(ownerActorNr, PvpManager.PvpPowerupType.Shield)) { num = Mathf.RoundToInt((float)num * 0.6f); } Vector3 position = ((Component)this).transform.position; if (PhotonNetwork.IsMasterClient) { PlayerHealth component = ((Component)val).GetComponent<PlayerHealth>(); if ((Object)(object)component != (Object)null) { component.HurtOther(Mathf.Max(1, num), position, false, -1); } if (Explosive) { SpawnExpandingHazard(position); } } else { PvpEvt.SendMaster(15, OwnerActor, ownerActorNr, Mathf.Max(1, num), position.x, position.y, position.z, Explosive ? 1 : 0); } TryVanish(); } else if (Explosive) { SpawnExpandingHazard(((Component)this).transform.position); TryVanish(); } } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] Bullet trigger: " + ex.Message)); TryVanish(); } } private void SpawnExpandingHazard(Vector3 pos) { //IL_0017: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Manager != (Object)null) { Manager.SpawnExplosionHazard(pos, Damage, OwnerActor); } } private void TryVanish() { try { Object.Destroy((Object)(object)((Component)this).gameObject); } catch { } } } [HarmonyPatch(typeof(PlayerAvatar))] internal static class PvpDeathHook { [HarmonyPostfix] [HarmonyPatch("PlayerDeathRPC")] private static void Post_PlayerDeathRPC(PlayerAvatar __instance) { if (PhotonNetwork.IsMasterClient && !((Object)(object)PvpManager.Instance == (Object)null) && PvpManager.Instance.IsArmed && !((Object)(object)__instance == (Object)null) && !((Object)(object)__instance.photonView == (Object)null)) { PvpManager.Instance.MasterOnPlayerDeath(__instance); } } } public class PvpEventManager : MonoBehaviourPunCallbacks, IOnEventCallback { public static PvpEventManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)this); return; } Instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } private void OnEnable() { if (PhotonNetwork.NetworkingClient != null) { PhotonNetwork.AddCallbackTarget((object)this); } } private void OnDisable() { PhotonNetwork.RemoveCallbackTarget((object)this); } public void OnEvent(EventData photonEvent) { //IL_036d: Unknown result type (might be due to invalid IL or missing references) //IL_0372: Unknown result type (might be due to invalid IL or missing references) //IL_0377: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_039f: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Unknown result type (might be due to invalid IL or missing references) //IL_02cd: Unknown result type (might be due to invalid IL or missing references) //IL_0548: Unknown result type (might be due to invalid IL or missing references) //IL_02f2: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_055c: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) try { if (photonEvent.Code != 45 || !(photonEvent.CustomData is object[] array) || array.Length < 2 || !(array[0] is string text) || text != "PVP1") { return; } switch ((byte)array[1]) { case 1: if (array.Length >= 3 && array[2] is float[] packed) { PvpManager.Instance?.ApplySpawnPointsFromMaster(packed); } break; case 2: { if (array.Length < 6 || !ToInt(array[2], out var val3)) { break; } object obj = array[3]; if (!(obj is float)) { break; } float num2 = (float)obj; if (1 == 0) { break; } obj = array[4]; if (!(obj is float)) { break; } float num3 = (float)obj; if (1 == 0) { break; } obj = array[5]; if (obj is float) { float num4 = (float)obj; if (true) { PvpManager.Instance?.SpawnPowerupVisual(val3, new Vector3(num2, num3, num4)); } } break; } case 5: if (array.Length >= 3 && array[2] is float[] packed2) { PvpManager.Instance?.ApplyPortalsFromMaster(packed2); } break; case 3: { if (array.Length < 7 || !ToInt(array[2], out var val4) || !ToInt(array[3], out var val5)) { break; } float num5 = Convert.ToSingle(array[4]); float num6 = Convert.ToSingle(array[5]); float num7 = Convert.ToSingle(array[6]); Vector3 val6 = default(Vector3); ((Vector3)(ref val6))..ctor(num5, num6, num7); if (PhotonNetwork.IsMasterClient) { int sender = photonEvent.Sender; Player localPlayer = PhotonNetwork.LocalPlayer; if (sender != ((localPlayer != null) ? localPlayer.ActorNumber : (-1))) { PvpManager.Instance?.ApplyPowerup(val4, (PvpManager.PvpPowerupType)val5, broadcast: false); PvpManager.Instance?.HandlePowerupPickedAt((PvpManager.PvpPowerupType)val5, val6); PvpEvt.SendAll(3, val4, val5, val6.x, val6.y, val6.z); break; } } PvpManager.Instance?.ApplyPowerup(val4, (PvpManager.PvpPowerupType)val5, broadcast: false); PvpManager.Instance?.HandlePowerupPickedAt((PvpManager.PvpPowerupType)val5, val6); break; } case 4: if (array.Length >= 6) { Vector3 pos = (Vector3)array[2]; Vector3 dir = (Vector3)array[3]; float speed = Convert.ToSingle(array[4]); float life = Convert.ToSingle(array[5]); PvpManager.Instance?.SpawnBulletVisual(pos, dir, speed, life, visualOnly: true, null, -1); } break; case 10: { int[] actors = (int[])array[2]; int[] lives = (int[])array[3]; int[] wins = (int[])array[4]; int[] rounds = null; if (array.Length >= 6 && array[5] is int[]) { rounds = (int[])array[5]; } PvpManager.Instance?.ApplyRoundSync(actors, lives, wins, rounds); break; } case 11: { int winnerActor = Convert.ToInt32(array[2]); PvpManager.Instance?.AnnounceWinner(winnerActor); break; } case 12: PvpManager.Instance?.OnRoundResetAnnounce(); break; case 15: { if (!PhotonNetwork.IsMasterClient) { break; } int ownerActor = Convert.ToInt32(array[2]); int actor2 = Convert.ToInt32(array[3]); int num = Convert.ToInt32(array[4]); Vector3 val = default(Vector3); ((Vector3)(ref val))..ctor(Convert.ToSingle(array[5]), Convert.ToSingle(array[6]), Convert.ToSingle(array[7])); bool flag = array.Length >= 9 && Convert.ToInt32(array[8]) != 0; PvpManager instance = PvpManager.Instance; if ((Object)(object)instance == (Object)null) { break; } PlayerAvatar val2 = instance.FindAvatarByActor(actor2); if (!((Object)(object)val2 == (Object)null)) { if (instance.HasPowerup(actor2, PvpManager.PvpPowerupType.Shield)) { num = Mathf.RoundToInt((float)num * 0.6f); } PlayerHealth component = ((Component)val2).GetComponent<PlayerHealth>(); if ((Object)(object)component != (Object)null && num > 0) { component.HurtOther(Mathf.Max(1, num), val, false, -1); } if (flag) { instance.SpawnExplosionHazard(val, Mathf.Max(1, num), ownerActor); } } break; } case 16: if (array.Length >= 4) { int actor = Convert.ToInt32(array[2]); int typeOrMinus = Convert.ToInt32(array[3]); PvpManager.Instance?.ShowGunFlash(actor, typeOrMinus, 0.2f); } break; case 6: case 7: case 8: case 9: case 13: case 14: break; } } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] OnEvent guarded: " + ex.Message)); } } private static bool ToInt(object o, out int val) { try { if (o is int num) { val = num; return true; } if (o is byte b) { val = b; return true; } if (o is short num2) { val = num2; return true; } if (o is long num3) { val = (int)num3; return true; } if (o is float num4) { val = (int)num4; return true; } if (o is double num5) { val = (int)num5; return true; } if (o is string s && int.TryParse(s, out var result)) { val = result; return true; } } catch { } val = -1; return false; } } internal static class PvpEvt { internal const byte EVT_CODE = 45; internal const string TAG = "PVP1"; internal const byte SPAWN_POINTS = 1; internal const byte SPAWN_POWERUPS = 2; internal const byte PICKUP_POWERUP = 3; internal const byte BULLET_VISUAL = 4; internal const byte SPAWN_PORTALS = 5; internal const byte GUN_SHOT = 16; internal const byte ROUND_SYNC = 10; internal const byte ROUND_WIN = 11; internal const byte ROUND_RESET = 12; internal const byte DAMAGE_HIT = 15; internal static readonly RaiseEventOptions ToAll = new RaiseEventOptions { Receivers = (ReceiverGroup)1 }; internal static readonly RaiseEventOptions ToOthers = new RaiseEventOptions { Receivers = (ReceiverGroup)0 }; internal static readonly RaiseEventOptions ToMaster = new RaiseEventOptions { Receivers = (ReceiverGroup)2 }; internal static readonly SendOptions Reliable; internal static readonly SendOptions Unreliable; internal static void SendAll(byte innerId, params object[] args) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) PhotonNetwork.RaiseEvent((byte)45, (object)Build(innerId, args), ToAll, Reliable); } internal static void SendOthers(byte innerId, params object[] args) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) PhotonNetwork.RaiseEvent((byte)45, (object)Build(innerId, args), ToOthers, Unreliable); } internal static void SendMaster(byte innerId, params object[] args) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) PhotonNetwork.RaiseEvent((byte)45, (object)Build(innerId, args), ToMaster, Reliable); } private static object[] Build(byte innerId, object[] args) { object[] array = new object[2 + ((args != null) ? args.Length : 0)]; array[0] = "PVP1"; array[1] = innerId; if (args != null && args.Length != 0) { Array.Copy(args, 0, array, 2, args.Length); } return array; } static PvpEvt() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_0035: 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_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) SendOptions val = default(SendOptions); ((SendOptions)(ref val)).Reliability = true; Reliable = val; val = default(SendOptions); ((SendOptions)(ref val)).Reliability = false; Unreliable = val; } } public class PvpExplosionHazard : MonoBehaviour { [CompilerGenerated] private sealed class <CoGrow>d__6 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public float dur; public PvpExplosionHazard <>4__this; private float <t>5__1; private float <k>5__2; private float <radius>5__3; private Color <c>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoGrow>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <t>5__1 = 0f; break; case 1: <>1__state = -1; break; } if (<t>5__1 < dur) { <t>5__1 += Time.deltaTime; <k>5__2 = <t>5__1 / dur; <radius>5__3 = Mathf.Lerp(0.1f, 2.2f, <k>5__2); <>4__this._col.radius = <radius>5__3; ((Component)<>4__this).transform.localScale = Vector3.one * <radius>5__3; if ((Object)(object)<>4__this._mr != (Object)null && ((Renderer)<>4__this._mr).material.HasProperty("_Color")) { <c>5__4 = ((Renderer)<>4__this._mr).material.color; <c>5__4.a = Mathf.Lerp(0.35f, 0f, <k>5__2); ((Renderer)<>4__this._mr).material.color = <c>5__4; } <>4__this._touchedThisFrame.Clear(); <>2__current = null; <>1__state = 1; return true; } try { Object.Destroy((Object)(object)((Component)<>4__this).gameObject); } catch { } 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 SphereCollider _col; private MeshRenderer _mr; private int _ownerActor; private int _baseDamage; private readonly HashSet<int> _touchedThisFrame = new HashSet<int>(); public void Init(float duration, int damage, int ownerActor) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) float dur = Mathf.Max(0.1f, duration); _ownerActor = ownerActor; _baseDamage = Mathf.Max(1, damage); GameObject val = GameObject.CreatePrimitive((PrimitiveType)0); ((Object)val).name = "Visual"; val.transform.SetParent(((Component)this).transform, false); val.transform.localPosition = Vector3.zero; Object.Destroy((Object)(object)val.GetComponent<Collider>()); _mr = val.GetComponent<MeshRenderer>(); if ((Object)(object)_mr != (Object)null) { ((Renderer)_mr).material = PvpManager.BuildTranslucentMat(new Color(1f, 0.5f, 0.1f, 0.35f)); } _col = ((Component)this).gameObject.AddComponent<SphereCollider>(); ((Collider)_col).isTrigger = true; _col.radius = 0.1f; ((MonoBehaviour)this).StartCoroutine(CoGrow(dur)); } [IteratorStateMachine(typeof(<CoGrow>d__6))] private IEnumerator CoGrow(float dur) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoGrow>d__6(0) { <>4__this = this, dur = dur }; } private void OnTriggerStay(Collider other) { TryDamage(other); } private void OnTriggerEnter(Collider other) { TryDamage(other); } private void TryDamage(Collider other) { //IL_008d: Unknown result type (might be due to invalid IL or missing references) try { PlayerAvatar componentInParent = ((Component)other).GetComponentInParent<PlayerAvatar>(); if ((Object)(object)componentInParent == (Object)null || (Object)(object)componentInParent.photonView == (Object)null) { return; } int ownerActorNr = componentInParent.photonView.OwnerActorNr; if (ownerActorNr != _ownerActor && !_touchedThisFrame.Contains(ownerActorNr)) { PlayerHealth component = ((Component)componentInParent).GetComponent<PlayerHealth>(); if ((Object)(object)component != (Object)null) { int num = Mathf.Max(1, Mathf.RoundToInt((float)_baseDamage * 0.35f)); component.HurtOther(num, Vector3.zero, false, -1); _touchedThisFrame.Add(ownerActorNr); } } } catch { } } } public class PvpGun : MonoBehaviour { public static readonly HashSet<int> PlayersShootingGuns = new HashSet<int>(); public static readonly Vector3 ShootingArmPose = new Vector3(0f, -90f, 0f); private PvpManager _mgr; private int _actor; private Transform _root; private MeshRenderer _barrelMr; private MeshRenderer _gripMr; private float _hideAt; private int _lastType = int.MinValue; private bool _isLocalPlayer; private int _avatarViewId = -1; public void Setup(PvpManager mgr, int actor) { _mgr = mgr; _actor = actor; Player localPlayer = PhotonNetwork.LocalPlayer; _isLocalPlayer = localPlayer != null && localPlayer.ActorNumber == actor; PlayerAvatar val = _mgr.FindAvatarByActor(_actor); if ((Object)(object)val != (Object)null && (Object)(object)val.photonView != (Object)null) { _avatarViewId = val.photonView.ViewID; } if ((Object)(object)_root == (Object)null) { Build(); } } private void Build() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: 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_0122: Unknown result type (might be due to invalid IL or missing references) _root = new GameObject("GunVisual").transform; _root.SetParent(((Component)this).transform, false); GameObject val = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)val).name = "Barrel"; val.transform.SetParent(_root, false); val.transform.localScale = new Vector3(0.28f, 0.08f, 0.08f); val.transform.localPosition = new Vector3(0.12f, 0.02f, 0f); _barrelMr = val.GetComponent<MeshRenderer>(); Object.Destroy((Object)(object)val.GetComponent<Collider>()); GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)val2).name = "Grip"; val2.transform.SetParent(_root, false); val2.transform.localScale = new Vector3(0.08f, 0.15f, 0.06f); val2.transform.localPosition = new Vector3(-0.02f, -0.06f, -0.02f); val2.transform.localRotation = Quaternion.Euler(0f, 0f, -15f); _gripMr = val2.GetComponent<MeshRenderer>(); Object.Destroy((Object)(object)val2.GetComponent<Collider>()); ((Component)_root).gameObject.SetActive(false); } public void Show(int typeOrMinus1, float duration) { if ((Object)(object)_root == (Object)null) { Build(); } ApplyStyle(typeOrMinus1); ((Component)_root).gameObject.SetActive(true); _hideAt = Time.time + Mathf.Max(0.05f, duration); if (_avatarViewId >= 0) { PlayersShootingGuns.Add(_avatarViewId); } } private void LateUpdate() { //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_mgr == (Object)null) { return; } PlayerAvatar val = _mgr.FindAvatarByActor(_actor); if ((Object)(object)val == (Object)null) { return; } if (_isLocalPlayer) { Transform val2 = (((Object)(object)((Component)val).transform.parent != (Object)null) ? ((Component)val).transform.parent.Find("Local Camera") : null); if ((Object)(object)val2 != (Object)null && (Object)(object)((Component)this).transform.parent != (Object)(object)val2) { ((Component)this).transform.SetParent(val2, false); ((Component)this).transform.localPosition = new Vector3(0.2f, -0.15f, 0.265f); ((Component)this).transform.localRotation = Quaternion.Euler(17f, 17f, 5f); ((Component)this).transform.localScale = Vector3.one; } } else { PlayerAvatarRightArm val3 = (((Object)(object)((Component)val).transform.parent != (Object)null) ? ((Component)((Component)val).transform.parent).GetComponentInChildren<PlayerAvatarRightArm>() : null); if ((Object)(object)val3 != (Object)null && (Object)(object)val3.rightArmTransform != (Object)null && (Object)(object)((Component)this).transform.parent != (Object)(object)val3.rightArmTransform) { ((Component)this).transform.SetParent(val3.rightArmTransform, false); ((Component)this).transform.localPosition = new Vector3(0.05f, -0.034f, 0.479f); ((Component)this).transform.localRotation = Quaternion.Euler(-17.5f, 52.7f, 81f); ((Component)this).transform.localScale = Vector3.one; } } if ((Object)(object)_root != (Object)null && ((Component)_root).gameObject.activeSelf && Time.time >= _hideAt) { ((Component)_root).gameObject.SetActive(false); if (_avatarViewId >= 0) { PlayersShootingGuns.Remove(_avatarViewId); } } } private void ApplyStyle(int typeOrMinus1) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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) if (typeOrMinus1 != _lastType || !((Object)(object)_barrelMr != (Object)null) || !((Object)(object)_gripMr != (Object)null)) { _lastType = typeOrMinus1; Color tint = default(Color); ((Color)(ref tint))..ctor(0.7f, 0.7f, 0.7f, 0.85f); if (typeOrMinus1 >= 0) { tint = PvpManager.ColorFor((PvpManager.PvpPowerupType)typeOrMinus1, 0.85f); } Material material = PvpManager.BuildTranslucentMat(tint); if ((Object)(object)_barrelMr != (Object)null) { ((Renderer)_barrelMr).material = material; } if ((Object)(object)_gripMr != (Object)null) { ((Renderer)_gripMr).material = material; } } } } internal static class PvpHideVanillaUI { [HarmonyPatch(typeof(HealthUI), "Start")] private static class Patch_HealthUI_Start { private static void Postfix(HealthUI __instance) { if (PvpActive) { try { ((Component)__instance).gameObject.SetActive(false); } catch { } } } } [HarmonyPatch(typeof(HealthUI), "Update")] private static class Patch_HealthUI_Update { private static bool Prefix(HealthUI __instance) { if (PvpActive) { try { if (((Component)__instance).gameObject.activeSelf) { ((Component)__instance).gameObject.SetActive(false); } } catch { } return false; } return true; } } [HarmonyPatch(typeof(EnergyUI), "Start")] private static class Patch_EnergyUI_Start { private static void Postfix(EnergyUI __instance) { if (PvpActive) { try { ((Component)__instance).gameObject.SetActive(false); } catch { } } } } [HarmonyPatch(typeof(EnergyUI), "Update")] private static class Patch_EnergyUI_Update { private static bool Prefix(EnergyUI __instance) { if (PvpActive) { try { if (((Component)__instance).gameObject.activeSelf) { ((Component)__instance).gameObject.SetActive(false); } } catch { } return false; } return true; } } private static bool PvpActive => (Object)(object)PvpManager.Instance != (Object)null && PvpManager.Instance.IsArmed; } public class PvpManager : MonoBehaviourPunCallbacks { public enum PvpPowerupType { RapidFire, DoubleShot, HeavyRounds, Shield, Explosive } [CompilerGenerated] private sealed class <ArmRoundSequence>d__36 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PvpManager <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <ArmRoundSequence>d__36(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; PvpPlugin.Logger.LogInfo((object)"[PVP] Starting arm sequence..."); <>2__current = (object)new WaitForSeconds(0.25f); <>1__state = 1; return true; case 1: <>1__state = -1; <>4__this._preArmed = true; <>4__this._preUntil = Time.time + Mathf.Max(0.5f, PvpPlugin.PreRoundSeconds.Value); <>4__this._armed = false; if (PhotonNetwork.IsMasterClient) { <>4__this.SuppressEnemiesLocal(); <>4__this.DistributeSpawnsMaster(); <>4__this.ChooseAndBroadcastPortalsMaster(); <>4__this.SpawnPowerupsMaster(); <>4__this.InitializeLivesAndSync(); <>4__this._subRoundActive = true; <>4__this._respawnDueAt.Clear(); <>4__this._respawnPos.Clear(); } <>4__this._nextShootReady = Time.time + 0.5f; break; case 2: <>1__state = -1; break; } if (<>4__this._preArmed && Time.time < <>4__this._preUntil) { <>2__current = null; <>1__state = 2; return true; } <>4__this._armed = true; <>4__this._armingInProgress = false; PvpPlugin.Logger.LogInfo((object)"[PVP] Round armed and active!"); 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 <CoFinalWinAndTruck>d__51 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public int winnerActor; public PvpManager <>4__this; private string <name>5__1; private Player <p>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoFinalWinAndTruck>d__51(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { int num = <>1__state; if (num == -3 || num == 1) { try { } finally { <>m__Finally1(); } } <name>5__1 = null; <p>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_0125: Expected O, but got Unknown try { switch (<>1__state) { default: return false; case 0: { <>1__state = -1; <>1__state = -3; Room currentRoom = PhotonNetwork.CurrentRoom; <name>5__1 = ((currentRoom != null && currentRoom.Players.TryGetValue(winnerActor, out <p>5__2)) ? <p>5__2.NickName : $"Player {winnerActor}"); <>4__this._winBanner = <name>5__1 + " wins the match!"; <>4__this._winBannerUntil = Time.time + 5f; if (!<>4__this._roundsWon.ContainsKey(winnerActor)) { <>4__this._roundsWon[winnerActor] = 0; } <>4__this._roundsWon[winnerActor]++; <>4__this.SendLivesSync(); <>2__current = (object)new WaitForSeconds(5f); <>1__state = 1; return true; } case 1: <>1__state = -3; <>4__this.TryStartTruck(); <name>5__1 = null; <p>5__2 = null; <>m__Finally1(); return false; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; <>4__this._winBanner = null; <>4__this._winBannerUntil = 0f; } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CoResetSubRound>d__45 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PvpManager <>4__this; private float <when>5__1; private List<int>.Enumerator <>s__2; private int <a>5__3; private List<KeyValuePair<int, PvpShield>>.Enumerator <>s__4; private KeyValuePair<int, PvpShield> <kv>5__5; private Dictionary<int, PvpExplosionHazard>.ValueCollection.Enumerator <>s__6; private PvpExplosionHazard <hz>5__7; private List<PlayerAvatar>.Enumerator <>s__8; private PlayerAvatar <p>5__9; private int <actor>5__10; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoResetSubRound>d__45(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>s__2 = default(List<int>.Enumerator); <>s__4 = default(List<KeyValuePair<int, PvpShield>>.Enumerator); <kv>5__5 = default(KeyValuePair<int, PvpShield>); <>s__6 = default(Dictionary<int, PvpExplosionHazard>.ValueCollection.Enumerator); <hz>5__7 = null; <>s__8 = default(List<PlayerAvatar>.Enumerator); <p>5__9 = null; <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown //IL_0288: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(2f); <>1__state = 1; return true; case 1: <>1__state = -1; <>s__2 = <>4__this._powerupsByActor.Keys.ToList().GetEnumerator(); try { while (<>s__2.MoveNext()) { <a>5__3 = <>s__2.Current; <>4__this.ClearAllPowerups(<a>5__3); } } finally { ((IDisposable)<>s__2).Dispose(); } <>s__2 = default(List<int>.Enumerator); <>s__4 = <>4__this._shieldByActor.ToList().GetEnumerator(); try { while (<>s__4.MoveNext()) { <kv>5__5 = <>s__4.Current; <>4__this.DestroyShield(<kv>5__5.Key); <kv>5__5 = default(KeyValuePair<int, PvpShield>); } } finally { ((IDisposable)<>s__4).Dispose(); } <>s__4 = default(List<KeyValuePair<int, PvpShield>>.Enumerator); <>s__6 = <>4__this._activeExplosionByActor.Values.GetEnumerator(); try { while (<>s__6.MoveNext()) { <hz>5__7 = <>s__6.Current; try { if (Object.op_Implicit((Object)(object)<hz>5__7)) { Object.Destroy((Object)(object)((Component)<hz>5__7).gameObject); } } catch { } <hz>5__7 = null; } } finally { ((IDisposable)<>s__6).Dispose(); } <>s__6 = default(Dictionary<int, PvpExplosionHazard>.ValueCollection.Enumerator); <>4__this._activeExplosionByActor.Clear(); <>4__this.InitializeLivesAndSync(); <>4__this._respawnDueAt.Clear(); <>4__this._respawnPos.Clear(); <when>5__1 = Time.realtimeSinceStartup + 1f; <>s__8 = <>4__this.SafePlayers().GetEnumerator(); try { while (<>s__8.MoveNext()) { <p>5__9 = <>s__8.Current; <actor>5__10 = <p>5__9.photonView.OwnerActorNr; <>4__this._respawnDueAt[<actor>5__10] = <when>5__1; <>4__this._respawnPos[<actor>5__10] = <>4__this.PickRandomRespawnPointFarFromTruck(); <p>5__9 = null; } } finally { ((IDisposable)<>s__8).Dispose(); } <>s__8 = default(List<PlayerAvatar>.Enumerator); <>4__this._subRoundActive = true; PvpEvt.SendAll(12); 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 <CoRotateArmLocalY>d__70 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public Transform armTf; public float yAngle; public float holdSeconds; public PvpManager <>4__this; private Vector3 <orig>5__1; private float <until>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoRotateArmLocalY>d__70(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0068: 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) switch (<>1__state) { default: return false; case 0: <>1__state = -1; if ((Object)(object)armTf == (Object)null) { return false; } <orig>5__1 = armTf.localEulerAngles; armTf.localEulerAngles = new Vector3(<orig>5__1.x, yAngle, <orig>5__1.z); <until>5__2 = Time.time + Mathf.Max(0.05f, holdSeconds); break; case 1: <>1__state = -1; break; } if (Time.time < <until>5__2) { <>2__current = null; <>1__state = 1; return true; } if (Object.op_Implicit((Object)(object)armTf)) { armTf.localEulerAngles = <orig>5__1; } 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 readonly Dictionary<int, HashSet<PvpPowerupType>> _powerupsByActor = new Dictionary<int, HashSet<PvpPowerupType>>(); private readonly Dictionary<int, Dictionary<PvpPowerupType, float>> _powerupExpireAt = new Dictionary<int, Dictionary<PvpPowerupType, float>>(); private readonly List<GameObject> _powerupObjects = new List<GameObject>(); private readonly Dictionary<int, PvpShield> _shieldByActor = new Dictionary<int, PvpShield>(); private readonly Dictionary<int, PvpExplosionHazard> _activeExplosionByActor = new Dictionary<int, PvpExplosionHazard>(); private readonly Dictionary<int, PvpGun> _guns = new Dictionary<int, PvpGun>(); private readonly List<Vector3> _portalPositions = new List<Vector3>(); private readonly List<PvpPortal> _portals = new List<PvpPortal>(); private bool _armed; private bool _preArmed; private float _preUntil; private bool _armingInProgress; private float _nextShootReady; private readonly Dictionary<int, int> _lives = new Dictionary<int, int>(); private readonly Dictionary<int, int> _wins = new Dictionary<int, int>(); private readonly Dictionary<int, int> _roundsWon = new Dictionary<int, int>(); private const int START_LIVES = 3; private const int WINS_TO_END = 3; private bool _subRoundActive; private readonly Dictionary<int, float> _respawnDueAt = new Dictionary<int, float>(); private readonly Dictionary<int, Vector3> _respawnPos = new Dictionary<int, Vector3>(); private string _winBanner = null; private float _winBannerUntil = 0f; public static PvpManager Instance { get; private set; } public bool IsArmed => _armed || _preArmed; private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)this); return; } Instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } private void OnDestroy() { if ((Object)(object)Instance == (Object)(object)this) { Instance = null; } } public override void OnJoinedRoom() { try { PvpPlugin.Logger.LogInfo((object)"[PVP] Joined room, waiting for level to be ready..."); } catch (Exception ex) { PvpPlugin.Logger.LogError((object)("[PVP] OnJoinedRoom: " + ex)); } } public override void OnLeftRoom() { _armed = (_preArmed = false); _armingInProgress = false; _powerupsByActor.Clear(); _powerupExpireAt.Clear(); CleanupPowerups(); foreach (PvpShield value in _shieldByActor.Values) { try { if (Object.op_Implicit((Object)(object)value)) { Object.Destroy((Object)(object)((Component)value).gameObject); } } catch { } } _shieldByActor.Clear(); foreach (PvpExplosionHazard value2 in _activeExplosionByActor.Values) { try { if (Object.op_Implicit((Object)(object)value2)) { Object.Destroy((Object)(object)((Component)value2).gameObject); } } catch { } } _activeExplosionByActor.Clear(); CleanupPortals(); _lives.Clear(); _wins.Clear(); _roundsWon.Clear(); _subRoundActive = false; _respawnDueAt.Clear(); _respawnPos.Clear(); _winBanner = null; _winBannerUntil = 0f; } public void OnNewLevelSceneLoaded() { try { _armed = (_preArmed = false); _armingInProgress = false; CleanupPowerups(); CleanupPortals(); foreach (KeyValuePair<int, PvpShield> item in _shieldByActor.ToList()) { DestroyShield(item.Key); } foreach (PvpExplosionHazard value in _activeExplosionByActor.Values) { try { if (Object.op_Implicit((Object)(object)value)) { Object.Destroy((Object)(object)((Component)value).gameObject); } } catch { } } _activeExplosionByActor.Clear(); _wins.Clear(); _lives.Clear(); _subRoundActive = false; _respawnDueAt.Clear(); _respawnPos.Clear(); } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] OnNewLevelSceneLoaded: " + ex.Message)); } } public void TryArmRound() { //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Invalid comparison between Unknown and I4 if (!_armingInProgress && !_preArmed && !_armed) { if (SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null) { PvpPlugin.Logger.LogWarning((object)"[PVP] TryArmRound called but conditions not met."); return; } if ((int)GameDirector.instance.currentState != 2) { PvpPlugin.Logger.LogWarning((object)"[PVP] TryArmRound called but not in Main state."); return; } if (GameDirector.instance.PlayerList == null || GameDirector.instance.PlayerList.Count == 0) { PvpPlugin.Logger.LogWarning((object)"[PVP] TryArmRound called but no players present."); return; } _armingInProgress = true; ((MonoBehaviour)this).StartCoroutine(ArmRoundSequence()); } } [IteratorStateMachine(typeof(<ArmRoundSequence>d__36))] private IEnumerator ArmRoundSequence() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <ArmRoundSequence>d__36(0) { <>4__this = this }; } private void Update() { if (!_armed || SemiFunc.MenuLevel() || (Object)(object)LevelGenerator.Instance == (Object)null || (Object)(object)GameDirector.instance == (Object)null || !PhotonNetwork.InRoom) { return; } Player localPlayer = PhotonNetwork.LocalPlayer; if (localPlayer != null) { if (HasPowerup(localPlayer.ActorNumber, PvpPowerupType.RapidFire)) { if (Input.GetMouseButton(1) && Time.time >= _nextShootReady) { Fire(); } } else if (Input.GetMouseButtonDown(1) && Time.time >= _nextShootReady) { Fire(); } } if (_powerupExpireAt.Count > 0) { float time = Time.time; foreach (KeyValuePair<int, Dictionary<PvpPowerupType, float>> item in _powerupExpireAt.ToList()) { int key = item.Key; Dictionary<PvpPowerupType, float> value = item.Value; foreach (PvpPowerupType item2 in value.Keys.ToList()) { if (value[item2] <= time) { value.Remove(item2); if (_powerupsByActor.TryGetValue(key, out HashSet<PvpPowerupType> value2)) { value2.Remove(item2); } if (item2 == PvpPowerupType.Shield) { DestroyShield(key); } } } if (value.Count == 0) { _powerupExpireAt.Remove(key); } } } if (PhotonNetwork.IsMasterClient && _subRoundActive) { MasterTickRound(); MasterPollRespawns(); } if (Input.GetKeyDown((KeyCode)101)) { TryUseInteractable(); } } public static Transform FindChildDeep(Transform root, string name) { if ((Object)(object)root == (Object)null) { return null; } if (((Object)root).name == name) { return root; } for (int i = 0; i < root.childCount; i++) { Transform child = root.GetChild(i); Transform val = FindChildDeep(child, name); if ((Object)(object)val != (Object)null) { return val; } } return null; } private Transform EnsureGrabberPivot(Transform avatarRoot, out Transform grabber) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00bc: Unknown result type (might be due to invalid IL or missing references) grabber = FindChildDeep(avatarRoot, "Grabber Target"); if ((Object)(object)grabber == (Object)null) { return null; } Transform val = (((Object)(object)grabber.parent != (Object)null) ? grabber.parent.Find("PVP_GrabberParent") : null); if ((Object)(object)val != (Object)null) { return val; } Transform parent = grabber.parent; int siblingIndex = (((Object)(object)parent != (Object)null) ? grabber.GetSiblingIndex() : 0); GameObject val2 = new GameObject("PVP_GrabberParent"); Transform transform = val2.transform; transform.SetParent(parent, false); transform.SetSiblingIndex(siblingIndex); transform.position = grabber.position; transform.rotation = grabber.rotation; transform.localScale = Vector3.one; grabber.SetParent(transform, true); return transform; } private void InitializeLivesAndSync() { _lives.Clear(); List<PlayerAvatar> list = SafePlayers(); foreach (PlayerAvatar item in list) { int ownerActorNr = item.photonView.OwnerActorNr; if (!_wins.ContainsKey(ownerActorNr)) { _wins[ownerActorNr] = 0; } if (!_roundsWon.ContainsKey(ownerActorNr)) { _roundsWon[ownerActorNr] = 0; } _lives[ownerActorNr] = 3; } SendLivesSync(); } private void MasterTickRound() { List<int> list = (from kv in _lives where kv.Value > 0 select kv.Key).ToList(); if (list.Count > 1 || _respawnDueAt.Count != 0) { return; } _respawnDueAt.Clear(); _respawnPos.Clear(); int num = ((list.Count == 1) ? list[0] : (-1)); if (num >= 0) { if (!_wins.ContainsKey(num)) { _wins[num] = 0; } _wins[num]++; PvpEvt.SendAll(11, num); SendLivesSync(); if (_wins[num] >= 3) { _subRoundActive = false; ((MonoBehaviour)this).StartCoroutine(CoFinalWinAndTruck(num)); return; } } _subRoundActive = false; ((MonoBehaviour)this).StartCoroutine(CoResetSubRound()); } public void MasterOnPlayerDeath(PlayerAvatar avatar) { //IL_00e4: Unknown result type (might be due to invalid IL or missing references) if (!PhotonNetwork.IsMasterClient || (Object)(object)avatar == (Object)null || (Object)(object)avatar.photonView == (Object)null) { return; } int ownerActorNr = avatar.photonView.OwnerActorNr; if (_respawnDueAt.ContainsKey(ownerActorNr)) { return; } if (!_lives.ContainsKey(ownerActorNr)) { _lives[ownerActorNr] = 3; } if (_lives[ownerActorNr] <= 0) { return; } _lives[ownerActorNr]--; SendLivesSync(); if (_lives[ownerActorNr] > 0) { _respawnDueAt[ownerActorNr] = Time.realtimeSinceStartup + 5f; _respawnPos[ownerActorNr] = PickRandomRespawnPointFarFromTruck(); _subRoundActive = true; return; } try { ClearAllPowerups(ownerActorNr); } catch { } try { DestroyShield(ownerActorNr); } catch { } if (_activeExplosionByActor.TryGetValue(ownerActorNr, out PvpExplosionHazard value) && Object.op_Implicit((Object)(object)value)) { try { Object.Destroy((Object)(object)((Component)value).gameObject); } catch { } } _activeExplosionByActor.Remove(ownerActorNr); } private Vector3 PickRandomRespawnPointFarFromTruck() { //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_0215: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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_007f: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f2: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) try { List<LevelPoint> list = Object.FindObjectsOfType<LevelPoint>(true).ToList(); if (list == null || list.Count == 0) { PlayerController instance = PlayerController.instance; Vector3? val = ((instance != null) ? new Vector3?(((Component)instance).transform.position) : null); Vector3 val2 = Vector3.up * 0.3f; return (Vector3)(((??)(val.HasValue ? new Vector3?(val.GetValueOrDefault() + val2) : null)) ?? (Vector3.up * 0.3f)); } Vector3 truck = (((Object)(object)TruckSafetySpawnPoint.instance != (Object)null) ? ((Component)TruckSafetySpawnPoint.instance).transform.position : Vector3.zero); float minD = Mathf.Max(0f, PvpPlugin.SpreadMinMetersFromTruck.Value); List<Vector3> list2 = list.Select((LevelPoint p) => ((Component)p).transform.position).ToList(); List<Vector3> list3 = list2.Where((Vector3 p) => Vector3.Distance(p, truck) >= minD).ToList(); if (list3.Count == 0) { list3 = list2; } if (_portalPositions.Count > 0) { list3 = list3.Where((Vector3 pos) => !_portalPositions.Any((Vector3 pp) => Vector2.Distance(new Vector2(pp.x, pp.z), new Vector2(pos.x, pos.z)) < 3.5f)).ToList(); if (list3.Count == 0) { list3 = list2.Where((Vector3 pos) => !_portalPositions.Any((Vector3 pp) => Vector2.Distance(new Vector2(pp.x, pp.z), new Vector2(pos.x, pos.z)) < 3.5f)).ToList(); } if (list3.Count == 0) { list3 = list2; } } int tickCount = Environment.TickCount; Room currentRoom = PhotonNetwork.CurrentRoom; Random random = new Random(tickCount ^ ((currentRoom != null) ? currentRoom.Name.GetHashCode() : 0)); return list3[random.Next(list3.Count)] + Vector3.up * 0.2f; } catch { return Vector3.up * 0.3f; } } private void MasterPollRespawns() { //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) if (_respawnDueAt.Count == 0) { return; } float realtimeSinceStartup = Time.realtimeSinceStartup; foreach (KeyValuePair<int, float> item in _respawnDueAt.ToList()) { if (realtimeSinceStartup < item.Value) { continue; } int key = item.Key; PlayerAvatar val = FindAvatarByActor(key); _respawnDueAt.Remove(key); if ((Object)(object)val == (Object)null) { _respawnPos.Remove(key); continue; } try { val.Revive(false); } catch { } try { PlayerHealth component = ((Component)val).GetComponent<PlayerHealth>(); if ((Object)(object)component != (Object)null) { component.HealOther(999, true); } } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] Heal on revive warn: " + ex.Message)); } Vector3 value; Vector3 val2 = (_respawnPos.TryGetValue(key, out value) ? value : (((Component)val).transform.position + Vector3.up * 0.3f)); _respawnPos.Remove(key); Quaternion val3 = Quaternion.Euler(0f, ((Component)val).transform.eulerAngles.y, 0f); try { val.Spawn(val2, val3); } catch { } try { PlayerAvatarVisuals field = GetField<PlayerAvatarVisuals>(val, "playerAvatarVisuals", null); if ((Object)(object)field != (Object)null) { ((Component)field).gameObject.SetActive(true); } ((Component)val).gameObject.SetActive(true); } catch { } } } [IteratorStateMachine(typeof(<CoResetSubRound>d__45))] private IEnumerator CoResetSubRound() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoResetSubRound>d__45(0) { <>4__this = this }; } private List<PlayerAvatar> SafePlayers() { try { return GameDirector.instance?.PlayerList?.Where((PlayerAvatar p) => (Object)(object)p != (Object)null && (Object)(object)p.photonView != (Object)null && p.photonView.Owner != null).ToList() ?? new List<PlayerAvatar>(); } catch { return new List<PlayerAvatar>(); } } private void SendLivesSync() { try { int[] array = _lives.Keys.OrderBy((int a) => a).ToArray(); int value3; int[] array2 = array.Select((int a) => _lives.TryGetValue(a, out value3) ? value3 : 0).ToArray(); int value2; int[] array3 = array.Select((int a) => _wins.TryGetValue(a, out value2) ? value2 : 0).ToArray(); int value; int[] array4 = array.Select((int a) => _roundsWon.TryGetValue(a, out value) ? value : 0).ToArray(); PvpEvt.SendAll(10, array, array2, array3, array4); } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] SendLivesSync: " + ex.Message)); } } public void ApplyRoundSync(int[] actors, int[] lives, int[] wins, int[] rounds = null) { try { _lives.Clear(); _wins.Clear(); if (rounds == null) { _roundsWon.Clear(); } for (int i = 0; i < actors.Length; i++) { int key = actors[i]; _lives[key] = lives[Mathf.Clamp(i, 0, lives.Length - 1)]; _wins[key] = wins[Mathf.Clamp(i, 0, wins.Length - 1)]; if (rounds != null) { _roundsWon[key] = rounds[Mathf.Clamp(i, 0, rounds.Length - 1)]; } } } catch { } } public void AnnounceWinner(int winnerActor) { try { Room currentRoom = PhotonNetwork.CurrentRoom; Player value; string text = ((currentRoom != null && currentRoom.Players.TryGetValue(winnerActor, out value)) ? value.NickName : $"Player {winnerActor}"); _winBanner = text + " wins the round!"; _winBannerUntil = Time.time + 5f; PvpPlugin.Logger.LogInfo((object)("[PVP] Round won by " + text)); } catch { } } public void OnRoundResetAnnounce() { } [IteratorStateMachine(typeof(<CoFinalWinAndTruck>d__51))] private IEnumerator CoFinalWinAndTruck(int winnerActor) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoFinalWinAndTruck>d__51(0) { <>4__this = this, winnerActor = winnerActor }; } private void TryStartTruck() { try { if ((Object)(object)RunManager.instance != (Object)null) { RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)1); PvpPlugin.Logger.LogInfo((object)"[PVP] Called RunManager.ChangeLevel (match end)."); return; } MonoBehaviour val = ((IEnumerable<MonoBehaviour>)Object.FindObjectsOfType<MonoBehaviour>(true)).FirstOrDefault((Func<MonoBehaviour, bool>)((MonoBehaviour mb) => ((Object)mb).name.Contains("Truck", StringComparison.OrdinalIgnoreCase) || ((object)mb).GetType().Name.Contains("Truck", StringComparison.OrdinalIgnoreCase) || ((object)mb).GetType().Name.Contains("Vehicle", StringComparison.OrdinalIgnoreCase))); (((object)val)?.GetType().GetMethods().FirstOrDefault((MethodInfo x) => x.Name.ToLower().Contains("start") || x.Name.ToLower().Contains("drive")))?.Invoke(val, null); PvpPlugin.Logger.LogInfo((object)"[PVP] Fallback: attempted to start the truck."); } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] Could not start truck automatically: " + ex.Message)); } } private void DistributeSpawnsMaster() { //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0150: 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) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_0272: Unknown result type (might be due to invalid IL or missing references) //IL_0281: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_0285: Unknown result type (might be due to invalid IL or missing references) //IL_028f: Unknown result type (might be due to invalid IL or missing references) //IL_0294: Unknown result type (might be due to invalid IL or missing references) //IL_0299: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02bb: Unknown result type (might be due to invalid IL or missing references) //IL_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_035f: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_034c: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_0373: Unknown result type (might be due to invalid IL or missing references) //IL_03a3: Unknown result type (might be due to invalid IL or missing references) //IL_03a5: Unknown result type (might be due to invalid IL or missing references) try { List<PlayerAvatar> list = SafePlayers(); List<LevelPoint> list2 = Object.FindObjectsOfType<LevelPoint>(true).ToList(); if (list.Count == 0 || list2.Count == 0) { return; } Vector3 truck = (((Object)(object)TruckSafetySpawnPoint.instance != (Object)null) ? ((Component)TruckSafetySpawnPoint.instance).transform.position : Vector3.zero); float minD = Mathf.Max(0f, PvpPlugin.SpreadMinMetersFromTruck.Value); List<Vector3> eligible = (from p in list2 where Vector3.Distance(((Component)p).transform.position, truck) >= minD select ((Component)p).transform.position).ToList(); if (eligible.Count == 0) { eligible = list2.Select((LevelPoint p) => ((Component)p).transform.position).ToList(); } List<Vector3> list3 = new List<Vector3>(); Random rnd = new Random((PhotonNetwork.CurrentRoom != null) ? PhotonNetwork.CurrentRoom.Name.GetHashCode() : Environment.TickCount); list3.Add(PickRandom()); while (list3.Count < list.Count && eligible.Count > 0) { Vector3 item = eligible[0]; float num = -1f; foreach (Vector3 item2 in eligible) { float num2 = float.MaxValue; foreach (Vector3 item3 in list3) { num2 = Mathf.Min(num2, Vector3.Distance(item2, item3)); } if (num2 > num) { num = num2; item = item2; } } list3.Add(item); } List<int> list4 = list.Select((PlayerAvatar p) => p.photonView.Owner.ActorNumber).ToList(); list4.Sort(); List<float> list5 = new List<float>(list4.Count * 3); for (int i = 0; i < list4.Count; i++) { Vector3 val = ((i < list3.Count) ? list3[i] : list3.Last()); val += Vector3.up * 0.2f; list5.Add(val.x); list5.Add(val.y); list5.Add(val.z); } PvpEvt.SendAll(1, list5.ToArray()); Vector3 val4 = default(Vector3); for (int j = 0; j < list4.Count; j++) { int actor = list4[j]; PlayerAvatar val2 = ((IEnumerable<PlayerAvatar>)list).FirstOrDefault((Func<PlayerAvatar, bool>)((PlayerAvatar p) => p.photonView.OwnerActorNr == actor)); if ((Object)(object)val2 != (Object)null) { Camera main = Camera.main; Quaternion val3 = (((Object)(object)main != (Object)null) ? Quaternion.Euler(0f, ((Component)main).transform.eulerAngles.y, 0f) : Quaternion.identity); ((Vector3)(ref val4))..ctor(list5[j * 3], list5[j * 3 + 1], list5[j * 3 + 2]); val2.Spawn(val4, val3); } } Vector3 PickRandom() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) return eligible[rnd.Next(eligible.Count)]; } } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] DistributeSpawnsMaster: " + ex.Message)); } } public void ApplySpawnPointsFromMaster(float[] packed) { } private void ChooseAndBroadcastPortalsMaster() { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0139: 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_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0159: Unknown result type (might be due to invalid IL or missing references) //IL_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023b: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0257: 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_0275: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_0179: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) try { _portalPositions.Clear(); CleanupPortals(); List<LevelPoint> list = Object.FindObjectsOfType<LevelPoint>(true).ToList(); if (list.Count == 0) { return; } Vector3 truck = (((Object)(object)TruckSafetySpawnPoint.instance != (Object)null) ? ((Component)TruckSafetySpawnPoint.instance).transform.position : Vector3.zero); float minD = Mathf.Max(0f, PvpPlugin.SpreadMinMetersFromTruck.Value); List<Vector3> list2 = (from p in list where Vector3.Distance(((Component)p).transform.position, truck) >= minD select ((Component)p).transform.position).ToList(); if (list2.Count < 4) { list2 = list.Select((LevelPoint p) => ((Component)p).transform.position).ToList(); } if (list2.Count == 0) { return; } List<Vector3> list3 = new List<Vector3>(); int tickCount = Environment.TickCount; Room currentRoom = PhotonNetwork.CurrentRoom; Random random = new Random(tickCount ^ ((currentRoom != null) ? currentRoom.Name.GetHashCode() : 0)); while (list3.Count < 4 && list2.Count > 0) { Vector3 item = list2[0]; float num = -1f; foreach (Vector3 item2 in list2) { float num2 = float.MaxValue; foreach (Vector3 item3 in list3) { num2 = Mathf.Min(num2, Vector3.Distance(item2, item3)); } if (num2 > num) { num = num2; item = item2; } } list3.Add(item); list2.Remove(item); } _portalPositions.Clear(); List<float> list4 = new List<float>(12); foreach (Vector3 item4 in list3) { Vector3 val = item4 + Vector3.up * 0.2f; _portalPositions.Add(val); list4.Add(val.x); list4.Add(val.y); list4.Add(val.z); } PvpEvt.SendAll(5, list4.ToArray()); } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] ChooseAndBroadcastPortalsMaster: " + ex.Message)); } } public void ApplyPortalsFromMaster(float[] packed) { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) try { CleanupPortals(); _portalPositions.Clear(); for (int i = 0; i + 2 < packed.Length; i += 3) { if (_portalPositions.Count >= 4) { break; } _portalPositions.Add(new Vector3(packed[i], packed[i + 1], packed[i + 2])); } for (int j = 0; j < _portalPositions.Count; j++) { GameObject val = new GameObject("PVP_PortalRoot"); val.transform.position = _portalPositions[j]; PvpPortal pvpPortal = val.AddComponent<PvpPortal>(); pvpPortal.PairIndex = ((j >= 2) ? 1 : 0); Color tint = ((pvpPortal.PairIndex == 0) ? new Color(1f, 0.25f, 0.25f, 0.5f) : new Color(0.25f, 0.45f, 1f, 0.5f)); pvpPortal.InitVisual(tint); _portals.Add(pvpPortal); } if (_portals.Count >= 4) { _portals[0].Linked = _portals[1]; _portals[1].Linked = _portals[0]; _portals[2].Linked = _portals[3]; _portals[3].Linked = _portals[2]; } } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] ApplyPortalsFromMaster: " + ex.Message)); } } private void CleanupPortals() { foreach (PvpPortal portal in _portals) { try { if (Object.op_Implicit((Object)(object)portal)) { Object.Destroy((Object)(object)((Component)portal).gameObject); } } catch { } } _portals.Clear(); } private void SpawnPowerupsMaster() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: 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) try { CleanupPowerups(); List<LevelPoint> list = Object.FindObjectsOfType<LevelPoint>(true).ToList(); if (list.Count == 0) { return; } for (int i = 0; i < list.Count; i++) { LevelPoint val = list[i]; Vector3 posBase = ((Component)val).transform.position; if (!_portalPositions.Any((Vector3 pp) => Vector2.Distance(new Vector2(pp.x, pp.z), new Vector2(posBase.x, posBase.z)) < 3.5f)) { Vector3 val2 = posBase + new Vector3(0f, PvpPlugin.PowerupHoverYOffset.Value, 0f); int num = i % 5; PvpEvt.SendAll(2, num, val2.x, val2.y, val2.z); } } } catch (Exception ex) { PvpPlugin.Logger.LogWarning((object)("[PVP] SpawnPowerupsMaster: " + ex.Message)); } } public void SpawnPowerupVisual(int type, Vector3 pos) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_004b: 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_00d8: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.CreatePrimitive((PrimitiveType)3); PvpPowerupType pvpPowerupType = (PvpPowerupType)type; ((Object)val).name = "PVP_Powerup_" + pvpPowerupType; val.transform.position = pos; val.transform.localScale = new Vector3(0.25f, 0.25f, 0.25f); Collider component = val.GetComponent<Collider>(); if ((Object)(object)component != (Object)null) { component.isTrigger = true; } Rigidbody val2 = val.AddComponent<Rigidbody>(); val2.isKinematic = true; val2.useGravity = false; MeshRenderer component2 = val.GetComponent<MeshRenderer>(); if ((Object)(object)component2 != (Object)null) { ((Renderer)component2).material = BuildTranslucentMat(ColorFor((PvpPowerupType)type, 0.6f)); } PvpPowerup pvpPowerup = val.AddComponent<PvpPowerup>(); pvpPowerup.Manager = this; pvpPowerup.Type = (PvpPowerupType)type; GameObject val3 = new GameObject("Label"); val3.transform.SetParent(val.transform, false); val3.transform.localPosition = new Vector3(0f, 1.05f, 0f); TextMeshPro val4 = val3.AddComponent<TextMeshPro>(); ((TMP_Text)val4).fontSize = 1.25f; ((TMP_Text)val4).alignment = (TextAlignmentOptions)514; ((Graphic)val4).color = new Color(0.95f, 1f, 1f, 0.95f); ((TMP_Text)val4).text = LabelFor((PvpPowerupType)type); ((TMP_Text)val4).enableAutoSizing = false; pvpPowerup.InitHover(pos, PvpPlugin.PowerupBobAmplitude.Value, PvpPlugin.PowerupBobSpeed.Value, PvpPlugin.PowerupRotateSpeed.Value); _powerupObjects.Add(val); } public static Material BuildTranslucentMat(Color tint) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Expected O, but got Unknown //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) Material val = null; Shader val2 = Shader.Find("Standard"); if ((Object)(object)val2 != (Object)null) { val = new Material(val2); if (val.HasProperty("_Mode")) { val.SetFloat("_Mode", 3f); } val.SetInt("_SrcBlend", 5); val.SetInt("_DstBlend", 10); val.SetInt("_ZWrite", 0); val.DisableKeyword("_ALPHATEST_ON"); val.EnableKeyword("_ALPHABLEND_ON"); val.DisableKeyword("_ALPHAPREMULTIPLY_ON"); val.renderQueue = 3000; if (val.HasProperty("_Color")) { val.color = tint; } return val; } Shader val3 = Shader.Find("Unlit/Color"); if ((Object)(object)val3 != (Object)null) { val = new Material(val3); if (val.HasProperty("_Color")) { val.color = tint; } return val; } val = new Material(Shader.Find("Sprites/Default") ?? Shader.Find("UI/Default")); if (val.HasProperty("_Color")) { val.color = tint; } val.renderQueue = 3000; return val; } private static string LabelFor(PvpPowerupType t) { if (1 == 0) { } string result = t switch { PvpPowerupType.RapidFire => "Rapid Fire", PvpPowerupType.DoubleShot => "Double Shot", PvpPowerupType.HeavyRounds => "Heavy Rounds", PvpPowerupType.Shield => "Shield", _ => "Explosive", }; if (1 == 0) { } return result; } public static Color ColorFor(PvpPowerupType t, float a = 1f) { //IL_002c: 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_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0079: 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_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) if (1 == 0) { } Color result = (Color)(t switch { PvpPowerupType.RapidFire => new Color(1f, 0.55f, 0.1f, a), PvpPowerupType.DoubleShot => new Color(0.3f, 0.8f, 1f, a), PvpPowerupType.HeavyRounds => new Color(0.9f, 0.2f, 0.3f, a), PvpPowerupType.Shield => new Color(0.45f, 1f, 0.45f, a), _ => new Color(0.8f, 0.6f, 1f, a), }); if (1 == 0) { } return result; } private void CleanupPowerups() { foreach (GameObject powerupObject in _powerupObjects) { try { if (Object.op_Implicit((Object)(object)powerupObject)) { Object.Destroy((Object)(object)powerupObject); } } catch { } } _powerupObjects.Clear(); } private void TryUseInteractable() { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c3: 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_0249: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_0267: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_027a: Unknown result type (might be due to invalid IL or missing references) PlayerController instance = PlayerController.instance; PlayerAvatar val = (((Object)(object)instance != (Object)null) ? instance.playerAvatarScript : null); if ((Object)(object)val == (Object)null) { return; } Vector3 position = ((Component)val).transform.position; float value = PvpPlugin.PowerupInteractRadius.Value; PvpPortal pvpPortal = null; float num = float.MaxValue; foreach (PvpPortal portal in _portals) { if (Object.op_Implicit((Object)(object)portal)) { float num2 = Vector3.Distance(((Component)portal).transform.position, position); if (num2 <= value && num2 < num) { num = num2; pvpPortal = portal; } } } if ((Object)(object)pvpPortal != (Object)null) { return; } PvpPowerup pvpPowerup = null; num = float.MaxValue; foreach (GameObject powerupObject in _powerupObjects) { if (!Object.op_Implicit((Object)(object)powerupObject)) { continue; } PvpPowerup component = powerupObject.GetComponent<PvpPowerup>(); if (!((Object)(object)component == (Object)null) && component.CanBePicked) { float num3 = Vector3.Distance(powerupObject.transform.position, position); if (num3 <= value && num3 < num) { num = num3; pvpPowerup = component; } } } if ((Object)(object)pvpPowerup == (Object)null) { return; } Player localPlayer = PhotonNetwork.LocalPlayer; if (localPlayer != null) { int actorNumber = localPlayer.ActorNumber; Vector3 position2 = ((Component)pvpPowerup).transform.position; int type = (int)pvpPowerup.Type; if (!PhotonNetwork.IsMasterClient) { PvpEvt.SendMaster(3, actorNumber, type, position2.x, position2.y, position2.z); } else { PvpEvt.SendAll(3, actorNumber, type, position2.x, position2.y, position2.z); } Sfx.PlayAt(position2, PvpPlugin.SfxPickup, PvpPlugin.SfxVolume.Value); } } public void ApplyPowerup(int actor, PvpPowerupType type, bool broadcast) { ClearAllPowerups(actor); HashSet<PvpPowerupType> value = new HashSet<PvpPowerupType> { type }; _powerupsByActor[actor] = value; float num = ((type == PvpPowerupType.Shield) ? 10f : 30f); _powerupExpireAt[actor] = new Dictionary<PvpPowerupType, float> { [type] = Time.time + num }; if (type == PvpPowerupType.Shield) { EnsureShield(actor); } } private void ClearAllPowerups(int actor) { if (_powerupsByActor.ContainsKey(actor)) { _powerupsByActor[actor].Clear(); } if (_powerupExpireAt.ContainsKey(actor)) { _powerupExpireAt[actor].Clear(); } DestroyShield(actor); } public void HandlePowerupPickedAt(PvpPowerupType type, Vector3 pos) { //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) PvpPowerup pvpPowerup = null; float num = float.MaxValue; foreach (GameObject powerupObject in _powerupObjects) { if (!Object.op_Implicit((Object)(object)powerupObject)) { continue; } PvpPowerup component = powerupObject.GetComponent<PvpPowerup>(); if (!((Object)(object)component == (Object)null) && component.Type == type) { float num2 = Vector3.SqrMagnitude(powerupObject.transform.position - pos); if (num2 < num) { num = num2; pvpPowerup = component; } } } pvpPowerup?.PlayPickupAndHide(PvpPlugin.PowerupPickupHideSeconds.Value); } public bool HasPowerup(int actor, PvpPowerupType t) { HashSet<PvpPowerupType> value; return _powerupsByActor.TryGetValue(actor, out value) && value.Contains(t); } public void ShowGunFlash(int actor, int typeOrMinus1, float duration) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown try { PlayerAvatar val = FindAvatarByActor(actor); if ((Object)(object)val == (Object)null) { return; } Transform val2 = FindChildDeep(((Component)val).transform, "ANIM ARM R"); Transform grabber; Transform val3 = EnsureGrabberPivot(((Component)val).transform, out grabber); if (!_guns.TryGetValue(actor, out PvpGun value) || (Object)(object)value == (Object)null) { GameObject val4 = new GameObject("PVP_Gun"); Transform val5 = (((Object)(object)val3 != (Object)null) ? val3 : (((Object)(object)grabber != (Object)null) ? grabber : ((Component)val).transform)); val4.transform.SetParent(val5, false); value = val4.AddComponent<PvpGun>(); _guns[actor] = value; } else { Transform val6 = val3 ?? grabber ?? ((Component)val).transform; if ((Object)(object)((Component)value).transform.parent != (Object)(object)val6) { ((Component)value).transform.SetParent(val6, false); } } value.Setup(this, actor); value.Show(typeOrMinus1, duration); if ((Object)(object)val2 != (Object)null) { ((MonoBehaviour)this).StartCoroutine(CoRotateArmLocalY(val2, -90f, duration)); } } catch { } } [IteratorStateMachine(typeof(<CoRotateArmLocalY>d__70))] private IEnumerator CoRotateArmLocalY(Transform armTf, float yAngle, float holdSeconds) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoRotateArmLocalY>d__70(0) { <>4__this = this, armTf = armTf, yAngle = yAngle,