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 DefaultUpgrade v4.0.0
DefaultUpgrade.dll
Decompiled a month agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; 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 Photon.Realtime; using UnityEngine; using UnityEngine.SceneManagement; [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("zabuMod")] [assembly: AssemblyTitle("zabuMod")] [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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace REPOJP.DefaultUpgrade { [BepInPlugin("REPOJP.DefaultUpgrade", "DefaultUpgrade", "4.0.0")] public sealed class DefaultUpgradePlugin : BaseUnityPlugin { [CompilerGenerated] private sealed class <CoNewJoinSync>d__41 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public PlayerAvatar playerAvatar; public string reason; private float <timeout>5__1; private float <elapsed>5__2; private string <finalSteamId>5__3; private string <processKey>5__4; private string <steamId>5__5; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoNewJoinSync>d__41(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <finalSteamId>5__3 = null; <processKey>5__4 = null; <steamId>5__5 = null; <>1__state = -2; } private bool MoveNext() { //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <timeout>5__1 = ((CfgJoinSyncWindowSeconds != null) ? Mathf.Clamp(CfgJoinSyncWindowSeconds.Value, 5f, 120f) : 30f); <elapsed>5__2 = 0f; break; case 1: <>1__state = -1; <steamId>5__5 = null; break; } if (<elapsed>5__2 < <timeout>5__1) { if ((Object)(object)playerAvatar == (Object)null) { return false; } if (!IsTargetGameplaySceneSafe() || !IsLevelGeneratedSafe()) { return false; } <steamId>5__5 = GetSteamId(playerAvatar); if (string.IsNullOrEmpty(<steamId>5__5)) { <elapsed>5__2 += 0.25f; <>2__current = (object)new WaitForSeconds(0.25f); <>1__state = 1; return true; } } if ((Object)(object)playerAvatar == (Object)null) { return false; } <finalSteamId>5__3 = GetSteamId(playerAvatar); if (string.IsNullOrEmpty(<finalSteamId>5__3)) { return false; } <processKey>5__4 = GetCurrentLevelSignature() + "|" + <finalSteamId>5__3; if (processedJoinSyncKeys.Contains(<processKey>5__4)) { return false; } processedJoinSyncKeys.Add(<processKey>5__4); ApplyDefaultUpgradesForPlayers(new List<PlayerAvatar> { playerAvatar }, "NewJoinSync:" + reason); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CoPostLoadRepair>d__39 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public string reason; public DefaultUpgradePlugin <>4__this; private float <timeout>5__1; private float <elapsed>5__2; private float <delay>5__3; private string <signature>5__4; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoPostLoadRepair>d__39(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <signature>5__4 = null; <>1__state = -2; } private bool MoveNext() { //IL_014d: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Expected O, but got Unknown //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <timeout>5__1 = 30f; <elapsed>5__2 = 0f; goto IL_00b8; case 1: <>1__state = -1; goto IL_00b8; case 2: { <>1__state = -1; break; } IL_00b8: if (<elapsed>5__2 < <timeout>5__1) { if (!IsModEnabled() || !IsHostOrSingleSafe()) { <>4__this.postLoadRepairCoroutine = null; return false; } if (!IsTargetGameplaySceneSafe() || !IsLevelGeneratedSafe()) { <elapsed>5__2 += 0.25f; <>2__current = (object)new WaitForSeconds(0.25f); <>1__state = 1; return true; } } if (!IsTargetGameplaySceneSafe() || !IsLevelGeneratedSafe()) { <>4__this.postLoadRepairCoroutine = null; return false; } <delay>5__3 = 1f; try { <delay>5__3 = Mathf.Clamp(CfgPostLoadApplyDelay.Value, 0f, 10f); } catch { <delay>5__3 = 1f; } if (<delay>5__3 > 0f) { <>2__current = (object)new WaitForSeconds(<delay>5__3); <>1__state = 2; return true; } break; } <signature>5__4 = GetCurrentLevelSignature(); if (lastPostLoadRepairSignature == <signature>5__4) { <>4__this.postLoadRepairCoroutine = null; return false; } ApplyDefaultUpgradesForCurrentPlayers("PostLoadRepair:" + reason); lastPostLoadRepairSignature = <signature>5__4; <>4__this.postLoadRepairCoroutine = null; return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <CoPreLoadApplyThenChangeLevel>d__37 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public RunManager runManager; public bool completedLevel; public bool levelFailed; public ChangeLevelType changeLevelType; public DefaultUpgradePlugin <>4__this; private float <wait>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CoPreLoadApplyThenChangeLevel>d__37(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Expected O, but got Unknown //IL_0102: Unknown result type (might be due to invalid IL or missing references) switch (<>1__state) { default: return false; case 0: <>1__state = -1; preLoadChangeLevelInProgress = true; ApplyDefaultUpgradesForCurrentPlayers("PreLoadBeforeChangeLevel"); <wait>5__1 = 0.5f; try { <wait>5__1 = Mathf.Clamp(CfgPreLoadSyncWaitSeconds.Value, 0f, 3f); } catch { <wait>5__1 = 0.5f; } if (<wait>5__1 > 0f && IsMultiplayerSafe()) { <>2__current = (object)new WaitForSeconds(<wait>5__1); <>1__state = 1; return true; } <>2__current = null; <>1__state = 2; return true; case 1: <>1__state = -1; break; case 2: <>1__state = -1; break; } suppressChangeLevelPrefix = true; try { if ((Object)(object)runManager != (Object)null) { runManager.ChangeLevel(completedLevel, levelFailed, changeLevelType); } } finally { suppressChangeLevelPrefix = false; preLoadChangeLevelInProgress = false; } return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public const string PluginGuid = "REPOJP.DefaultUpgrade"; public const string PluginName = "DefaultUpgrade"; public const string PluginVersion = "4.0.0"; internal static DefaultUpgradePlugin Instance; internal static ManualLogSource Log; private Harmony harmony; internal static ConfigEntry<bool> CfgEnableMod; internal static ConfigEntry<bool> CfgPreLoadApply; internal static ConfigEntry<bool> CfgPostLoadRepairApply; internal static ConfigEntry<bool> CfgNewJoinSync; internal static ConfigEntry<float> CfgPreLoadSyncWaitSeconds; internal static ConfigEntry<float> CfgPostLoadApplyDelay; internal static ConfigEntry<float> CfgJoinSyncWindowSeconds; internal static ConfigEntry<int> CfgHealth; internal static ConfigEntry<int> CfgStamina; internal static ConfigEntry<int> CfgExtraJump; internal static ConfigEntry<int> CfgLaunch; internal static ConfigEntry<int> CfgTumbleClimb; internal static ConfigEntry<int> CfgMapPlayerCount; internal static ConfigEntry<int> CfgDeathHeadBattery; internal static ConfigEntry<int> CfgSpeed; internal static ConfigEntry<int> CfgStrength; internal static ConfigEntry<int> CfgThrow; internal static ConfigEntry<int> CfgRange; internal static ConfigEntry<int> CfgCrouchRest; internal static ConfigEntry<int> CfgTumbleWings; internal static ConfigEntry<bool> CfgEnableLog; private static bool suppressChangeLevelPrefix; private static bool preLoadChangeLevelInProgress; private static string lastPostLoadRepairSignature = string.Empty; private static readonly HashSet<string> processedJoinSyncKeys = new HashSet<string>(); private Coroutine postLoadRepairCoroutine; private void Awake() { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown Instance = this; Log = ((BaseUnityPlugin)this).Logger; ((Component)this).transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); BindConfig(); harmony = new Harmony("REPOJP.DefaultUpgrade"); harmony.PatchAll(); WriteInfo("Loaded DefaultUpgrade v4.0.0"); } private void OnDestroy() { if (postLoadRepairCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(postLoadRepairCoroutine); postLoadRepairCoroutine = null; } if (harmony != null) { harmony.UnpatchSelf(); harmony = null; } } private void BindConfig() { //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Expected O, but got Unknown //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_0129: Unknown result type (might be due to invalid IL or missing references) //IL_0133: Expected O, but got Unknown CfgEnableMod = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "EnableMod", true, "Enable this mod. このMODの有効無効"); CfgPreLoadApply = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "PreLoadApply", true, "Apply default upgrades before level loading starts. レベルロード開始前にデフォルトアップグレードを先行付与"); CfgPostLoadRepairApply = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "PostLoadRepairApply", true, "Repair missing upgrades after level generation as a fallback. レベル生成後に不足分を補修するフォールバック"); CfgNewJoinSync = ((BaseUnityPlugin)this).Config.Bind<bool>("A General", "NewJoinSync", true, "Apply missing default upgrades to late join players. 途中参加者に不足分だけ同期付与"); CfgPreLoadSyncWaitSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("A General", "PreLoadSyncWaitSeconds", 0.5f, new ConfigDescription("Wait seconds after Stats sync before starting level load. Stats同期後にレベルロードを開始するまでの待機秒数", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 3f), Array.Empty<object>())); CfgPostLoadApplyDelay = ((BaseUnityPlugin)this).Config.Bind<float>("A General", "PostLoadApplyDelay", 1f, new ConfigDescription("Delay seconds before post-load repair. ロード後補修までの待機秒数", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 10f), Array.Empty<object>())); CfgJoinSyncWindowSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("A General", "JoinSyncWindowSeconds", 30f, new ConfigDescription("Retry window seconds for late join sync. 途中参加同期の再試行秒数", (AcceptableValueBase)(object)new AcceptableValueRange<float>(5f, 120f), Array.Empty<object>())); CfgHealth = BindUpgrade("Health", "Health upgrade default value. ヘルスアップグレード初期値"); CfgStamina = BindUpgrade("Stamina", "Stamina upgrade default value. スタミナアップグレード初期値"); CfgExtraJump = BindUpgrade("ExtraJump", "Extra jump upgrade default value. ジャンプアップグレード初期値"); CfgLaunch = BindUpgrade("Launch", "Tumble launch upgrade default value. 打ち上げアップグレード初期値"); CfgTumbleClimb = BindUpgrade("TumbleClimb", "Tumble climb upgrade default value. よじ登りアップグレード初期値"); CfgMapPlayerCount = BindUpgrade("MapPlayerCount", "Map player count upgrade default value. プレイヤーカウントアップグレード初期値"); CfgDeathHeadBattery = BindUpgrade("DeathHeadBattery", "Death head battery upgrade default value. デスヘッドバッテリーアップグレード初期値"); CfgSpeed = BindUpgrade("Speed", "Speed upgrade default value. スピードアップグレード初期値"); CfgStrength = BindUpgrade("Strength", "Strength upgrade default value. 筋力アップグレード初期値"); CfgThrow = BindUpgrade("Throw", "Throw upgrade default value. 投擲力アップグレード初期値"); CfgRange = BindUpgrade("Range", "Grab range upgrade default value. 掴み範囲アップグレード初期値"); CfgCrouchRest = BindUpgrade("CrouchRest", "Crouch rest upgrade default value. しゃがみ回復アップグレード初期値"); CfgTumbleWings = BindUpgrade("TumbleWings", "Tumble wings upgrade default value. 羽アップグレード初期値"); CfgEnableLog = ((BaseUnityPlugin)this).Config.Bind<bool>("Z Debug", "EnableLog", true, "Enable log output. ログ出力有効無効"); } private ConfigEntry<int> BindUpgrade(string key, string description) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown return ((BaseUnityPlugin)this).Config.Bind<int>("B Upgrades", key, 1, new ConfigDescription(description, (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 50), Array.Empty<object>())); } internal void StartPreLoadChangeLevel(RunManager runManager, bool completedLevel, bool levelFailed, ChangeLevelType changeLevelType) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) if (!preLoadChangeLevelInProgress) { ((MonoBehaviour)this).StartCoroutine(CoPreLoadApplyThenChangeLevel(runManager, completedLevel, levelFailed, changeLevelType)); } } [IteratorStateMachine(typeof(<CoPreLoadApplyThenChangeLevel>d__37))] private IEnumerator CoPreLoadApplyThenChangeLevel(RunManager runManager, bool completedLevel, bool levelFailed, ChangeLevelType changeLevelType) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoPreLoadApplyThenChangeLevel>d__37(0) { <>4__this = this, runManager = runManager, completedLevel = completedLevel, levelFailed = levelFailed, changeLevelType = changeLevelType }; } internal void SchedulePostLoadRepair(string reason) { if (IsModEnabled() && CfgPostLoadRepairApply.Value) { if (postLoadRepairCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(postLoadRepairCoroutine); postLoadRepairCoroutine = null; } postLoadRepairCoroutine = ((MonoBehaviour)this).StartCoroutine(CoPostLoadRepair(reason)); } } [IteratorStateMachine(typeof(<CoPostLoadRepair>d__39))] private IEnumerator CoPostLoadRepair(string reason) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoPostLoadRepair>d__39(0) { <>4__this = this, reason = reason }; } internal static void StartNewJoinSync(PlayerAvatar playerAvatar, string reason) { if (IsModEnabled() && CfgNewJoinSync != null && CfgNewJoinSync.Value && IsHostOrSingleSafe() && IsTargetGameplaySceneSafe() && IsLevelGeneratedSafe() && !((Object)(object)Instance == (Object)null) && !((Object)(object)playerAvatar == (Object)null)) { ((MonoBehaviour)Instance).StartCoroutine(CoNewJoinSync(playerAvatar, reason)); } } [IteratorStateMachine(typeof(<CoNewJoinSync>d__41))] private static IEnumerator CoNewJoinSync(PlayerAvatar playerAvatar, string reason) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CoNewJoinSync>d__41(0) { playerAvatar = playerAvatar, reason = reason }; } internal static void ApplyDefaultUpgradesForCurrentPlayers(string reason) { if (IsModEnabled() && IsHostOrSingleSafe()) { ApplyDefaultUpgradesForPlayers(GetSafePlayerList(), reason); } } internal static void ApplyDefaultUpgradesForPlayers(List<PlayerAvatar> playerList, string reason) { if ((Object)(object)StatsManager.instance == (Object)null) { WriteWarning("StatsManager.instance が null のため付与を中止: " + reason); return; } if (playerList == null || playerList.Count == 0) { WriteWarning("プレイヤー一覧が空のため付与を中止: " + reason); return; } bool flag = false; int num = 0; WriteInfo("デフォルトアップグレード付与開始: reason=" + reason + " / playerCount=" + playerList.Count); for (int i = 0; i < playerList.Count; i++) { PlayerAvatar val = playerList[i]; if (!((Object)(object)val == (Object)null)) { string steamId = GetSteamId(val); string playerName = GetPlayerName(val); if (string.IsNullOrEmpty(steamId)) { WriteWarning("steamID 未取得プレイヤーをスキップ: " + playerName); } else if (ApplyMissingUpgradesToPlayer(steamId, playerName, reason)) { flag = true; num++; } } } if (flag) { SyncStatsSafe(reason); WriteInfo("デフォルトアップグレード付与完了: reason=" + reason + " / changedPlayers=" + num + " / 同期実行"); } else { WriteInfo("デフォルトアップグレード付与完了: reason=" + reason + " / 変更なし"); } } internal static bool ApplyMissingUpgradesToPlayer(string steamId, string playerName, string reason) { if (string.IsNullOrEmpty(steamId)) { return false; } if ((Object)(object)StatsManager.instance == (Object)null) { return false; } List<UpgradeEntry> upgradeEntries = GetUpgradeEntries(); bool result = false; for (int i = 0; i < upgradeEntries.Count; i++) { UpgradeEntry upgradeEntry = upgradeEntries[i]; int num = Mathf.Clamp(upgradeEntry.Target.Value, 0, 50); Dictionary<string, int> dictionary = upgradeEntry.DictionaryGetter(); if (dictionary == null) { continue; } if (!dictionary.ContainsKey(steamId)) { dictionary[steamId] = 0; } int num2 = dictionary[steamId]; int num3 = num - num2; if (num3 > 0) { dictionary[steamId] = num2 + num3; if (upgradeEntry.Name == "Health") { ApplyHealthRecoveryToStats(steamId, num3, reason); } if (!IsPreLoadApplyReason(reason)) { ApplyUpgradeRightAwayWithoutPunManager(upgradeEntry.Name, steamId, num3); } result = true; WriteInfo("適用: reason=" + reason + " / player=" + playerName + " / upgrade=" + upgradeEntry.Name + " / current=" + num2 + " / target=" + num + " / add=" + num3); } } return result; } private static bool IsPreLoadApplyReason(string reason) { if (string.IsNullOrEmpty(reason)) { return false; } return reason.IndexOf("PreLoadBeforeChangeLevel", StringComparison.OrdinalIgnoreCase) >= 0; } private static void ApplyHealthRecoveryToStats(string steamId, int diff, string reason) { if ((Object)(object)StatsManager.instance == (Object)null || string.IsNullOrEmpty(steamId) || diff <= 0) { return; } try { int num = StatsManager.instance.GetPlayerHealth(steamId); if (num <= 0) { num = 1; } int num2 = 100 + StatsManager.instance.GetPlayerMaxHealth(steamId); int num3 = 20 * diff; int num4 = Mathf.Clamp(num + num3, 0, num2); StatsManager.instance.SetPlayerHealth(steamId, num4, true); WriteInfo("ヘルス回復反映: reason=" + reason + " / steamId=" + steamId + " / current=" + num + " / add=" + num3 + " / result=" + num4 + " / max=" + num2); } catch (Exception ex) { WriteException("ヘルス回復Stats反映失敗", ex); } } private static void ApplyHealthStateRightAway(string steamId, PlayerAvatar playerAvatar, string reason) { if ((Object)(object)StatsManager.instance == (Object)null || string.IsNullOrEmpty(steamId) || (Object)(object)playerAvatar == (Object)null || (Object)(object)playerAvatar.playerHealth == (Object)null) { return; } try { int playerHealth = StatsManager.instance.GetPlayerHealth(steamId); int num = 100 + StatsManager.instance.GetPlayerMaxHealth(steamId); playerHealth = Mathf.Clamp(playerHealth, 0, num); PlayerHealth playerHealth2 = playerAvatar.playerHealth; playerHealth2.maxHealth = num; if (GameManager.Multiplayer() && (Object)(object)playerHealth2.photonView != (Object)null) { playerHealth2.photonView.RPC("UpdateHealthRPC", (RpcTarget)0, new object[4] { playerHealth, num, false, false }); } else { playerHealth2.health = playerHealth; } WriteInfo("ヘルス即時反映: reason=" + reason + " / steamId=" + steamId + " / health=" + playerHealth + " / max=" + num); } catch (Exception ex) { WriteException("ヘルス即時反映失敗", ex); } } private static void ApplyUpgradeRightAwayWithoutPunManager(string upgradeName, string steamId, int diff) { if (diff <= 0 || string.IsNullOrEmpty(upgradeName) || string.IsNullOrEmpty(steamId)) { return; } PlayerAvatar val = null; try { val = SemiFunc.PlayerAvatarGetFromSteamID(steamId); } catch { val = null; } if ((Object)(object)val == (Object)null) { return; } try { switch (upgradeName) { case "Health": ApplyHealthStateRightAway(steamId, val, "RightAwayWithoutPunManager"); break; case "Stamina": if ((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal() && (Object)(object)PlayerController.instance != (Object)null) { PlayerController instance5 = PlayerController.instance; instance5.EnergyStart += 10f * (float)diff; PlayerController.instance.EnergyCurrent = PlayerController.instance.EnergyStart; } break; case "ExtraJump": if ((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal() && (Object)(object)PlayerController.instance != (Object)null) { PlayerController instance4 = PlayerController.instance; instance4.JumpExtra += diff; } break; case "Launch": if ((Object)(object)val.tumble != (Object)null) { PlayerTumble tumble = val.tumble; tumble.tumbleLaunch += diff; } break; case "TumbleClimb": { PlayerAvatar obj4 = val; obj4.upgradeTumbleClimb += (float)diff; break; } case "MapPlayerCount": { PlayerAvatar obj6 = val; obj6.upgradeMapPlayerCount += diff; break; } case "DeathHeadBattery": { PlayerAvatar obj5 = val; obj5.upgradeDeathHeadBattery += (float)diff; break; } case "Speed": if ((Object)(object)val == (Object)(object)SemiFunc.PlayerAvatarLocal() && (Object)(object)PlayerController.instance != (Object)null) { PlayerController instance = PlayerController.instance; instance.SprintSpeed += (float)diff; PlayerController instance2 = PlayerController.instance; instance2.SprintSpeedUpgrades += (float)diff; PlayerController instance3 = PlayerController.instance; instance3.playerOriginalSprintSpeed += (float)diff; } break; case "Strength": if ((Object)(object)val.physGrabber != (Object)null) { PhysGrabber physGrabber3 = val.physGrabber; physGrabber3.grabStrength += 0.2f * (float)diff; } break; case "Throw": if ((Object)(object)val.physGrabber != (Object)null) { PhysGrabber physGrabber2 = val.physGrabber; physGrabber2.throwStrength += 0.3f * (float)diff; } break; case "Range": if ((Object)(object)val.physGrabber != (Object)null) { PhysGrabber physGrabber = val.physGrabber; physGrabber.grabRange += (float)diff; } break; case "CrouchRest": { PlayerAvatar obj3 = val; obj3.upgradeCrouchRest += (float)diff; break; } case "TumbleWings": { PlayerAvatar obj2 = val; obj2.upgradeTumbleWings += (float)diff; break; } } } catch (Exception ex) { WriteException("直接アップグレード即時反映失敗: " + upgradeName, ex); } } private static void SyncStatsSafe(string reason) { try { SemiFunc.StatSyncAll(); } catch (Exception ex) { WriteException("StatSyncAll 失敗: " + reason, ex); } } internal static List<UpgradeEntry> GetUpgradeEntries() { StatsManager statsManager = StatsManager.instance; return new List<UpgradeEntry> { new UpgradeEntry("Health", CfgHealth, () => statsManager.playerUpgradeHealth), new UpgradeEntry("Stamina", CfgStamina, () => statsManager.playerUpgradeStamina), new UpgradeEntry("ExtraJump", CfgExtraJump, () => statsManager.playerUpgradeExtraJump), new UpgradeEntry("Launch", CfgLaunch, () => statsManager.playerUpgradeLaunch), new UpgradeEntry("TumbleClimb", CfgTumbleClimb, () => statsManager.playerUpgradeTumbleClimb), new UpgradeEntry("MapPlayerCount", CfgMapPlayerCount, () => statsManager.playerUpgradeMapPlayerCount), new UpgradeEntry("DeathHeadBattery", CfgDeathHeadBattery, () => statsManager.playerUpgradeDeathHeadBattery), new UpgradeEntry("Speed", CfgSpeed, () => statsManager.playerUpgradeSpeed), new UpgradeEntry("Strength", CfgStrength, () => statsManager.playerUpgradeStrength), new UpgradeEntry("Throw", CfgThrow, () => statsManager.playerUpgradeThrow), new UpgradeEntry("Range", CfgRange, () => statsManager.playerUpgradeRange), new UpgradeEntry("CrouchRest", CfgCrouchRest, () => statsManager.playerUpgradeCrouchRest), new UpgradeEntry("TumbleWings", CfgTumbleWings, () => statsManager.playerUpgradeTumbleWings) }; } internal static bool ShouldInterceptChangeLevel(RunManager runManager, bool completedLevel, bool levelFailed, ChangeLevelType changeLevelType) { //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Invalid comparison between Unknown and I4 if (!IsModEnabled()) { return false; } if (CfgPreLoadApply == null || !CfgPreLoadApply.Value) { return false; } if (suppressChangeLevelPrefix || preLoadChangeLevelInProgress) { return false; } if ((Object)(object)runManager == (Object)null) { return false; } if (!IsHostOrSingleSafe()) { return false; } try { if ((Object)(object)runManager.levelCurrent == (Object)(object)runManager.levelLobby) { return (int)changeLevelType == 0 || (int)changeLevelType == 1; } } catch { return false; } return false; } internal static bool IsModEnabled() { return CfgEnableMod != null && CfgEnableMod.Value; } internal static bool IsHostOrSingleSafe() { try { return SemiFunc.IsMasterClientOrSingleplayer(); } catch { try { return !PhotonNetwork.InRoom || PhotonNetwork.IsMasterClient; } catch { return false; } } } internal static bool IsMultiplayerSafe() { try { return SemiFunc.IsMultiplayer(); } catch { try { return PhotonNetwork.InRoom; } catch { return false; } } } internal static bool IsTargetGameplaySceneSafe() { try { return SemiFunc.RunIsLevel() || SemiFunc.RunIsArena() || SemiFunc.RunIsTutorial(); } catch { return false; } } internal static bool IsLevelGeneratedSafe() { try { return (Object)(object)LevelGenerator.Instance != (Object)null && LevelGenerator.Instance.Generated; } catch { return false; } } internal static string GetCurrentLevelSignature() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); string name = ((Scene)(ref activeScene)).name; int num = -1; string text = string.Empty; try { if ((Object)(object)RunManager.instance != (Object)null) { num = RunManager.instance.levelsCompleted; text = (((Object)(object)RunManager.instance.levelCurrent != (Object)null) ? ((Object)RunManager.instance.levelCurrent).name : string.Empty); } } catch { } return name + "|" + text + "|" + num; } private static List<PlayerAvatar> GetSafePlayerList() { Dictionary<string, PlayerAvatar> dictionary = new Dictionary<string, PlayerAvatar>(); try { List<PlayerAvatar> list = SemiFunc.PlayerGetList(); if (list != null) { for (int i = 0; i < list.Count; i++) { AddPlayerToMap(dictionary, list[i]); } } } catch { } if (dictionary.Count == 0) { try { PlayerAvatar[] array = Resources.FindObjectsOfTypeAll<PlayerAvatar>(); for (int j = 0; j < array.Length; j++) { AddPlayerToMap(dictionary, array[j]); } } catch { } } return new List<PlayerAvatar>(dictionary.Values); } private static void AddPlayerToMap(Dictionary<string, PlayerAvatar> map, PlayerAvatar avatar) { if (map == null || (Object)(object)avatar == (Object)null) { return; } string text = GetSteamId(avatar); if (string.IsNullOrEmpty(text)) { try { text = "instance:" + ((Object)avatar).GetInstanceID(); } catch { return; } } map[text] = avatar; } private static string GetSteamId(PlayerAvatar avatar) { if ((Object)(object)avatar == (Object)null) { return string.Empty; } try { if (!string.IsNullOrEmpty(avatar.steamID)) { return avatar.steamID; } } catch { } try { string text = SemiFunc.PlayerGetSteamID(avatar); if (!string.IsNullOrEmpty(text)) { return text; } } catch { } return string.Empty; } private static string GetPlayerName(PlayerAvatar avatar) { if ((Object)(object)avatar == (Object)null) { return "Unknown"; } try { if (!string.IsNullOrEmpty(avatar.playerName)) { return avatar.playerName; } } catch { } try { string text = SemiFunc.PlayerGetName(avatar); if (!string.IsNullOrEmpty(text)) { return text; } } catch { } try { return ((Object)avatar).name; } catch { return "Unknown"; } } internal static void WriteInfo(string message) { if (Log != null && (CfgEnableLog == null || CfgEnableLog.Value)) { Log.LogInfo((object)message); } } internal static void WriteWarning(string message) { if (Log != null && (CfgEnableLog == null || CfgEnableLog.Value)) { Log.LogWarning((object)message); } } internal static void WriteException(string title, Exception ex) { if (Log != null && (CfgEnableLog == null || CfgEnableLog.Value)) { Log.LogError((object)(title + "\n" + ex)); } } } internal sealed class UpgradeEntry { public string Name; public ConfigEntry<int> Target; public Func<Dictionary<string, int>> DictionaryGetter; public UpgradeEntry(string name, ConfigEntry<int> target, Func<Dictionary<string, int>> dictionaryGetter) { Name = name; Target = target; DictionaryGetter = dictionaryGetter; } } [HarmonyPatch(typeof(RunManager), "ChangeLevel")] internal static class RunManager_ChangeLevel_Patch { private static bool Prefix(RunManager __instance, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType) { //IL_0005: 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) try { if (!DefaultUpgradePlugin.ShouldInterceptChangeLevel(__instance, _completedLevel, _levelFailed, _changeLevelType)) { return true; } if ((Object)(object)DefaultUpgradePlugin.Instance != (Object)null) { DefaultUpgradePlugin.Instance.StartPreLoadChangeLevel(__instance, _completedLevel, _levelFailed, _changeLevelType); return false; } } catch (Exception ex) { DefaultUpgradePlugin.WriteException("RunManager.ChangeLevel Prefix 失敗", ex); } return true; } } [HarmonyPatch(typeof(LevelGenerator), "GenerateDone")] internal static class LevelGenerator_GenerateDone_Patch { private static void Postfix() { try { if ((Object)(object)DefaultUpgradePlugin.Instance != (Object)null) { DefaultUpgradePlugin.Instance.SchedulePostLoadRepair("GenerateDone"); } } catch (Exception ex) { DefaultUpgradePlugin.WriteException("GenerateDone Postfix 失敗", ex); } } } [HarmonyPatch(typeof(PlayerAvatar), "Awake")] internal static class PlayerAvatar_Awake_Patch { private static void Postfix(PlayerAvatar __instance) { try { DefaultUpgradePlugin.StartNewJoinSync(__instance, "PlayerAvatar.Awake"); } catch (Exception ex) { DefaultUpgradePlugin.WriteException("PlayerAvatar Awake Postfix 失敗", ex); } } } [HarmonyPatch(typeof(PlayerAvatar), "LateStart")] internal static class PlayerAvatar_LateStart_Patch { private static void Postfix(PlayerAvatar __instance) { try { DefaultUpgradePlugin.StartNewJoinSync(__instance, "PlayerAvatar.LateStart"); } catch (Exception ex) { DefaultUpgradePlugin.WriteException("PlayerAvatar LateStart Postfix 失敗", ex); } } } [HarmonyPatch(typeof(NetworkManager), "OnPlayerEnteredRoom")] internal static class NetworkManager_OnPlayerEnteredRoom_Patch { private static void Postfix(Player newPlayer) { try { if (newPlayer != null) { DefaultUpgradePlugin.WriteInfo("プレイヤー参加検知: actor=" + newPlayer.ActorNumber + " / name=" + newPlayer.NickName + " / NewJoinSync=" + (DefaultUpgradePlugin.CfgNewJoinSync != null && DefaultUpgradePlugin.CfgNewJoinSync.Value)); } } catch (Exception ex) { DefaultUpgradePlugin.WriteException("OnPlayerEnteredRoom Postfix 失敗", ex); } } } }