Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of AntiInfiniteStamina v1.0.2
AntiInfiniteStamina.dll
Decompiled 3 weeks agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; 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 HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using UnityEngine; using UnityEngine.Networking; using UnityEngine.Rendering; [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("REPOJP")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("REPOJP")] [assembly: AssemblyTitle("REPOJP")] [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; } } } [BepInPlugin("REPOJP.AntiInfiniteStamina", "AntiInfiniteStamina", "1.0.3")] public class AntiInfiniteStaminaPlugin : BaseUnityPlugin { private sealed class SprintTracker { public int StableId; public string PlayerName = string.Empty; public string SteamId = string.Empty; public float CurrentSprintSeconds; public float NonSprintGraceSeconds; public float MaxObservedSprintSeconds; public float LastAllowedSprintSeconds; public int LastStaminaUpgrade; public int LastSpeedUpgrade; public bool WarnedThisChain; public int SuspiciousCount; public float CurrentSpeedAnomalySeconds; public float MaxObservedHorizontalSpeed; public float LastSeenTime; } private sealed class OverlayMessage { public string Text = string.Empty; public string TeleportHint = string.Empty; public float CreatedAt; public float ExpiresAt; public int TargetStableId; public string TargetPlayerName = string.Empty; } private sealed class PlayerOutlineShellMarker : MonoBehaviour { } private sealed class PlayerOutlineShellController : MonoBehaviour { private Material outlineMaterial; private PlayerAvatar targetPlayer; private readonly List<GameObject> outlineShellObjects = new List<GameObject>(); private bool outlineVisible; private Color outlineColor = new Color(1f, 0.84f, 0.06f, 1f); private float lastBuildAttemptTime; private const float OutlineScaleMultiplier = 1.06f; private const float RebuildRetrySeconds = 1f; public void Initialize(PlayerAvatar player) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) targetPlayer = player; ((Object)this).hideFlags = (HideFlags)61; EnsureOutlineMaterial(); TryBuildOutlineShells(); SetOutlineVisible(visible: false, outlineColor); } public void SetOutlineVisible(bool visible, Color color) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) outlineVisible = visible; outlineColor = color; EnsureOutlineMaterial(); ApplyOutlineMaterialColor(); if (outlineVisible) { TryBuildOutlineShells(); } ApplyOutlineVisibility(); } private void Update() { if ((Object)(object)targetPlayer == (Object)null) { Object.Destroy((Object)(object)this); } else if (outlineVisible && (outlineShellObjects.Count == 0 || !HasAnyValidShell()) && Time.unscaledTime - lastBuildAttemptTime >= 1f) { TryBuildOutlineShells(); ApplyOutlineVisibility(); } } private void OnDestroy() { ClearOutlineShells(); if ((Object)(object)outlineMaterial != (Object)null) { Object.Destroy((Object)(object)outlineMaterial); outlineMaterial = null; } } private void EnsureOutlineMaterial() { //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Expected O, but got Unknown if ((Object)(object)outlineMaterial != (Object)null) { return; } Shader val = Shader.Find("Standard"); if ((Object)(object)val == (Object)null) { val = Shader.Find("Legacy Shaders/Diffuse"); } if ((Object)(object)val == (Object)null) { val = Shader.Find("Sprites/Default"); } if (!((Object)(object)val == (Object)null)) { outlineMaterial = new Material(val); ((Object)outlineMaterial).name = "AntiInfiniteStaminaDetectedOutline"; ((Object)outlineMaterial).hideFlags = (HideFlags)61; outlineMaterial.enableInstancing = true; if (outlineMaterial.HasProperty("_Glossiness")) { outlineMaterial.SetFloat("_Glossiness", 0f); } if (outlineMaterial.HasProperty("_Metallic")) { outlineMaterial.SetFloat("_Metallic", 0f); } if (outlineMaterial.HasProperty("_Cull")) { outlineMaterial.SetInt("_Cull", 1); } if (outlineMaterial.HasProperty("_ZWrite")) { outlineMaterial.SetInt("_ZWrite", 1); } ApplyOutlineMaterialColor(); } } private void ApplyOutlineMaterialColor() { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)outlineMaterial == (Object)null)) { if (outlineMaterial.HasProperty("_Color")) { outlineMaterial.SetColor("_Color", outlineColor); } if (outlineMaterial.HasProperty("_EmissionColor")) { outlineMaterial.EnableKeyword("_EMISSION"); outlineMaterial.SetColor("_EmissionColor", outlineColor * 2.4f); } } } private void TryBuildOutlineShells() { //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Expected O, but got Unknown //IL_01b1: 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_01d5: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) lastBuildAttemptTime = Time.unscaledTime; if ((Object)(object)targetPlayer == (Object)null) { return; } if ((Object)(object)outlineMaterial == (Object)null) { EnsureOutlineMaterial(); if ((Object)(object)outlineMaterial == (Object)null) { return; } } if (outlineShellObjects.Count > 0 && HasAnyValidShell()) { return; } ClearOutlineShells(); GameObject val = null; val = (((Object)(object)targetPlayer.playerAvatarVisuals != (Object)null && (Object)(object)targetPlayer.playerAvatarVisuals.meshParent != (Object)null) ? targetPlayer.playerAvatarVisuals.meshParent : ((!((Object)(object)targetPlayer.playerAvatarVisuals != (Object)null)) ? ((Component)targetPlayer).gameObject : ((Component)targetPlayer.playerAvatarVisuals).gameObject)); MeshRenderer[] componentsInChildren = val.GetComponentsInChildren<MeshRenderer>(true); foreach (MeshRenderer val2 in componentsInChildren) { if ((Object)(object)val2 == (Object)null || (Object)(object)((Component)val2).GetComponent<PlayerOutlineShellMarker>() != (Object)null) { continue; } MeshFilter component = ((Component)val2).GetComponent<MeshFilter>(); if (!((Object)(object)component == (Object)null) && !((Object)(object)component.sharedMesh == (Object)null)) { GameObject val3 = new GameObject(((Object)val2).name + "_DetectedOutlineShell"); ((Object)val3).hideFlags = (HideFlags)61; val3.transform.SetParent(((Component)val2).transform, false); val3.transform.localPosition = Vector3.zero; val3.transform.localRotation = Quaternion.identity; val3.transform.localScale = Vector3.one * 1.06f; val3.layer = ((Component)val2).gameObject.layer; val3.AddComponent<PlayerOutlineShellMarker>(); MeshFilter val4 = val3.AddComponent<MeshFilter>(); val4.sharedMesh = component.sharedMesh; MeshRenderer val5 = val3.AddComponent<MeshRenderer>(); int num = Mathf.Max(1, (((Renderer)val2).sharedMaterials == null) ? 1 : ((Renderer)val2).sharedMaterials.Length); Material[] array = (Material[])(object)new Material[num]; for (int j = 0; j < num; j++) { array[j] = outlineMaterial; } ((Renderer)val5).sharedMaterials = array; ((Renderer)val5).shadowCastingMode = (ShadowCastingMode)0; ((Renderer)val5).receiveShadows = false; ((Renderer)val5).motionVectorGenerationMode = (MotionVectorGenerationMode)2; ((Renderer)val5).lightProbeUsage = (LightProbeUsage)0; ((Renderer)val5).reflectionProbeUsage = (ReflectionProbeUsage)0; ((Renderer)val5).allowOcclusionWhenDynamic = false; ((Renderer)val5).enabled = outlineVisible; outlineShellObjects.Add(val3); } } } private void ApplyOutlineVisibility() { for (int num = outlineShellObjects.Count - 1; num >= 0; num--) { GameObject val = outlineShellObjects[num]; if ((Object)(object)val == (Object)null) { outlineShellObjects.RemoveAt(num); } else { MeshRenderer component = val.GetComponent<MeshRenderer>(); if ((Object)(object)component != (Object)null) { ((Renderer)component).enabled = outlineVisible; } } } } private void ClearOutlineShells() { for (int num = outlineShellObjects.Count - 1; num >= 0; num--) { GameObject val = outlineShellObjects[num]; if ((Object)(object)val != (Object)null) { Object.Destroy((Object)(object)val); } } outlineShellObjects.Clear(); } private bool HasAnyValidShell() { for (int i = 0; i < outlineShellObjects.Count; i++) { if ((Object)(object)outlineShellObjects[i] != (Object)null) { return true; } } return false; } } [CompilerGenerated] private sealed class <LoadWarningAudioCoroutine>d__80 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string filePath; public AntiInfiniteStaminaPlugin <>4__this; private string <uri>5__1; private UnityWebRequest <request>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <LoadWarningAudioCoroutine>d__80(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(); } } <uri>5__1 = null; <request>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Invalid comparison between Unknown and I4 bool result; try { switch (<>1__state) { default: result = false; break; case 0: <>1__state = -1; <uri>5__1 = new Uri(filePath).AbsoluteUri; <request>5__2 = UnityWebRequestMultimedia.GetAudioClip(<uri>5__1, (AudioType)14); <>1__state = -3; <>2__current = <request>5__2.SendWebRequest(); <>1__state = 1; result = true; break; case 1: <>1__state = -3; if ((int)<request>5__2.result != 1) { DebugLog("Warning audio load failed / 警告音読込失敗\n" + <request>5__2.error); <>4__this.warningAudioClip = <>4__this.CreateFallbackWarningClip(); result = false; <>m__Finally1(); break; } <>4__this.warningAudioClip = DownloadHandlerAudioClip.GetContent(<request>5__2); if ((Object)(object)<>4__this.warningAudioClip == (Object)null) { <>4__this.warningAudioClip = <>4__this.CreateFallbackWarningClip(); } <>m__Finally1(); <request>5__2 = null; result = false; break; } } catch { //try-fault ((IDisposable)this).Dispose(); throw; } return result; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } private void <>m__Finally1() { <>1__state = -1; if (<request>5__2 != null) { ((IDisposable)<request>5__2).Dispose(); } } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <TeleportStabilizeCoroutine>d__107 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PlayerAvatar localPlayer; public Vector3 destination; public Quaternion rotation; public AntiInfiniteStaminaPlugin <>4__this; private int <i>5__1; private PlayerController <playerController>5__2; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <TeleportStabilizeCoroutine>d__107(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <playerController>5__2 = null; <>1__state = -2; } private bool MoveNext() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0096: 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) switch (<>1__state) { default: return false; case 0: <>1__state = -1; <i>5__1 = 0; break; case 1: <>1__state = -1; <playerController>5__2 = PlayerController.instance; if ((Object)(object)localPlayer == (Object)null || (Object)(object)<playerController>5__2 == (Object)null) { <>4__this.teleportStabilizeCoroutine = null; return false; } <>4__this.ApplyManualTeleportPose(localPlayer, <playerController>5__2, destination, rotation, <i>5__1 == 3); <playerController>5__2 = null; <i>5__1++; break; } if (<i>5__1 < 4) { <>2__current = (object)new WaitForFixedUpdate(); <>1__state = 1; return true; } <>4__this.teleportStabilizeCoroutine = null; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } internal static AntiInfiniteStaminaPlugin Instance; internal static ManualLogSource LogSource; internal static ConfigEntry<bool> EnableMod; internal static ConfigEntry<bool> EnableDebugLog; internal static ConfigEntry<float> AllowedExtraSprintSeconds; internal static ConfigEntry<float> SprintBreakGraceSeconds; internal static ConfigEntry<float> MinimumHorizontalSpeedToCountSprint; internal static ConfigEntry<bool> WarnInConsole; internal static ConfigEntry<bool> ShowWarningOverlay; internal static ConfigEntry<int> WarningFontSize; internal static ConfigEntry<float> WarningDisplaySeconds; internal static ConfigEntry<float> DetectedPlayerOutlineSeconds; internal static ConfigEntry<string> TeleportToWarningPlayerKey; internal static ConfigEntry<bool> EnableSpeedAnomalyAssist; internal static ConfigEntry<float> SpeedAnomalyMultiplier; internal static ConfigEntry<float> SpeedAnomalyMinimumSeconds; internal static ConfigEntry<bool> IgnoreLocalPlayer; internal static ConfigEntry<string> LanguageSetting; private Harmony harmony; private static FieldInfo fiSteamId; private static FieldInfo fiIsSprinting; private static FieldInfo fiIsMoving; private static FieldInfo fiIsTumbling; private static FieldInfo fiIsCrawling; private static FieldInfo fiRbVelocityRaw; private static FieldInfo fiRbVelocity; private static FieldInfo fiDeadSet; private static FieldInfo fiPlayerName; private static FieldInfo fiClientPosition; private static FieldInfo fiClientPositionCurrent; private static FieldInfo fiClientRotation; private static FieldInfo fiClientRotationCurrent; private static FieldInfo fiPcVelocityRelativeNew; private static FieldInfo fiPcVelocityImpulse; private static FieldInfo fiPcMoveForceDirection; private static FieldInfo fiPcMoveForceAmount; private static FieldInfo fiPcMoveForceTimer; private static FieldInfo fiPcPositionPrevious; private readonly Dictionary<int, SprintTracker> trackerMap = new Dictionary<int, SprintTracker>(); private readonly List<OverlayMessage> overlayMessages = new List<OverlayMessage>(); private readonly Dictionary<int, float> detectedOutlineExpireMap = new Dictionary<int, float>(); private readonly Dictionary<int, PlayerOutlineShellController> outlineControllerMap = new Dictionary<int, PlayerOutlineShellController>(); private bool previousRunIsLevel; private bool autoTranslatorChecked; private readonly float autoTranslatorCheckTime = 8f; private AudioSource warningAudioSource; private AudioClip warningAudioClip; private bool warningAudioLoadStarted; private Texture2D warningBarGradientTexture; private Texture2D warningBarHighlightTexture; private Coroutine teleportStabilizeCoroutine; private const float TeleportInitialBackDistance = 1.35f; private const float TeleportMaxBackDistance = 9.75f; private const float TeleportBackDistanceStep = 0.35f; private const float TeleportGroundProbeHeight = 3.5f; private const float TeleportGroundProbeDistance = 8f; private const float TeleportCandidateHeightOffset = 0.08f; private const float TeleportCapsulePadding = 0.04f; private const int TeleportDepenetrationPasses = 8; private const int TeleportStabilizeFrames = 4; private const float WarningFadeInSeconds = 0.25f; private const float WarningFadeOutSeconds = 0.25f; private const string WarningAudioDirectoryName = "AntiInfiniteStamina"; private const string WarningAudioFileName = "warning_detect.ogg"; private void Awake() { //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_0296: Expected O, but got Unknown //IL_04fd: Unknown result type (might be due to invalid IL or missing references) //IL_0507: Expected O, but got Unknown Instance = this; LogSource = ((BaseUnityPlugin)this).Logger; ((Component)this).transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); EnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableMod", true, "Enable or disable this mod. このMOD全体の有効無効を切り替えます"); EnableDebugLog = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "EnableDebugLog", false, "Enable detailed debug logs in the console. コンソールへ詳細なデバッグログを出力します"); AllowedExtraSprintSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Detection", "AllowedExtraSprintSeconds", 2.5f, "Additional safe seconds added on top of the theoretical maximum sprint duration. Higher values reduce false positives but also weaken detection. 理論上の最大連続ダッシュ秒数に加算する安全マージンです。大きいほど誤検知は減りますが検出は緩くなります"); SprintBreakGraceSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Detection", "SprintBreakGraceSeconds", 0.35f, "Grace time that still counts as one continuous sprint chain when sprinting briefly stops because of sync jitter or tiny interruptions. 同期ぶれや短い停止で一瞬ダッシュ判定が切れても、連続走行として扱う猶予秒数です"); MinimumHorizontalSpeedToCountSprint = ((BaseUnityPlugin)this).Config.Bind<float>("Detection", "MinimumHorizontalSpeedToCountSprint", 0.15f, "Minimum horizontal movement speed required before sprint time starts counting. 連続ダッシュ秒数の計測を始めるために必要な最低水平速度です"); WarnInConsole = ((BaseUnityPlugin)this).Config.Bind<bool>("Warning", "WarnInConsole", true, "Write warning messages to the BepInEx console and log output. BepInExのコンソールとログへ警告文を出力します"); ShowWarningOverlay = ((BaseUnityPlugin)this).Config.Bind<bool>("Warning", "ShowWarningOverlay", true, "Show warning messages as an animated on-screen overlay on your client. あなたのクライアント画面上にアニメーション付き警告オーバーレイを表示します"); WarningFontSize = ((BaseUnityPlugin)this).Config.Bind<int>("Warning", "WarningFontSize", 26, "Font size used by the warning popup text. 警告ポップアップの文字サイズです"); WarningDisplaySeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Warning", "WarningDisplaySeconds", 5f, "How long the warning popup stays visible before it starts fading out. 警告ポップアップを表示し続けてからフェードアウトを始めるまでの秒数です"); DetectedPlayerOutlineSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Warning", "DetectedPlayerOutlineSeconds", 5f, "How long the detected target keeps a yellow outline after each detection. Set 0 to disable the outline. 検知された対象者へ黄色アウトラインを表示し続ける秒数です。0 でアウトライン機能を無効化します"); TeleportToWarningPlayerKey = ((BaseUnityPlugin)this).Config.Bind<string>("Warning", "TeleportToWarningPlayerKey", "J", "Key used to instantly teleport to the currently displayed warning target while the popup is visible. ポップアップ表示中に現在表示中の警告対象へ即時TPするキーです"); EnableSpeedAnomalyAssist = ((BaseUnityPlugin)this).Config.Bind<bool>("Assist", "EnableSpeedAnomalyAssist", true, "Use suspicious movement speed as an additional helper signal. The main detection is still continuous sprint time. 不自然な移動速度を補助判定として使います。主判定は連続ダッシュ時間です"); SpeedAnomalyMultiplier = ((BaseUnityPlugin)this).Config.Bind<float>("Assist", "SpeedAnomalyMultiplier", 1.15f, "Speed ratio used for the helper anomaly check. 1.15 means 15% faster than the expected sprint speed. This is a practical default, not a value mathematically guaranteed by the game source. 補助用の速度異常判定で使う倍率です。1.15 は想定ダッシュ速度より 15% 速い状態を意味します。これは実用上の初期値であり、ソースコードから一意に導いた絶対最適値ではありません"); SpeedAnomalyMinimumSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Assist", "SpeedAnomalyMinimumSeconds", 5f, "Minimum duration that the suspicious speed condition must continue before it is treated as a helper anomaly. 速度異常の補助判定として扱うために、異常速度が継続しなければならない最低秒数です"); IgnoreLocalPlayer = ((BaseUnityPlugin)this).Config.Bind<bool>("Filtering", "IgnoreLocalPlayer", true, "Legacy compatibility setting. In the current client detection design, your own player is always excluded from detection. 互換性維持用の設定です。現行のクライアント検知仕様では、自分自身は常に検知対象から除外されます"); LanguageSetting = ((BaseUnityPlugin)this).Config.Bind<string>("Localization", "LanguageSetting", "English", new ConfigDescription("Language used by the MOD UI and warning text. Supported values are English, Japanese, Korean, Chinese and Russian. MODのUIと警告文で使う言語です。English、Japanese、Korean、Chinese、Russian に対応しています", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[5] { "English", "Japanese", "Korean", "Chinese", "Russian" }), Array.Empty<object>())); fiSteamId = AccessTools.Field(typeof(PlayerAvatar), "steamID"); fiIsSprinting = AccessTools.Field(typeof(PlayerAvatar), "isSprinting"); fiIsMoving = AccessTools.Field(typeof(PlayerAvatar), "isMoving"); fiIsTumbling = AccessTools.Field(typeof(PlayerAvatar), "isTumbling"); fiIsCrawling = AccessTools.Field(typeof(PlayerAvatar), "isCrawling"); fiRbVelocityRaw = AccessTools.Field(typeof(PlayerAvatar), "rbVelocityRaw"); fiRbVelocity = AccessTools.Field(typeof(PlayerAvatar), "rbVelocity"); fiDeadSet = AccessTools.Field(typeof(PlayerAvatar), "deadSet"); fiPlayerName = AccessTools.Field(typeof(PlayerAvatar), "playerName"); fiClientPosition = AccessTools.Field(typeof(PlayerAvatar), "clientPosition"); fiClientPositionCurrent = AccessTools.Field(typeof(PlayerAvatar), "clientPositionCurrent"); fiClientRotation = AccessTools.Field(typeof(PlayerAvatar), "clientRotation"); fiClientRotationCurrent = AccessTools.Field(typeof(PlayerAvatar), "clientRotationCurrent"); fiPcVelocityRelativeNew = AccessTools.Field(typeof(PlayerController), "VelocityRelativeNew"); fiPcVelocityImpulse = AccessTools.Field(typeof(PlayerController), "VelocityImpulse"); fiPcMoveForceDirection = AccessTools.Field(typeof(PlayerController), "MoveForceDirection"); fiPcMoveForceAmount = AccessTools.Field(typeof(PlayerController), "MoveForceAmount"); fiPcMoveForceTimer = AccessTools.Field(typeof(PlayerController), "MoveForceTimer"); fiPcPositionPrevious = AccessTools.Field(typeof(PlayerController), "positionPrevious"); warningAudioSource = ((Component)this).gameObject.AddComponent<AudioSource>(); warningAudioSource.playOnAwake = false; warningAudioSource.loop = false; warningAudioSource.spatialBlend = 0f; warningAudioSource.volume = 1f; warningAudioSource.ignoreListenerPause = true; warningAudioSource.priority = 0; warningAudioClip = CreateFallbackWarningClip(); ForceTeleportKeyToJ(); CreateWarningBarTextures(); harmony = new Harmony("REPOJP.AntiInfiniteStamina"); harmony.PatchAll(typeof(AntiInfiniteStaminaPlugin)); LogInfo(GetLocalizedText("Loaded")); } private void ForceTeleportKeyToJ() { if (TeleportToWarningPlayerKey != null) { string a = (TeleportToWarningPlayerKey.Value ?? string.Empty).Trim(); if (!string.Equals(a, "J", StringComparison.OrdinalIgnoreCase)) { TeleportToWarningPlayerKey.Value = "J"; ((BaseUnityPlugin)this).Config.Save(); } } } private void OnDestroy() { DisableAllDetectedPlayerOutlines(); if (harmony != null) { harmony.UnpatchSelf(); } } private void Update() { //IL_023f: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0246: 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_0254: Unknown result type (might be due to invalid IL or missing references) //IL_0259: Unknown result type (might be due to invalid IL or missing references) EnsureWarningAudioLoaded(); TryApplyJapaneseFromAutoTranslator(); if (!EnableMod.Value) { ClearRunStateIfNeeded(); return; } if (!SemiFunc.RunIsLevel()) { ClearRunStateIfNeeded(); return; } if (!previousRunIsLevel) { trackerMap.Clear(); overlayMessages.Clear(); } previousRunIsLevel = true; if ((Object)(object)GameDirector.instance == (Object)null || GameDirector.instance.PlayerList == null || (Object)(object)StatsManager.instance == (Object)null) { return; } float num = Mathf.Max(Time.deltaTime, 0f); float time = Time.time; HashSet<int> hashSet = new HashSet<int>(); foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if ((Object)(object)player == (Object)null || IsLocalPlayer(player) || !IsAlivePlayer(player)) { continue; } string steamId = GetSteamId(player); if (string.IsNullOrEmpty(steamId)) { continue; } int stablePlayerId = GetStablePlayerId(player); hashSet.Add(stablePlayerId); if (!trackerMap.TryGetValue(stablePlayerId, out SprintTracker value)) { value = new SprintTracker(); value.StableId = stablePlayerId; trackerMap[stablePlayerId] = value; } value.PlayerName = GetPlayerName(player); value.SteamId = steamId; value.LastSeenTime = time; int upgradeValue = GetUpgradeValue(StatsManager.instance.playerUpgradeStamina, steamId); int upgradeValue2 = GetUpgradeValue(StatsManager.instance.playerUpgradeSpeed, steamId); value.LastStaminaUpgrade = upgradeValue; value.LastSpeedUpgrade = upgradeValue2; float num2 = (value.LastAllowedSprintSeconds = CalculateAllowedSprintSeconds(upgradeValue, upgradeValue2)); bool @bool = GetBool(fiIsSprinting, player); bool bool2 = GetBool(fiIsMoving, player); bool bool3 = GetBool(fiIsTumbling, player); bool bool4 = GetBool(fiIsCrawling, player); Vector3 velocity = GetVelocity(player); Vector2 val = new Vector2(velocity.x, velocity.z); float magnitude = ((Vector2)(ref val)).magnitude; if (magnitude > value.MaxObservedHorizontalSpeed) { value.MaxObservedHorizontalSpeed = magnitude; } bool flag = @bool && bool2 && !bool3 && !bool4 && magnitude >= MinimumHorizontalSpeedToCountSprint.Value; if (flag) { value.CurrentSprintSeconds += num; value.NonSprintGraceSeconds = 0f; if (value.CurrentSprintSeconds > value.MaxObservedSprintSeconds) { value.MaxObservedSprintSeconds = value.CurrentSprintSeconds; } } else { value.NonSprintGraceSeconds += num; if (value.NonSprintGraceSeconds > SprintBreakGraceSeconds.Value) { value.CurrentSprintSeconds = 0f; value.NonSprintGraceSeconds = 0f; value.WarnedThisChain = false; value.CurrentSpeedAnomalySeconds = 0f; } } if (EnableSpeedAnomalyAssist.Value && flag) { float num3 = 1.5f + (float)upgradeValue2; float num4 = num3 * Mathf.Max(1f, SpeedAnomalyMultiplier.Value); if (magnitude > num4) { value.CurrentSpeedAnomalySeconds += num; } else { value.CurrentSpeedAnomalySeconds = 0f; } } else { value.CurrentSpeedAnomalySeconds = 0f; } bool flag2 = value.CurrentSprintSeconds > num2; bool flag3 = EnableSpeedAnomalyAssist.Value && value.CurrentSpeedAnomalySeconds >= SpeedAnomalyMinimumSeconds.Value; if (flag2 || flag3) { value.SuspiciousCount++; EmitWarning(value); ResetTrackerAfterWarning(value); } } CleanupMissingTrackers(time, hashSet); CleanupOverlayMessages(time); UpdateDetectedPlayerOutlines(time, hashSet); HandleTeleportToCurrentWarning(); } private void OnGUI() { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Expected O, but got Unknown //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Expected O, but got Unknown //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) //IL_0355: Unknown result type (might be due to invalid IL or missing references) //IL_037e: Unknown result type (might be due to invalid IL or missing references) //IL_0394: Unknown result type (might be due to invalid IL or missing references) //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03c0: Unknown result type (might be due to invalid IL or missing references) if (!EnableMod.Value || !ShowWarningOverlay.Value || !SemiFunc.RunIsLevel()) { return; } CleanupOverlayMessages(Time.time); OverlayMessage currentOverlayMessage = GetCurrentOverlayMessage(Time.time); if (currentOverlayMessage != null) { GUIStyle val = new GUIStyle(GUI.skin.box); val.alignment = (TextAnchor)4; val.fontSize = Mathf.Max(12, WarningFontSize.Value); val.wordWrap = true; GUIStyle val2 = new GUIStyle(GUI.skin.label); val2.alignment = (TextAnchor)4; val2.fontSize = Mathf.Max(12, WarningFontSize.Value); val2.wordWrap = true; val2.richText = false; val2.normal.textColor = Color.white; GUIStyle val3 = new GUIStyle(GUI.skin.label); val3.alignment = (TextAnchor)4; val3.fontSize = Mathf.Max(10, WarningFontSize.Value - 6); val3.wordWrap = false; val3.normal.textColor = new Color(1f, 1f, 1f, 0.95f); float num = Mathf.Min(1100f, (float)Screen.width - 80f); float num2 = Mathf.Max(96f, (float)WarningFontSize.Value + 60f); float num3 = ((float)Screen.width - num) * 0.5f; float num4 = (float)Screen.height * 0.7f; float num5 = (float)Screen.height + num2 + 20f; float num6 = Mathf.Max(0.5f, WarningDisplaySeconds.Value); float num7 = 0.25f + num6 + 0.25f; float num8 = Time.time - currentOverlayMessage.CreatedAt; float num10; float num11; if (num8 < 0.25f) { float num9 = Mathf.Clamp01(num8 / 0.25f); num10 = num9; num11 = Mathf.Lerp(num5, num4, num9); } else if (num8 < 0.25f + num6) { num10 = 1f; num11 = num4; } else { float num12 = Mathf.Clamp01((num8 - 0.25f - num6) / 0.25f); num10 = 1f - num12; num11 = Mathf.Lerp(num4, num5, num12); } float num13 = 1f - Mathf.Clamp01(num8 / num7); float num14 = 10f; float num15 = 18f; float num16 = num - num15 * 2f; float num17 = num11 + num2 - 18f; Color color = GUI.color; GUI.color = new Color(0f, 0f, 0f, 0.78f * num10); GUI.Box(new Rect(num3, num11, num, num2), string.Empty, val); GUI.color = new Color(1f, 1f, 1f, num10); GUI.Label(new Rect(num3 + 16f, num11 + 8f, num - 32f, num2 - 46f), currentOverlayMessage.Text, val2); GUI.Label(new Rect(num3 + 16f, num11 + num2 - 40f, num - 32f, 18f), currentOverlayMessage.TeleportHint, val3); GUI.color = new Color(0f, 0f, 0f, 0.55f * num10); GUI.Box(new Rect(num3 + num15, num17, num16, num14), string.Empty); DrawYellowGradientBar(new Rect(num3 + num15, num17, num16 * num13, num14), num10); GUI.color = color; } } private void DrawYellowGradientBar(Rect rect, float alpha) { //IL_0057: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007e: 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_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) if (!(((Rect)(ref rect)).width <= 0f) && !(((Rect)(ref rect)).height <= 0f)) { if ((Object)(object)warningBarGradientTexture == (Object)null || (Object)(object)warningBarHighlightTexture == (Object)null) { CreateWarningBarTextures(); } Color color = GUI.color; GUI.color = new Color(1f, 1f, 1f, 0.98f * alpha); GUI.DrawTexture(rect, (Texture)(object)warningBarGradientTexture, (ScaleMode)0, false); GUI.color = new Color(1f, 1f, 1f, 0.3f * alpha); GUI.DrawTexture(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y + 1f, ((Rect)(ref rect)).width, Mathf.Max(2f, ((Rect)(ref rect)).height * 0.45f)), (Texture)(object)warningBarHighlightTexture, (ScaleMode)0, true); GUI.color = new Color(1f, 0.95f, 0.55f, 0.95f * alpha); GUI.DrawTexture(new Rect(((Rect)(ref rect)).x, ((Rect)(ref rect)).y, ((Rect)(ref rect)).width, 1f), (Texture)(object)Texture2D.whiteTexture, (ScaleMode)0, false); GUI.color = color; } } private void CreateWarningBarTextures() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Expected O, but got Unknown //IL_01b3: 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_00dc: 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) //IL_00f3: 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_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00fd: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)warningBarGradientTexture == (Object)null) { warningBarGradientTexture = new Texture2D(256, 1, (TextureFormat)4, false); ((Texture)warningBarGradientTexture).wrapMode = (TextureWrapMode)1; ((Object)warningBarGradientTexture).hideFlags = (HideFlags)61; for (int i = 0; i < ((Texture)warningBarGradientTexture).width; i++) { float num = (float)i / (float)(((Texture)warningBarGradientTexture).width - 1); Color val = ((!(num < 0.45f)) ? Color.Lerp(new Color(1f, 0.98f, 0.34f, 1f), new Color(1f, 0.76f, 0.08f, 1f), (num - 0.45f) / 0.55f) : Color.Lerp(new Color(1f, 0.88f, 0.12f, 1f), new Color(1f, 0.98f, 0.34f, 1f), num / 0.45f)); warningBarGradientTexture.SetPixel(i, 0, val); } warningBarGradientTexture.Apply(false, true); } if ((Object)(object)warningBarHighlightTexture == (Object)null) { warningBarHighlightTexture = new Texture2D(64, 1, (TextureFormat)4, false); ((Texture)warningBarHighlightTexture).wrapMode = (TextureWrapMode)1; ((Object)warningBarHighlightTexture).hideFlags = (HideFlags)61; for (int j = 0; j < ((Texture)warningBarHighlightTexture).width; j++) { float num2 = (float)j / (float)(((Texture)warningBarHighlightTexture).width - 1); float num3 = Mathf.Sin(num2 * MathF.PI); warningBarHighlightTexture.SetPixel(j, 0, new Color(1f, 1f, 1f, num3)); } warningBarHighlightTexture.Apply(false, true); } } private float CalculateAllowedSprintSeconds(int staminaUpgrade, int speedUpgrade) { float num = 100f + (float)staminaUpgrade * 10f; float num2 = 1f + (float)speedUpgrade; if (num2 <= 0f) { num2 = 1f; } float num3 = num / num2; return num3 + Mathf.Max(0f, AllowedExtraSprintSeconds.Value); } private void ResetTrackerAfterWarning(SprintTracker tracker) { if (tracker != null) { tracker.CurrentSprintSeconds = 0f; tracker.NonSprintGraceSeconds = 0f; tracker.CurrentSpeedAnomalySeconds = 0f; tracker.WarnedThisChain = false; } } private void EmitWarning(SprintTracker tracker) { string text = string.Format(GetLocalizedText("WarningFormat"), tracker.PlayerName, tracker.LastStaminaUpgrade, tracker.LastSpeedUpgrade, tracker.SuspiciousCount); if (WarnInConsole.Value) { LogInfo(text); } MarkDetectedPlayerOutline(tracker.StableId); if (ShowWarningOverlay.Value) { OverlayMessage overlayMessage = new OverlayMessage(); overlayMessage.Text = text; overlayMessage.TeleportHint = string.Format(GetLocalizedText("TeleportHint"), GetDisplayTeleportKeyName()); overlayMessage.CreatedAt = Time.time; overlayMessage.ExpiresAt = Time.time + 0.25f + Mathf.Max(0.5f, WarningDisplaySeconds.Value) + 0.25f; overlayMessage.TargetStableId = tracker.StableId; overlayMessage.TargetPlayerName = tracker.PlayerName; overlayMessages.Add(overlayMessage); PlayWarningSound(); } } private void PlayWarningSound() { EnsureWarningAudioLoaded(); if ((Object)(object)warningAudioSource == (Object)null) { warningAudioSource = ((Component)this).gameObject.AddComponent<AudioSource>(); warningAudioSource.playOnAwake = false; warningAudioSource.loop = false; warningAudioSource.spatialBlend = 0f; warningAudioSource.volume = 1f; warningAudioSource.priority = 0; warningAudioSource.ignoreListenerPause = true; warningAudioSource.bypassReverbZones = true; } if ((Object)(object)warningAudioClip == (Object)null) { warningAudioClip = CreateFallbackWarningClip(); } if (!((Object)(object)warningAudioSource == (Object)null) && !((Object)(object)warningAudioClip == (Object)null)) { if ((Object)(object)warningAudioSource.outputAudioMixerGroup == (Object)null && (Object)(object)AudioManager.instance != (Object)null) { warningAudioSource.outputAudioMixerGroup = AudioManager.instance.SoundMasterGroup; } warningAudioSource.Stop(); warningAudioSource.PlayOneShot(warningAudioClip, 1f); } } private void EnsureWarningAudioLoaded() { if ((Object)(object)warningAudioSource != (Object)null && (Object)(object)warningAudioSource.outputAudioMixerGroup == (Object)null && (Object)(object)AudioManager.instance != (Object)null) { warningAudioSource.outputAudioMixerGroup = AudioManager.instance.SoundMasterGroup; } if ((Object)(object)warningAudioClip == (Object)null) { warningAudioClip = CreateFallbackWarningClip(); } if (!warningAudioLoadStarted) { string path = Path.Combine(Paths.ConfigPath, "AntiInfiniteStamina"); string text = Path.Combine(path, "warning_detect.ogg"); if (File.Exists(text)) { warningAudioLoadStarted = true; ((MonoBehaviour)this).StartCoroutine(LoadWarningAudioCoroutine(text)); } } } [IteratorStateMachine(typeof(<LoadWarningAudioCoroutine>d__80))] private IEnumerator LoadWarningAudioCoroutine(string filePath) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <LoadWarningAudioCoroutine>d__80(0) { <>4__this = this, filePath = filePath }; } private AudioClip CreateFallbackWarningClip() { int num = Mathf.CeilToInt(18522f); float[] array = new float[num]; for (int i = 0; i < num; i++) { float num2 = (float)i / 44100f; float num3 = 1f; if (num2 < 0.03f) { num3 = num2 / 0.03f; } else if (num2 > 0.33999997f) { num3 = Mathf.Clamp01((0.42f - num2) / 0.08f); } float num4 = ((num2 < 0.21f) ? 880f : 1320f); float num5 = Mathf.Sin(num2 * num4 * MathF.PI * 2f); float num6 = Mathf.Sin(num2 * (num4 * 0.5f) * MathF.PI * 2f) * 0.35f; array[i] = (num5 * 0.65f + num6) * num3 * 0.28f; } AudioClip val = AudioClip.Create("AntiInfiniteStaminaWarningFallback", num, 1, 44100, false); val.SetData(array, 0); return val; } private void SetFieldValue(FieldInfo fieldInfo, object instance, object value) { if (fieldInfo == null || instance == null) { return; } try { fieldInfo.SetValue(instance, value); } catch { } } private void CleanupMissingTrackers(float now, HashSet<int> seenIds) { List<int> list = new List<int>(); foreach (KeyValuePair<int, SprintTracker> item in trackerMap) { if (!seenIds.Contains(item.Key) && now - item.Value.LastSeenTime > 2f) { list.Add(item.Key); } } for (int i = 0; i < list.Count; i++) { trackerMap.Remove(list[i]); } } private void CleanupOverlayMessages(float now) { for (int num = overlayMessages.Count - 1; num >= 0; num--) { if (overlayMessages[num].ExpiresAt <= now) { overlayMessages.RemoveAt(num); } } } private OverlayMessage GetCurrentOverlayMessage(float now) { OverlayMessage overlayMessage = null; for (int i = 0; i < overlayMessages.Count; i++) { OverlayMessage overlayMessage2 = overlayMessages[i]; if (!(overlayMessage2.ExpiresAt <= now) && (overlayMessage == null || overlayMessage2.CreatedAt > overlayMessage.CreatedAt)) { overlayMessage = overlayMessage2; } } return overlayMessage; } private void HandleTeleportToCurrentWarning() { if (!ShowWarningOverlay.Value) { return; } OverlayMessage currentOverlayMessage = GetCurrentOverlayMessage(Time.time); if (currentOverlayMessage != null && IsTeleportHotkeyPressed()) { PlayerAvatar val = FindPlayerByStableId(currentOverlayMessage.TargetStableId); if (!((Object)(object)val == (Object)null) && IsAlivePlayer(val)) { TeleportLocalPlayerNearTarget(val); } } } private bool IsTeleportHotkeyPressed() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: 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_001b: Invalid comparison between Unknown and I4 //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (Input.GetKeyDown((KeyCode)106)) { return true; } KeyCode val = ParseTeleportKey(); if ((int)val != 106 && Input.GetKeyDown(val)) { return true; } return false; } private KeyCode ParseTeleportKey() { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_0050: Unknown result type (might be due to invalid IL or missing references) string text = ((TeleportToWarningPlayerKey != null) ? (TeleportToWarningPlayerKey.Value ?? string.Empty) : string.Empty); if (string.IsNullOrWhiteSpace(text)) { return (KeyCode)106; } try { return (KeyCode)Enum.Parse(typeof(KeyCode), text.Trim(), ignoreCase: true); } catch { return (KeyCode)106; } } private string GetDisplayTeleportKeyName() { return "J"; } private PlayerAvatar FindPlayerByStableId(int stableId) { if ((Object)(object)GameDirector.instance == (Object)null || GameDirector.instance.PlayerList == null) { return null; } foreach (PlayerAvatar player in GameDirector.instance.PlayerList) { if ((Object)(object)player == (Object)null || GetStablePlayerId(player) != stableId) { continue; } return player; } return null; } private void TeleportLocalPlayerNearTarget(PlayerAvatar target) { //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) PlayerController instance = PlayerController.instance; PlayerAvatar val = null; if ((Object)(object)instance != (Object)null) { val = instance.playerAvatarScript; } if ((Object)(object)val == (Object)null) { val = PlayerAvatar.instance; } if (!((Object)(object)val == (Object)null) && !((Object)(object)instance == (Object)null) && !((Object)(object)target == (Object)null)) { ResolveTeleportPlacement(val, target, out var destination, out var rotation); ManualLocalTeleport(val, destination, rotation); } } private void ResolveTeleportPlacement(PlayerAvatar localPlayer, PlayerAvatar target, out Vector3 destination, out Quaternion rotation) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: 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_007b: 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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: 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_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0124: 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_00e2: 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_0268: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0287: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_02c5: Unknown result type (might be due to invalid IL or missing references) //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) //IL_02d1: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Unknown result type (might be due to invalid IL or missing references) //IL_02e0: Unknown result type (might be due to invalid IL or missing references) //IL_02e5: Unknown result type (might be due to invalid IL or missing references) //IL_02ea: Unknown result type (might be due to invalid IL or missing references) //IL_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_018f: 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_0193: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_019d: 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_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01af: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: 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_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) Vector3 teleportTargetPosition = GetTeleportTargetPosition(target); Quaternion teleportTargetRotation = GetTeleportTargetRotation(target); Vector3 val = Vector3.ProjectOnPlane(teleportTargetRotation * Vector3.forward, Vector3.up); if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f) { val = Vector3.ProjectOnPlane(((Component)target).transform.forward, Vector3.up); } if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f && (Object)(object)localPlayer != (Object)null) { val = Vector3.ProjectOnPlane(((Component)localPlayer).transform.position - teleportTargetPosition, Vector3.up); } if (((Vector3)(ref val)).sqrMagnitude <= 0.0001f) { val = Vector3.forward; } ((Vector3)(ref val)).Normalize(); Vector3 val2 = Vector3.Cross(Vector3.up, val); if (((Vector3)(ref val2)).sqrMagnitude <= 0.0001f) { val2 = Vector3.right; } ((Vector3)(ref val2)).Normalize(); rotation = Quaternion.LookRotation(val, Vector3.up); destination = teleportTargetPosition - val * 1.35f + Vector3.up * 0.08f; float[] array = new float[9] { 0f, 0.45f, -0.45f, 0.9f, -0.9f, 1.35f, -1.35f, 1.8f, -1.8f }; for (int i = 0; i < 2; i++) { bool ignorePlayerBodies = i == 1; for (float num = 1.35f; num <= 9.751f; num += 0.35f) { float num2 = Mathf.Lerp(0.22f, 0.48f, Mathf.InverseLerp(1.35f, 9.75f, num)); for (int j = 0; j < array.Length; j++) { float num3 = array[j] * num2; Vector3 candidateBase = teleportTargetPosition - val * num + val2 * num3; if (TryResolveTeleportCandidate(localPlayer, target, teleportTargetPosition, candidateBase, rotation, ignorePlayerBodies, out var resolved)) { destination = resolved; DebugLog(string.Format("Teleport candidate accepted / TP候補採用 pass:{0} dist:{1:F2} lateral:{2:F2} pos:{3}", i + 1, num, num3, ((Vector3)(ref destination)).ToString("F2"))); return; } } } } Vector3 candidateBase2 = teleportTargetPosition - val * Mathf.Min(9.75f, 4.5f); if (TryResolveTeleportFallback(localPlayer, target, teleportTargetPosition, candidateBase2, rotation, out var resolved2)) { destination = resolved2; DebugLog("Teleport fallback accepted / TP最終フォールバック採用 " + ((Vector3)(ref destination)).ToString("F2")); } else { destination = teleportTargetPosition - val * 1.35f + Vector3.up * 0.08f; DebugLog("Teleport hard fallback used / TP強制フォールバック使用 " + ((Vector3)(ref destination)).ToString("F2")); } } private bool TryResolveTeleportCandidate(PlayerAvatar localPlayer, PlayerAvatar target, Vector3 targetPosition, Vector3 candidateBase, Quaternion rotation, bool ignorePlayerBodies, out Vector3 resolved) { //IL_0003: 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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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_0062: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_007a: 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_009b: 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_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) resolved = candidateBase + Vector3.up * 0.08f; if (!TryProjectTeleportCandidateToGround(targetPosition, candidateBase, out var grounded)) { ((Vector3)(ref grounded))..ctor(candidateBase.x, targetPosition.y, candidateBase.z); } grounded += Vector3.up * 0.08f; if (IsTeleportPathBlocked(targetPosition, grounded, localPlayer, target, ignorePlayerBodies)) { return false; } Vector3 position = grounded; if (!TryDepenetrateTeleportPosition(localPlayer, target, ref position, rotation, ignorePlayerBodies)) { return false; } if (IsTeleportSpotBlocked(localPlayer, target, position, rotation, ignorePlayerBodies)) { return false; } resolved = position; return true; } private bool TryResolveTeleportFallback(PlayerAvatar localPlayer, PlayerAvatar target, Vector3 targetPosition, Vector3 candidateBase, Quaternion rotation, out Vector3 resolved) { //IL_0003: 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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0014: 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_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_0082: Unknown result type (might be due to invalid IL or missing references) resolved = candidateBase + Vector3.up * 0.08f; if (!TryProjectTeleportCandidateToGround(targetPosition, candidateBase, out var grounded)) { ((Vector3)(ref grounded))..ctor(candidateBase.x, targetPosition.y, candidateBase.z); } grounded += Vector3.up * 0.08f; Vector3 position = grounded; if (!TryDepenetrateTeleportPosition(localPlayer, target, ref position, rotation, ignorePlayerBodies: true)) { return false; } resolved = position; return true; } private Vector3 GetTeleportTargetPosition(PlayerAvatar target) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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_00c2: 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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0046: 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_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_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0095: 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_005e: 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_00ab: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)target == (Object)null) { return Vector3.zero; } try { if (fiClientPositionCurrent != null && fiClientPositionCurrent.GetValue(target) is Vector3 val && val != Vector3.zero) { return val; } if (fiClientPosition != null) { object value = fiClientPosition.GetValue(target); if (value is Vector3) { Vector3 val2 = (Vector3)value; if (val2 != Vector3.zero) { return val2; } } } } catch { } return ((Component)target).transform.position; } private Quaternion GetTeleportTargetRotation(PlayerAvatar target) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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_00c0: 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_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0047: 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_0093: 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_005d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: 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) if ((Object)(object)target == (Object)null) { return Quaternion.identity; } try { if (fiClientRotationCurrent != null && fiClientRotationCurrent.GetValue(target) is Quaternion val && !IsInvalidQuaternion(val)) { return val; } if (fiClientRotation != null) { object value = fiClientRotation.GetValue(target); if (value is Quaternion) { Quaternion val2 = (Quaternion)value; if (!IsInvalidQuaternion(val2)) { return val2; } } } } catch { } return ((Component)target).transform.rotation; } private bool IsInvalidQuaternion(Quaternion rotation) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) return rotation.x == 0f && rotation.y == 0f && rotation.z == 0f && rotation.w == 0f; } private bool TryProjectTeleportCandidateToGround(Vector3 targetPosition, Vector3 candidateBase, out Vector3 grounded) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //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_0017: 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_0042: 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_004e: 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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) Vector3 val = candidateBase + Vector3.up * 3.5f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, Vector3.down, ref val2, 8f, -1, (QueryTriggerInteraction)1)) { grounded = ((RaycastHit)(ref val2)).point; return true; } grounded = new Vector3(candidateBase.x, targetPosition.y, candidateBase.z); return false; } private bool IsTeleportPathBlocked(Vector3 targetPosition, Vector3 destination, PlayerAvatar localPlayer, PlayerAvatar target, bool ignorePlayerBodies) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //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_0017: 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: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_002e: 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_0034: 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_0056: 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) //IL_005d: Unknown result type (might be due to invalid IL or missing references) Vector3 val = targetPosition + Vector3.up * 1f; Vector3 val2 = destination + Vector3.up * 1f; Vector3 val3 = val2 - val; float magnitude = ((Vector3)(ref val3)).magnitude; if (magnitude <= 0.01f) { return false; } val3 /= magnitude; RaycastHit[] array = Physics.RaycastAll(val, val3, magnitude, -1, (QueryTriggerInteraction)1); for (int i = 0; i < array.Length; i++) { Collider collider = ((RaycastHit)(ref array[i])).collider; if (!IsIgnoredTeleportCollider(collider, localPlayer, target, ignorePlayerBodies)) { return true; } } return false; } private bool IsTeleportSpotBlocked(PlayerAvatar localPlayer, PlayerAvatar target, Vector3 position, Quaternion rotation, bool ignorePlayerBodies) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0004: Unknown result type (might be due to invalid IL or missing references) Collider[] teleportOverlapHits = GetTeleportOverlapHits(localPlayer, position, rotation); for (int i = 0; i < teleportOverlapHits.Length; i++) { if (!IsIgnoredTeleportCollider(teleportOverlapHits[i], localPlayer, target, ignorePlayerBodies)) { return true; } } return false; } private Collider[] GetTeleportOverlapHits(PlayerAvatar localPlayer, Vector3 position, Quaternion rotation) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: 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_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_005a: 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_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) GetTeleportCapsule(localPlayer, out var center, out var height, out var radius); Vector3 val = position + rotation * center; float num = Mathf.Max(0f, height * 0.5f - radius); Vector3 val2 = rotation * Vector3.up; Vector3 val3 = val + val2 * num; Vector3 val4 = val - val2 * num; return Physics.OverlapCapsule(val3, val4, radius + 0.04f, -1, (QueryTriggerInteraction)1); } private void GetTeleportCapsule(PlayerAvatar localPlayer, out Vector3 center, out float height, out float radius) { //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_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) center = new Vector3(0f, 0.9f, 0f); height = 1.8f; radius = 0.32f; CapsuleCollider val = null; if ((Object)(object)PlayerCollisionStand.instance != (Object)null) { val = ((Component)PlayerCollisionStand.instance).GetComponent<CapsuleCollider>(); } if ((Object)(object)val == (Object)null && (Object)(object)localPlayer != (Object)null) { val = ((Component)localPlayer).GetComponentInChildren<CapsuleCollider>(); } if (!((Object)(object)val == (Object)null)) { center = val.center; height = Mathf.Max(val.height, val.radius * 2f + 0.1f); radius = Mathf.Max(0.1f, val.radius); } } private bool TryDepenetrateTeleportPosition(PlayerAvatar localPlayer, PlayerAvatar target, ref Vector3 position, Quaternion rotation, bool ignorePlayerBodies) { //IL_004f: 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_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0078: 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_0089: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: 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_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0144: 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_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_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0171: 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_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: 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) CapsuleCollider val = null; if ((Object)(object)PlayerCollisionStand.instance != (Object)null) { val = ((Component)PlayerCollisionStand.instance).GetComponent<CapsuleCollider>(); } if ((Object)(object)val == (Object)null && (Object)(object)localPlayer != (Object)null) { val = ((Component)localPlayer).GetComponentInChildren<CapsuleCollider>(); } if ((Object)(object)val == (Object)null) { return !IsTeleportSpotBlocked(localPlayer, target, position, rotation, ignorePlayerBodies); } Vector3 val4 = default(Vector3); float num = default(float); for (int i = 0; i < 8; i++) { Collider[] teleportOverlapHits = GetTeleportOverlapHits(localPlayer, position, rotation); bool flag = false; Vector3 val2 = Vector3.zero; foreach (Collider val3 in teleportOverlapHits) { if (!IsIgnoredTeleportCollider(val3, localPlayer, target, ignorePlayerBodies) && Physics.ComputePenetration((Collider)(object)val, position, rotation, val3, ((Component)val3).transform.position, ((Component)val3).transform.rotation, ref val4, ref num)) { flag = true; val2 += val4 * (num + 0.01f); } } if (!flag) { return true; } if (((Vector3)(ref val2)).sqrMagnitude <= 1E-06f) { break; } position += val2; if (TryProjectTeleportCandidateToGround(position, position, out var grounded)) { position = grounded + Vector3.up * 0.08f; } } return !IsTeleportSpotBlocked(localPlayer, target, position, rotation, ignorePlayerBodies); } private bool IsIgnoredTeleportCollider(Collider hit, PlayerAvatar localPlayer, PlayerAvatar target, bool ignorePlayerBodies) { if ((Object)(object)hit == (Object)null) { return true; } if (hit.isTrigger) { return true; } Transform transform = ((Component)hit).transform; if ((Object)(object)localPlayer != (Object)null && transform.IsChildOf(((Component)localPlayer).transform)) { return true; } if ((Object)(object)target != (Object)null && transform.IsChildOf(((Component)target).transform)) { return true; } if (ignorePlayerBodies) { if ((Object)(object)((Component)hit).GetComponentInParent<PlayerAvatar>() != (Object)null) { return true; } if ((Object)(object)((Component)hit).GetComponentInParent<PlayerController>() != (Object)null) { return true; } if ((Object)(object)((Component)hit).GetComponentInParent<PlayerCollisionController>() != (Object)null) { return true; } if ((Object)(object)((Component)hit).GetComponentInParent<PlayerCollisionGrounded>() != (Object)null) { return true; } if ((Object)(object)((Component)hit).GetComponentInParent<PlayerCollisionStand>() != (Object)null) { return true; } } return false; } private void ManualLocalTeleport(PlayerAvatar localPlayer, Vector3 destination, Quaternion rotation) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_0086: 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_00a5: 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) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_018b: 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_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) PlayerController instance = PlayerController.instance; if (!((Object)(object)instance == (Object)null) && !((Object)(object)localPlayer == (Object)null)) { if (teleportStabilizeCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(teleportStabilizeCoroutine); teleportStabilizeCoroutine = null; } instance.InputDisable(0.25f); instance.Kinematic(0.25f); instance.MoveForce(Vector3.zero, 0f, 0f); instance.Velocity = Vector3.zero; instance.VelocityRelative = Vector3.zero; SetFieldValue(fiPcPositionPrevious, instance, destination); SetFieldValue(fiPcVelocityRelativeNew, instance, Vector3.zero); SetFieldValue(fiPcVelocityImpulse, instance, Vector3.zero); SetFieldValue(fiPcMoveForceDirection, instance, Vector3.zero); SetFieldValue(fiPcMoveForceAmount, instance, 0f); SetFieldValue(fiPcMoveForceTimer, instance, 0f); if ((Object)(object)instance.CollisionController != (Object)null) { instance.CollisionController.ResetFalling(); instance.CollisionController.GroundedDisableTimer = 0.15f; } if ((Object)(object)instance.CollisionGrounded != (Object)null) { instance.CollisionGrounded.physRiding = false; instance.CollisionGrounded.physRidingID = 0; instance.CollisionGrounded.physRidingPosition = Vector3.zero; } ApplyManualTeleportPose(localPlayer, instance, destination, rotation, refreshCamera: true); teleportStabilizeCoroutine = ((MonoBehaviour)this).StartCoroutine(TeleportStabilizeCoroutine(localPlayer, destination, rotation)); LogInfo("Teleport executed / TP実行 " + ((Vector3)(ref destination)).ToString("F2")); } } private void ApplyManualTeleportPose(PlayerAvatar localPlayer, PlayerController playerController, Vector3 destination, Quaternion rotation, bool refreshCamera) { //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_0035: 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_0057: 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_0072: 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_010a: Unknown result type (might be due to invalid IL or missing references) //IL_0117: 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_00cf: 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) //IL_00e3: 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_00f4: 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_0168: 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_018f: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_01ba: Unknown result type (might be due to invalid IL or missing references) //IL_01cc: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_022a: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)localPlayer == (Object)null || (Object)(object)playerController == (Object)null) { return; } if ((Object)(object)playerController.rb != (Object)null) { playerController.rb.velocity = Vector3.zero; playerController.rb.angularVelocity = Vector3.zero; playerController.rb.position = destination; playerController.rb.rotation = rotation; playerController.rb.MovePosition(destination); playerController.rb.MoveRotation(rotation); playerController.rb.WakeUp(); } ((Component)playerController).transform.position = destination; ((Component)playerController).transform.rotation = rotation; Rigidbody component = ((Component)localPlayer).GetComponent<Rigidbody>(); if ((Object)(object)component != (Object)null) { component.velocity = Vector3.zero; component.angularVelocity = Vector3.zero; component.position = destination; component.rotation = rotation; component.MovePosition(destination); component.MoveRotation(rotation); component.WakeUp(); } ((Component)localPlayer).transform.position = destination; ((Component)localPlayer).transform.rotation = rotation; if ((Object)(object)localPlayer.playerTransform != (Object)null) { localPlayer.playerTransform.position = destination; localPlayer.playerTransform.rotation = rotation; } SetFieldValue(fiClientPosition, localPlayer, destination); SetFieldValue(fiClientPositionCurrent, localPlayer, destination); SetFieldValue(fiClientRotation, localPlayer, rotation); SetFieldValue(fiClientRotationCurrent, localPlayer, rotation); if ((Object)(object)localPlayer.playerAvatarVisuals != (Object)null) { ((Component)localPlayer.playerAvatarVisuals).transform.position = destination; ((Component)localPlayer.playerAvatarVisuals).transform.rotation = rotation; localPlayer.playerAvatarVisuals.visualPosition = destination; } Physics.SyncTransforms(); if (refreshCamera) { if ((Object)(object)localPlayer.localCamera != (Object)null) { localPlayer.localCamera.Teleported(); } if ((Object)(object)CameraAim.Instance != (Object)null) { CameraAim.Instance.SetPlayerAim(rotation, true); CameraAim.Instance.OverrideNoSmooth(0.15f); } if ((Object)(object)CameraPosition.instance != (Object)null) { ((Component)CameraPosition.instance).transform.position = destination; ((Component)CameraPosition.instance).transform.rotation = rotation; } if ((Object)(object)localPlayer.RoomVolumeCheck != (Object)null) { localPlayer.RoomVolumeCheck.CheckSet(); } } } [IteratorStateMachine(typeof(<TeleportStabilizeCoroutine>d__107))] private IEnumerator TeleportStabilizeCoroutine(PlayerAvatar localPlayer, Vector3 destination, Quaternion rotation) { //IL_0015: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <TeleportStabilizeCoroutine>d__107(0) { <>4__this = this, localPlayer = localPlayer, destination = destination, rotation = rotation }; } private void MarkDetectedPlayerOutline(int stableId) { //IL_0076: Unknown result type (might be due to invalid IL or missing references) float num = ((DetectedPlayerOutlineSeconds != null) ? Mathf.Max(0f, DetectedPlayerOutlineSeconds.Value) : 0f); if (num <= 0f) { detectedOutlineExpireMap.Remove(stableId); if (outlineControllerMap.TryGetValue(stableId, out PlayerOutlineShellController value) && (Object)(object)value != (Object)null) { value.SetOutlineVisible(visible: false, new Color(1f, 0.84f, 0.06f, 1f)); } } else { detectedOutlineExpireMap[stableId] = Time.time + num; } } private void UpdateDetectedPlayerOutlines(float now, HashSet<int> seenIds) { //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) List<int> list = new List<int>(); foreach (KeyValuePair<int, float> item in detectedOutlineExpireMap) { if (item.Value <= now) { list.Add(item.Key); } } for (int i = 0; i < list.Count; i++) { detectedOutlineExpireMap.Remove(list[i]); } Color color = default(Color); ((Color)(ref color))..ctor(1f, 0.84f, 0.06f, 1f); foreach (KeyValuePair<int, PlayerOutlineShellController> item2 in outlineControllerMap) { PlayerOutlineShellController value = item2.Value; if (!((Object)(object)value == (Object)null)) { float value2; bool visible = detectedOutlineExpireMap.TryGetValue(item2.Key, out value2) && value2 > now && seenIds.Contains(item2.Key); value.SetOutlineVisible(visible, color); } } foreach (KeyValuePair<int, float> item3 in detectedOutlineExpireMap) { if (item3.Value <= now || !seenIds.Contains(item3.Key)) { continue; } PlayerAvatar val = FindPlayerByStableId(item3.Key); if (!((Object)(object)val == (Object)null) && IsAlivePlayer(val)) { PlayerOutlineShellController orCreateOutlineController = GetOrCreateOutlineController(val, item3.Key); if ((Object)(object)orCreateOutlineController != (Object)null) { orCreateOutlineController.SetOutlineVisible(visible: true, color); } } } List<int> list2 = new List<int>(); foreach (KeyValuePair<int, PlayerOutlineShellController> item4 in outlineControllerMap) { if ((Object)(object)item4.Value == (Object)null) { list2.Add(item4.Key); } } for (int j = 0; j < list2.Count; j++) { outlineControllerMap.Remove(list2[j]); } } private PlayerOutlineShellController GetOrCreateOutlineController(PlayerAvatar player, int stableId) { if ((Object)(object)player == (Object)null) { return null; } if (outlineControllerMap.TryGetValue(stableId, out PlayerOutlineShellController value) && (Object)(object)value != (Object)null) { return value; } PlayerOutlineShellController playerOutlineShellController = ((Component)player).GetComponent<PlayerOutlineShellController>(); if ((Object)(object)playerOutlineShellController == (Object)null) { playerOutlineShellController = ((Component)player).gameObject.AddComponent<PlayerOutlineShellController>(); } playerOutlineShellController.Initialize(player); outlineControllerMap[stableId] = playerOutlineShellController; return playerOutlineShellController; } private void DisableAllDetectedPlayerOutlines() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) foreach (KeyValuePair<int, PlayerOutlineShellController> item in outlineControllerMap) { if ((Object)(object)item.Value != (Object)null) { item.Value.SetOutlineVisible(visible: false, new Color(1f, 0.84f, 0.06f, 1f)); } } detectedOutlineExpireMap.Clear(); outlineControllerMap.Clear(); } private void ClearRunStateIfNeeded() { if (previousRunIsLevel) { trackerMap.Clear(); overlayMessages.Clear(); DisableAllDetectedPlayerOutlines(); } previousRunIsLevel = false; } private int GetStablePlayerId(PlayerAvatar player) { PhotonView component = ((Component)player).GetComponent<PhotonView>(); if ((Object)(object)component != (Object)null && component.ViewID != 0) { return component.ViewID; } return ((Object)player).GetInstanceID(); } private string GetPlayerName(PlayerAvatar player) { try { if (fiPlayerName != null) { object value = fiPlayerName.GetValue(player); if (value is string text && !string.IsNullOrEmpty(text)) { return text; } } } catch { } return ((Object)player).name; } private string GetSteamId(PlayerAvatar player) { if (fiSteamId == null || (Object)(object)player == (Object)null) { return string.Empty; } object value = fiSteamId.GetValue(player); return (value as string) ?? string.Empty; } private bool IsLocalPlayer(PlayerAvatar player) { if ((Object)(object)player == (Object)null) { return false; } if ((Object)(object)PlayerAvatar.instance != (Object)null && (Object)(object)player == (Object)(object)PlayerAvatar.instance) { return true; } PhotonView component = ((Component)player).GetComponent<PhotonView>(); return (Object)(object)component != (Object)null && component.IsMine; } private bool IsAlivePlayer(PlayerAvatar player) { if ((Object)(object)player == (Object)null) { return false; } if (fiDeadSet == null) { return true; } object value = fiDeadSet.GetValue(player); bool flag = default(bool); int num; if (value is bool) { flag = (bool)value; num = 1; } else { num = 0; } return ((uint)num & (flag ? 1u : 0u)) == 0; } private bool GetBool(FieldInfo fieldInfo, object instance) { if (fieldInfo == null || instance == null) { return false; } object value = fieldInfo.GetValue(instance); bool flag = default(bool); int num; if (value is bool) { flag = (bool)value; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } private Vector3 GetVelocity(PlayerAvatar player) { //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0077: 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) if (fiRbVelocityRaw != null && fiRbVelocityRaw.GetValue(player) is Vector3 result) { return result; } if (fiRbVelocity != null && fiRbVelocity.GetValue(player) is Vector3 result2) { return result2; } return Vector3.zero; } private int GetUpgradeValue(Dictionary<string, int> dictionary, string steamId) { if (dictionary == null || string.IsNullOrEmpty(steamId)) { return 0; } if (dictionary.TryGetValue(steamId, out var value)) { return value; } return 0; } private void TryApplyJapaneseFromAutoTranslator() { if (autoTranslatorChecked || Time.realtimeSinceStartup < autoTranslatorCheckTime) { return; } autoTranslatorChecked = true; try { string path = Path.Combine(Paths.ConfigPath, "AutoTranslatorConfig.ini"); if (!File.Exists(path)) { return; } string[] array = File.ReadAllLines(path); foreach (string text in array) { if (string.IsNullOrWhiteSpace(text)) { continue; } string text2 = text.Trim(); if (text2.StartsWith("Language=", StringComparison.OrdinalIgnoreCase)) { string a = text2.Substring("Language=".Length).Trim(); if (string.Equals(a, "ja", StringComparison.OrdinalIgnoreCase) && !string.Equals(LanguageSetting.Value, "Japanese", StringComparison.OrdinalIgnoreCase)) { LanguageSetting.Value = "Japanese"; ((BaseUnityPlugin)this).Config.Save(); LogInfo(GetLocalizedText("AutoTranslatorJapaneseApplied")); } break; } } } catch (Exception ex) { DebugLog("AutoTranslator language check failed / AutoTranslator の言語確認に失敗\n" + ex); } } private static string GetNormalizedLanguage() { string text = ((LanguageSetting != null) ? (LanguageSetting.Value ?? string.Empty) : string.Empty); if (text.Equals("Japanese", StringComparison.OrdinalIgnoreCase)) { return "ja"; } if (text.Equals("Korean", StringComparison.OrdinalIgnoreCase)) { return "ko"; } if (text.Equals("Chinese", StringComparison.OrdinalIgnoreCase)) { return "zh"; } if (text.Equals("Russian", StringComparison.OrdinalIgnoreCase)) { return "ru"; } return "en"; } private static string GetLocalizedText(string key) { string normalizedLanguage = GetNormalizedLanguage(); return key switch { "Loaded" => normalizedLanguage switch { "ja" => "読み込み完了", "ko" => "로드 완료", "zh" => "加载完成", "ru" => "Загрузка завершена", _ => "Loaded", }, "AutoTranslatorJapaneseApplied" => normalizedLanguage switch { "ja" => "AutoTranslatorConfig.ini を検出したため、MOD言語設定を日本語へ自動変更しました", "ko" => "AutoTranslatorConfig.ini가 감지되어 MOD 언어 설정이 일본어로 자동 변경되었습니다", "zh" => "检测到 AutoTranslatorConfig.ini,MOD 语言已自动切换为日语", "ru" => "Обнаружен AutoTranslatorConfig.ini, язык мода автоматически переключен на японский", _ => "AutoTranslatorConfig.ini detected. MOD language setting was automatically changed to Japanese", }, "WarningFormat" => normalizedLanguage switch { "ja" => "[チート検出] 無限スタミナ {0} STA {1} SPD {2} 回数 {3}", "ko" => "[치트 감지] 무한 스태미나 {0} STA {1} SPD {2} 횟수 {3}", "zh" => "[作弊检测] 无限体力 {0} STA {1} SPD {2} 次数 {3}", "ru" => "[Обнаружение чита] Бесконечная выносливость {0} STA {1} SPD {2} Кол-во {3}", _ => "[Cheat Detected] Infinite Stamina {0} STA {1} SPD {2} Count {3}", }, "TeleportHint" => normalizedLanguage switch { "ja" => "{0}キーでTP", "ko" => "{0} 키로 TP", "zh" => "按 {0} 键传送", "ru" => "TP на {0}", _ => "{0} to TP", }, _ => key, }; } internal static void LogInfo(string message) { if (LogSource != null) { LogSource.LogInfo((object)message); } } internal static void DebugLog(string message) { if (EnableDebugLog != null && EnableDebugLog.Value && LogSource != null) { LogSource.LogInfo((object)message); } } }