using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Threading;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Peak.Afflictions;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine;
using Zorro.Core;
[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("PeakClassMod")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PeakClassMod")]
[assembly: AssemblyCopyright("Copyright © 2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("68e93fcd-af72-447e-8fcc-2e7429a66921")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace PeakClassMod;
public class Class1
{
}
[BepInPlugin("com.peakmod.classmod", "PEAK Class Mod", "1.0.0")]
public class PeakClassModPlugin : BaseUnityPlugin
{
[CompilerGenerated]
private sealed class <LogAllHatsDelayed>d__11 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public PeakClassModPlugin <>4__this;
private ManualLogSource <logger>5__1;
private CustomizationOption[] <hats>5__2;
private int <i>5__3;
private CustomizationOption <hat>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <LogAllHatsDelayed>d__11(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<hats>5__2 = null;
<hat>5__4 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
//IL_0112: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(10f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
<logger>5__1.LogInfo((object)"[ClassMod] ===== HAT LIST START =====");
<hats>5__2 = Singleton<Customization>.Instance?.hats;
if (<hats>5__2 != null)
{
<logger>5__1.LogInfo((object)$"[ClassMod] Total hats found: {<hats>5__2.Length}");
<i>5__3 = 0;
while (<i>5__3 < <hats>5__2.Length)
{
<hat>5__4 = <hats>5__2[<i>5__3];
if ((Object)(object)<hat>5__4 != (Object)null)
{
<logger>5__1.LogInfo((object)$"[ClassMod] Hat[{<i>5__3}]: Name='{((Object)<hat>5__4).name}', Type='{<hat>5__4.type}', RequiredAchievement='{<hat>5__4.requiredAchievement}'");
}
else
{
<logger>5__1.LogInfo((object)$"[ClassMod] Hat[{<i>5__3}]: NULL");
}
<hat>5__4 = null;
<i>5__3++;
}
}
else
{
<logger>5__1.LogWarning((object)"[ClassMod] No hats found! Customization singleton might not be loaded yet.");
}
<logger>5__1.LogInfo((object)"[ClassMod] ===== HAT LIST END =====");
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static Harmony harmony;
public static string currentClass = "None";
public static bool scoutActive = false;
public static bool medicActive = false;
public static bool techPriestActive = false;
public static bool mushroomancerActive = false;
public static bool greatEpeeActive = false;
public static bool rogueActive = false;
public static bool eddieActive = false;
public static bool billActive = false;
private void Awake()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0010: Expected O, but got Unknown
harmony = new Harmony("com.peakmod.classmod");
harmony.PatchAll();
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
val.LogInfo((object)"[ClassMod] Harmony patches applied!");
((MonoBehaviour)this).StartCoroutine(LogAllHatsDelayed());
}
[IteratorStateMachine(typeof(<LogAllHatsDelayed>d__11))]
private IEnumerator LogAllHatsDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <LogAllHatsDelayed>d__11(0)
{
<>4__this = this
};
}
private void OnDestroy()
{
Harmony obj = harmony;
if (obj != null)
{
obj.UnpatchSelf();
}
}
}
[HarmonyPatch(typeof(CharacterCustomization), "SetCharacterHat")]
public class CharacterCustomization_SetCharacterHat_Patch
{
[CompilerGenerated]
private sealed class <RefreshUIDelayed>d__1 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <RefreshUIDelayed>d__1(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)GUIManager.instance != (Object)null && (Object)(object)GUIManager.instance.bar != (Object)null)
{
GUIManager.instance.bar.ChangeBar();
}
if (ClassManager.IsScoutActive() && (Object)(object)Character.localCharacter != (Object)null)
{
<>2__current = null;
<>1__state = 2;
return true;
}
break;
case 2:
<>1__state = -1;
if ((Object)(object)GUIManager.instance != (Object)null && (Object)(object)GUIManager.instance.bar != (Object)null)
{
GUIManager.instance.bar.ChangeBar();
}
break;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static void Postfix(int index)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
string text = "Unknown";
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && index >= 0 && index < array.Length)
{
CustomizationOption obj = array[index];
text = ((obj != null) ? ((Object)obj).name : null) ?? "NULL";
}
val.LogInfo((object)$"[ClassMod] Hat changed to index: {index}, name: {text}");
switch (index)
{
case 12:
ClassManager.ActivateScoutClass();
val.LogInfo((object)"[ClassMod] Scout class activated!");
return;
case 7:
ClassManager.ActivateMedicClass();
val.LogInfo((object)"[ClassMod] Medic class activated!");
return;
case 10:
ClassManager.ActivateTechPriestClass();
val.LogInfo((object)"[ClassMod] Tech-Priest class activated!");
return;
}
switch (text)
{
case "Hat_Mushroom":
ClassManager.ActivateMushroomancerClass();
val.LogInfo((object)"[ClassMod] Mushroomancer class activated!");
return;
case "Hat_Propeller":
ClassManager.ActivateGreatEpeeClass();
val.LogInfo((object)"[ClassMod] Great Épée class activated!");
return;
case "Hat_NinjaHeadband":
ClassManager.ActivateRogueClass();
val.LogInfo((object)"[ClassMod] Rogue class activated!");
return;
}
ClassManager.DeactivateAllClasses();
val.LogInfo((object)"[ClassMod] All classes deactivated!");
if ((Object)(object)Character.localCharacter != (Object)null)
{
((MonoBehaviour)Character.localCharacter).StartCoroutine(RefreshUIDelayed());
}
}
[IteratorStateMachine(typeof(<RefreshUIDelayed>d__1))]
private static IEnumerator RefreshUIDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <RefreshUIDelayed>d__1(0);
}
}
[HarmonyPatch(typeof(Character), "UseStamina")]
public class Character_UseStamina_Patch
{
private static void Prefix(Character __instance, ref float usage, bool useBonusStamina)
{
if (ClassManager.IsScoutActive())
{
usage *= 0.75f;
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "AddStatus")]
public class CharacterAfflictions_AddStatus_Scout_Patch
{
private static bool Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, ref float amount, bool fromRPC)
{
//IL_002f: Unknown result type (might be due to invalid IL or missing references)
//IL_0031: Invalid comparison between Unknown and I4
Character character = __instance.character;
if ((Object)(object)character == (Object)null || !character.IsLocal)
{
return true;
}
if (ClassManager.IsScoutActive() && (int)statusType == 1)
{
amount *= 1.5f;
}
return true;
}
}
[HarmonyPatch(typeof(Character), "ClampStamina")]
public class Character_ClampStamina_Patch
{
private static void Postfix(Character __instance)
{
if (ClassManager.IsScoutActive() && __instance.IsLocal && (Object)(object)GUIManager.instance != (Object)null && (Object)(object)GUIManager.instance.bar != (Object)null)
{
GUIManager.instance.bar.ChangeBar();
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "UpdateNormalStatuses")]
public class CharacterAfflictions_UpdateNormalStatuses_Patch
{
private static void Prefix(CharacterAfflictions __instance)
{
if (!((Object)(object)__instance.character != (Object)null))
{
return;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val == null)
{
return;
}
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
__instance.currentStatuses[1] = 0f;
}
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "SetStatus")]
public class CharacterAfflictions_SetStatus_Patch
{
[CompilerGenerated]
private sealed class <RefreshUIDelayed>d__2 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <RefreshUIDelayed>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)GUIManager.instance != (Object)null && (Object)(object)GUIManager.instance.bar != (Object)null)
{
GUIManager.instance.bar.ChangeBar();
}
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static void Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, ref float amount)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_012c: Invalid comparison between Unknown and I4
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0130: Invalid comparison between Unknown and I4
if ((int)statusType == 5 && amount == 0f)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
val.LogInfo((object)$"[ClassMod] SetStatus called for Curse, amount: {amount}");
if ((Object)(object)__instance.character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val2 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val2 != null)
{
int currentHat = val2.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Medic" || name == "MedicHelmet")
{
amount = __instance.GetCurrentStatus((STATUSTYPE)5);
val.LogInfo((object)$"[ClassMod] Prevented curse removal for Medic class character: {__instance.character.characterName}, keeping value: {amount}");
}
}
}
}
}
if (!((Object)(object)__instance.character != (Object)null) || ((int)statusType != 7 && (int)statusType != 1))
{
return;
}
PersistentPlayerDataService service2 = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val3 = ((service2 != null) ? service2.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val3 == null)
{
return;
}
int currentHat2 = val3.customizationData.currentHat;
CustomizationOption[] array2 = Singleton<Customization>.Instance?.hats;
if (array2 != null && currentHat2 >= 0 && currentHat2 < array2.Length)
{
string name2 = ((Object)array2[currentHat2]).name;
if (name2 == "Hat_Crab")
{
amount = 0f;
}
}
}
private static void Postfix(CharacterAfflictions __instance, STATUSTYPE statusType, float amount)
{
}
[IteratorStateMachine(typeof(<RefreshUIDelayed>d__2))]
private static IEnumerator RefreshUIDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <RefreshUIDelayed>d__2(0);
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "SubtractStatus")]
public class CharacterAfflictions_SubtractStatus_Patch
{
private static void Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, float amount, bool fromRPC, ref bool __state)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
__state = false;
if ((int)statusType != 5)
{
return;
}
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
val.LogInfo((object)$"[ClassMod] SubtractStatus called for Curse, amount: {amount}");
if (!((Object)(object)__instance.character != (Object)null))
{
return;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val2 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val2 == null)
{
return;
}
int currentHat = val2.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Medic" || name == "MedicHelmet")
{
__state = true;
val.LogInfo((object)"[ClassMod] Medic class detected, will prevent curse removal");
}
}
}
private static void Postfix(CharacterAfflictions __instance, STATUSTYPE statusType, float amount, bool fromRPC, bool __state)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
if (__state && (int)statusType == 5)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
float num = 0.12f;
__instance.currentStatuses[5] = num;
val.LogInfo((object)$"[ClassMod] Restored curse effect to {num} for Medic class character: {__instance.character.characterName}");
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "AddStatus")]
public class CharacterAfflictions_AddStatus_Patch
{
[CompilerGenerated]
private sealed class <RefreshUIDelayed>d__2 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <RefreshUIDelayed>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)GUIManager.instance != (Object)null && (Object)(object)GUIManager.instance.bar != (Object)null)
{
GUIManager.instance.bar.ChangeBar();
}
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static bool Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, ref float amount, bool fromRPC)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
if ((int)statusType == 1 && (Object)(object)__instance.character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
amount = 0f;
}
}
}
}
return true;
}
private static void Postfix(CharacterAfflictions __instance, STATUSTYPE statusType, float amount, bool fromRPC)
{
}
[IteratorStateMachine(typeof(<RefreshUIDelayed>d__2))]
private static IEnumerator RefreshUIDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <RefreshUIDelayed>d__2(0);
}
}
[HarmonyPatch(typeof(RunManager), "StartRun")]
public class RunManager_StartRun_Patch
{
[CompilerGenerated]
private sealed class <GiveMedkitsDelayed>d__1 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
private ManualLogSource <logger>5__1;
private int <maxWaitTime>5__2;
private int <currentWait>5__3;
private HashSet<Character> <processedCharacters>5__4;
private bool <allPlayersHaveCharacters>5__5;
private Player[] <>s__6;
private int <>s__7;
private Player <player>5__8;
private Player[] <>s__9;
private int <>s__10;
private Player <player>5__11;
private Character <character>5__12;
private List<Character>.Enumerator <>s__13;
private Character <character>5__14;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GiveMedkitsDelayed>d__1(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<processedCharacters>5__4 = null;
<>s__6 = null;
<player>5__8 = null;
<>s__9 = null;
<player>5__11 = null;
<character>5__12 = null;
<>s__13 = default(List<Character>.Enumerator);
<character>5__14 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_003e: Expected O, but got Unknown
//IL_015e: Unknown result type (might be due to invalid IL or missing references)
//IL_0168: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(5f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if (!PhotonNetwork.IsMasterClient)
{
return false;
}
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
<logger>5__1.LogInfo((object)"[ClassMod] Checking for Medic class characters...");
<maxWaitTime>5__2 = 30;
<currentWait>5__3 = 0;
break;
case 2:
<>1__state = -1;
<currentWait>5__3++;
break;
}
if (<currentWait>5__3 < <maxWaitTime>5__2)
{
<allPlayersHaveCharacters>5__5 = true;
<>s__6 = PhotonNetwork.PlayerList;
for (<>s__7 = 0; <>s__7 < <>s__6.Length; <>s__7++)
{
<player>5__8 = <>s__6[<>s__7];
if ((Object)(object)PlayerHandler.GetPlayerCharacter(<player>5__8) == (Object)null)
{
<allPlayersHaveCharacters>5__5 = false;
break;
}
<player>5__8 = null;
}
<>s__6 = null;
if (!<allPlayersHaveCharacters>5__5)
{
<logger>5__1.LogInfo((object)$"[ClassMod] Waiting for all players to load characters... ({<currentWait>5__3}/{<maxWaitTime>5__2})");
<>2__current = (object)new WaitForSeconds(1f);
<>1__state = 2;
return true;
}
<logger>5__1.LogInfo((object)"[ClassMod] All players have characters loaded!");
}
<processedCharacters>5__4 = new HashSet<Character>();
<>s__9 = PhotonNetwork.PlayerList;
for (<>s__10 = 0; <>s__10 < <>s__9.Length; <>s__10++)
{
<player>5__11 = <>s__9[<>s__10];
<character>5__12 = PlayerHandler.GetPlayerCharacter(<player>5__11);
if (!((Object)(object)<character>5__12 == (Object)null) && !<character>5__12.isBot && !<processedCharacters>5__4.Contains(<character>5__12))
{
<logger>5__1.LogInfo((object)$"[ClassMod] Checking character via PlayerList: {<character>5__12.characterName} (IsLocal: {<character>5__12.IsLocal})");
if (IsMedicClass(<character>5__12))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Medic class via PlayerList: " + <character>5__12.characterName));
GiveFirstAidKit(<character>5__12);
<processedCharacters>5__4.Add(<character>5__12);
}
else if (IsTechPriestClass(<character>5__12))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Tech-Priest class via PlayerList: " + <character>5__12.characterName));
GiveChainShooters(<character>5__12);
<processedCharacters>5__4.Add(<character>5__12);
}
else if (IsMushroomancerClass(<character>5__12))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Mushroomancer class via PlayerList: " + <character>5__12.characterName));
GiveMushroomancerItems(<character>5__12);
<processedCharacters>5__4.Add(<character>5__12);
}
else if (IsRogueClass(<character>5__12))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Rogue class via PlayerList: " + <character>5__12.characterName));
GiveRogueItems(<character>5__12);
<processedCharacters>5__4.Add(<character>5__12);
}
else
{
<logger>5__1.LogInfo((object)("[ClassMod] Character " + <character>5__12.characterName + " is NOT Medic, Tech-Priest, Mushroomancer, or Rogue class"));
}
<character>5__12 = null;
<player>5__11 = null;
}
}
<>s__9 = null;
<logger>5__1.LogInfo((object)$"[ClassMod] Character.AllCharacters count: {Character.AllCharacters.Count}");
<>s__13 = Character.AllCharacters.GetEnumerator();
try
{
while (<>s__13.MoveNext())
{
<character>5__14 = <>s__13.Current;
if (!((Object)(object)<character>5__14 == (Object)null) && !<character>5__14.isBot && !<processedCharacters>5__4.Contains(<character>5__14))
{
<logger>5__1.LogInfo((object)$"[ClassMod] Checking character via AllCharacters: {<character>5__14.characterName} (IsLocal: {<character>5__14.IsLocal})");
if (IsMedicClass(<character>5__14))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Medic class via AllCharacters: " + <character>5__14.characterName));
GiveFirstAidKit(<character>5__14);
<processedCharacters>5__4.Add(<character>5__14);
}
else if (IsTechPriestClass(<character>5__14))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Tech-Priest class via AllCharacters: " + <character>5__14.characterName));
GiveChainShooters(<character>5__14);
<processedCharacters>5__4.Add(<character>5__14);
}
else if (IsMushroomancerClass(<character>5__14))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Mushroomancer class via AllCharacters: " + <character>5__14.characterName));
GiveMushroomancerItems(<character>5__14);
<processedCharacters>5__4.Add(<character>5__14);
}
else if (IsRogueClass(<character>5__14))
{
<logger>5__1.LogInfo((object)("[ClassMod] Found Rogue class via AllCharacters: " + <character>5__14.characterName));
GiveRogueItems(<character>5__14);
<processedCharacters>5__4.Add(<character>5__14);
}
else
{
<logger>5__1.LogInfo((object)("[ClassMod] Character " + <character>5__14.characterName + " is NOT Medic, Tech-Priest, Mushroomancer, or Rogue class (AllCharacters)"));
}
<character>5__14 = null;
}
}
}
finally
{
((IDisposable)<>s__13).Dispose();
}
<>s__13 = default(List<Character>.Enumerator);
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static void Postfix()
{
((MonoBehaviour)RunManager.Instance).StartCoroutine(GiveMedkitsDelayed());
}
[IteratorStateMachine(typeof(<GiveMedkitsDelayed>d__1))]
private static IEnumerator GiveMedkitsDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GiveMedkitsDelayed>d__1(0);
}
private static bool IsMedicClass(Character character)
{
if ((Object)(object)character == (Object)null || (Object)(object)character.refs?.customization == (Object)null)
{
return false;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)character).photonView.Owner) : null);
if (val == null)
{
return false;
}
int currentHat = val.customizationData.currentHat;
ManualLogSource val2 = Logger.CreateLogSource("PeakClassMod");
val2.LogInfo((object)$"[ClassMod] Character {character.characterName} hat index: {currentHat}");
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array == null || currentHat < 0 || currentHat >= array.Length)
{
return false;
}
string name = ((Object)array[currentHat]).name;
val2.LogInfo((object)("[ClassMod] Hat name: " + name));
return name == "Hat_Medic" || name == "MedicHelmet";
}
private static bool IsTechPriestClass(Character character)
{
if ((Object)(object)character == (Object)null || (Object)(object)character.refs?.customization == (Object)null)
{
return false;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)character).photonView.Owner) : null);
if (val == null)
{
return false;
}
int currentHat = val.customizationData.currentHat;
ManualLogSource val2 = Logger.CreateLogSource("PeakClassMod");
val2.LogInfo((object)$"[ClassMod] Character {character.characterName} hat index: {currentHat}");
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array == null || currentHat < 0 || currentHat >= array.Length)
{
return false;
}
string name = ((Object)array[currentHat]).name;
val2.LogInfo((object)("[ClassMod] Hat name: " + name));
return name == "Hat_Crab";
}
private static bool IsMushroomancerClass(Character character)
{
if ((Object)(object)character == (Object)null || (Object)(object)character.refs?.customization == (Object)null)
{
return false;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)character).photonView.Owner) : null);
if (val == null)
{
return false;
}
int currentHat = val.customizationData.currentHat;
ManualLogSource val2 = Logger.CreateLogSource("PeakClassMod");
val2.LogInfo((object)$"[ClassMod] Character {character.characterName} hat index: {currentHat}");
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array == null || currentHat < 0 || currentHat >= array.Length)
{
return false;
}
string name = ((Object)array[currentHat]).name;
val2.LogInfo((object)("[ClassMod] Hat name: " + name));
return name == "Hat_Mushroom";
}
private static bool IsRogueClass(Character character)
{
if ((Object)(object)character == (Object)null || (Object)(object)character.refs?.customization == (Object)null)
{
return false;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)character).photonView.Owner) : null);
if (val == null)
{
return false;
}
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array == null || currentHat < 0 || currentHat >= array.Length)
{
return false;
}
string name = ((Object)array[currentHat]).name;
return name == "Hat_NinjaHeadband";
}
private static void GiveFirstAidKit(Character character)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
Item val2 = null;
Item[] array = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val3 in array)
{
if (((Object)val3).name == "FirstAidKit")
{
val2 = val3;
val.LogInfo((object)$"[ClassMod] Found FirstAidKit with ID: {val3.itemID}");
break;
}
}
if ((Object)(object)val2 == (Object)null)
{
val.LogError((object)"[ClassMod] Could not find FirstAidKit prefab!");
return;
}
Item val4 = null;
Item[] array2 = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val5 in array2)
{
if (((Object)val5).name == "Cure-All")
{
val4 = val5;
val.LogInfo((object)$"[ClassMod] Found Cure-All with ID: {val5.itemID}");
break;
}
}
if ((Object)(object)val4 == (Object)null)
{
val.LogError((object)"[ClassMod] Could not find Cure-All prefab!");
}
else if ((Object)(object)character.player != (Object)null)
{
if (character.player.HasEmptySlot(val2.itemID))
{
ItemSlot val6 = default(ItemSlot);
if (character.player.AddItem(val2.itemID, (ItemInstanceData)null, ref val6))
{
val.LogInfo((object)$"[ClassMod] Successfully gave FirstAidKit to {character.characterName} in slot {val6.itemSlotID}");
}
else
{
val.LogError((object)("[ClassMod] Failed to add FirstAidKit to " + character.characterName));
}
}
else
{
val.LogWarning((object)("[ClassMod] No empty slots available for FirstAidKit for " + character.characterName));
}
if (character.player.HasEmptySlot(val4.itemID))
{
ItemSlot val7 = default(ItemSlot);
if (character.player.AddItem(val4.itemID, (ItemInstanceData)null, ref val7))
{
val.LogInfo((object)$"[ClassMod] Successfully gave Cure-All to {character.characterName} in slot {val7.itemSlotID}");
}
else
{
val.LogError((object)("[ClassMod] Failed to add Cure-All to " + character.characterName));
}
}
else
{
val.LogWarning((object)("[ClassMod] No empty slots available for Cure-All for " + character.characterName));
}
}
else
{
val.LogError((object)("[ClassMod] Character " + character.characterName + " has no player component!"));
}
}
private static void GiveChainShooters(Character character)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
Item val2 = null;
Item[] array = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val3 in array)
{
if (((Object)val3).name == "ChainShooter")
{
val2 = val3;
val.LogInfo((object)$"[ClassMod] Found ChainShooter with ID: {val3.itemID}");
break;
}
}
if ((Object)(object)val2 == (Object)null)
{
val.LogError((object)"[ClassMod] Could not find ChainShooter prefab!");
}
else if ((Object)(object)character.player != (Object)null)
{
int num = 0;
if (character.player.HasEmptySlot(val2.itemID))
{
ItemSlot val4 = default(ItemSlot);
if (character.player.AddItem(val2.itemID, (ItemInstanceData)null, ref val4))
{
val.LogInfo((object)$"[ClassMod] Successfully gave first ChainShooter to {character.characterName} in slot {val4.itemSlotID}");
num++;
}
else
{
val.LogError((object)("[ClassMod] Failed to add first ChainShooter to " + character.characterName));
}
}
else
{
val.LogWarning((object)("[ClassMod] No empty slots available for first ChainShooter for " + character.characterName));
}
if (character.player.HasEmptySlot(val2.itemID))
{
ItemSlot val5 = default(ItemSlot);
if (character.player.AddItem(val2.itemID, (ItemInstanceData)null, ref val5))
{
val.LogInfo((object)$"[ClassMod] Successfully gave second ChainShooter to {character.characterName} in slot {val5.itemSlotID}");
num++;
}
else
{
val.LogError((object)("[ClassMod] Failed to add second ChainShooter to " + character.characterName));
}
}
else
{
val.LogWarning((object)("[ClassMod] No empty slots available for second ChainShooter for " + character.characterName));
}
val.LogInfo((object)$"[ClassMod] Total ChainShooters given to {character.characterName}: {num}/2");
}
else
{
val.LogError((object)("[ClassMod] Character " + character.characterName + " has no player component!"));
}
}
private static void GiveMushroomancerItems(Character character)
{
ManualLogSource logger = Logger.CreateLogSource("PeakClassMod");
Item val = null;
Item[] array = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val2 in array)
{
if (((Object)val2).name == "ShelfShroom")
{
val = val2;
logger.LogInfo((object)$"[ClassMod] Found ShelfShroom with ID: {val2.itemID}");
break;
}
}
if ((Object)(object)val == (Object)null)
{
logger.LogError((object)"[ClassMod] Could not find ShelfShroom prefab!");
return;
}
Item val3 = null;
Item[] array2 = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val4 in array2)
{
if (((Object)val4).name == "HealingPuffShroom")
{
val3 = val4;
logger.LogInfo((object)$"[ClassMod] Found HealingPuffShroom with ID: {val4.itemID}");
break;
}
}
if ((Object)(object)val3 == (Object)null)
{
logger.LogError((object)"[ClassMod] Could not find HealingPuffShroom prefab!");
return;
}
Item val5 = null;
Item[] array3 = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val6 in array3)
{
if (((Object)val6).name == "BounceShroom")
{
val5 = val6;
logger.LogInfo((object)$"[ClassMod] Found BounceShroom with ID: {val6.itemID}");
break;
}
}
if ((Object)(object)val5 == (Object)null)
{
logger.LogError((object)"[ClassMod] Could not find BounceShroom prefab!");
}
else if ((Object)(object)character.player != (Object)null)
{
AddItemWithRetry(val, "ShelfShroom");
AddItemWithRetry(val3, "HealingPuffShroom");
AddItemWithRetry(val5, "BounceShroom");
}
else
{
logger.LogError((object)("[ClassMod] Character " + character.characterName + " has no player component!"));
}
bool AddItemWithRetry(Item prefab, string itemName)
{
int num = 5;
ItemSlot val7 = default(ItemSlot);
ItemSlot val8 = default(ItemSlot);
for (int l = 0; l < num; l++)
{
if (character.player.HasEmptySlot(prefab.itemID))
{
if (character.player.AddItem(prefab.itemID, (ItemInstanceData)null, ref val7))
{
logger.LogInfo((object)$"[ClassMod] Successfully gave {itemName} to {character.characterName} in slot {val7.itemSlotID}");
return true;
}
logger.LogWarning((object)$"[ClassMod] Failed to add {itemName} to {character.characterName} (attempt {l + 1})");
}
else
{
if (character.player.AddItem(prefab.itemID, (ItemInstanceData)null, ref val8))
{
logger.LogInfo((object)$"[ClassMod] Successfully gave {itemName} to {character.characterName} in slot {val8.itemSlotID} (retry method, attempt {l + 1})");
return true;
}
logger.LogWarning((object)$"[ClassMod] No empty slots available for {itemName} for {character.characterName} (attempt {l + 1})");
}
if (l < num - 1)
{
Thread.Sleep(100);
}
}
logger.LogError((object)$"[ClassMod] Failed to add {itemName} to {character.characterName} after {num} attempts");
return false;
}
}
private static void GiveRogueItems(Character character)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
Item val2 = null;
Item[] array = Resources.FindObjectsOfTypeAll<Item>();
foreach (Item val3 in array)
{
if (((Object)val3).name == "RopeSpool")
{
val2 = val3;
val.LogInfo((object)$"[ClassMod] Found RopeSpool with ID: {val3.itemID}");
break;
}
}
if ((Object)(object)val2 == (Object)null)
{
val.LogError((object)"[ClassMod] Could not find RopeSpool prefab!");
}
else if ((Object)(object)character.player != (Object)null)
{
if (character.player.HasEmptySlot(val2.itemID))
{
ItemSlot val4 = default(ItemSlot);
if (character.player.AddItem(val2.itemID, (ItemInstanceData)null, ref val4))
{
val.LogInfo((object)$"[ClassMod] Successfully gave RopeSpool to {character.characterName} in slot {val4.itemSlotID}");
}
else
{
val.LogError((object)("[ClassMod] Failed to add RopeSpool to " + character.characterName));
}
}
else
{
val.LogWarning((object)("[ClassMod] No empty slots available for RopeSpool for " + character.characterName));
}
}
else
{
val.LogError((object)("[ClassMod] Character " + character.characterName + " has no player component!"));
}
}
}
[HarmonyPatch(typeof(RunManager), "StartRun")]
public class RunManager_StartRun_Curse_Patch
{
[CompilerGenerated]
private sealed class <AddEffectsDelayed>d__1 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
private ManualLogSource <logger>5__1;
private PersistentPlayerData <playerData>5__2;
private int <hatIndex>5__3;
private CustomizationOption[] <hats>5__4;
private string <hatName>5__5;
private Item <ropePrefab>5__6;
private Item[] <>s__7;
private int <>s__8;
private Item <item>5__9;
private ItemSlot <slot>5__10;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <AddEffectsDelayed>d__1(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<playerData>5__2 = null;
<hats>5__4 = null;
<hatName>5__5 = null;
<ropePrefab>5__6 = null;
<>s__7 = null;
<item>5__9 = null;
<slot>5__10 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(5f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
if ((Object)(object)Character.localCharacter != (Object)null && (Object)(object)Character.localCharacter.refs?.customization != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
<playerData>5__2 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)Character.localCharacter).photonView.Owner) : null);
if (<playerData>5__2 != null)
{
<hatIndex>5__3 = <playerData>5__2.customizationData.currentHat;
<hats>5__4 = Singleton<Customization>.Instance?.hats;
if (<hats>5__4 != null && <hatIndex>5__3 >= 0 && <hatIndex>5__3 < <hats>5__4.Length)
{
<hatName>5__5 = ((Object)<hats>5__4[<hatIndex>5__3]).name;
if (<hatName>5__5 == "Hat_NinjaHeadband")
{
ClassManager.ActivateRogueClass();
<logger>5__1.LogInfo((object)"[ClassMod] Rogue class activated!");
<ropePrefab>5__6 = null;
<>s__7 = Resources.FindObjectsOfTypeAll<Item>();
for (<>s__8 = 0; <>s__8 < <>s__7.Length; <>s__8++)
{
<item>5__9 = <>s__7[<>s__8];
if (((Object)<item>5__9).name == "RopeSpool")
{
<ropePrefab>5__6 = <item>5__9;
<logger>5__1.LogInfo((object)$"[ClassMod] Found RopeSpool with ID: {<item>5__9.itemID}");
break;
}
<item>5__9 = null;
}
<>s__7 = null;
if ((Object)(object)<ropePrefab>5__6 != (Object)null && (Object)(object)Character.localCharacter.player != (Object)null)
{
if (Character.localCharacter.player.HasEmptySlot(<ropePrefab>5__6.itemID))
{
if (Character.localCharacter.player.AddItem(<ropePrefab>5__6.itemID, (ItemInstanceData)null, ref <slot>5__10))
{
<logger>5__1.LogInfo((object)"[ClassMod] Rogue kezdő item: RopeSpool hozzáadva!");
}
else
{
<logger>5__1.LogWarning((object)"[ClassMod] Nem sikerült RopeSpool-t adni a Rogue-nak!");
}
<slot>5__10 = null;
}
else
{
<logger>5__1.LogWarning((object)"[ClassMod] Nincs üres slot a RopeSpool számára!");
}
}
else
{
if ((Object)(object)<ropePrefab>5__6 == (Object)null)
{
<logger>5__1.LogError((object)"[ClassMod] RopeSpool prefab nem található!");
}
if ((Object)(object)Character.localCharacter.player == (Object)null)
{
<logger>5__1.LogError((object)"[ClassMod] Character.player komponens nem található!");
}
}
<ropePrefab>5__6 = null;
}
else if (<hatName>5__5 == "Hat_Propeller")
{
ClassManager.ActivateGreatEpeeClass();
<logger>5__1.LogInfo((object)"[ClassMod] Great Épée class activated!");
}
else if (<hatName>5__5 == "Hat_Medic" || <hatName>5__5 == "MedicHelmet")
{
ClassManager.ActivateMedicClass();
<logger>5__1.LogInfo((object)"[ClassMod] Medic class activated!");
if ((Object)(object)Character.localCharacter.refs?.afflictions != (Object)null)
{
Character.localCharacter.refs.afflictions.AddStatus((STATUSTYPE)5, 0.12f, false);
<logger>5__1.LogInfo((object)"[ClassMod] Medic curse effect (12%) added!");
}
}
<hatName>5__5 = null;
}
<hats>5__4 = null;
}
<playerData>5__2 = 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();
}
}
private static void Postfix()
{
((MonoBehaviour)RunManager.Instance).StartCoroutine(AddEffectsDelayed());
}
[IteratorStateMachine(typeof(<AddEffectsDelayed>d__1))]
private static IEnumerator AddEffectsDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <AddEffectsDelayed>d__1(0);
}
}
[HarmonyPatch(typeof(Affliction_ClearAllStatus), "OnApplied")]
public class Affliction_ClearAllStatus_OnApplied_Patch
{
private static void Prefix(Affliction_ClearAllStatus __instance)
{
if (!((Object)(object)((Affliction)__instance).character != (Object)null))
{
return;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val == null)
{
return;
}
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Medic" || name == "MedicHelmet")
{
__instance.excludeCurse = true;
ManualLogSource val2 = Logger.CreateLogSource("PeakClassMod");
val2.LogInfo((object)("[ClassMod] Prevented Affliction_ClearAllStatus from removing curse effect for Medic class character: " + ((Affliction)__instance).character.characterName));
}
}
}
}
[HarmonyPatch(typeof(Affliction_Chaos), "OnApplied")]
public class Affliction_Chaos_OnApplied_Patch
{
private static void Prefix(Affliction_Chaos __instance)
{
if (!((Object)(object)((Affliction)__instance).character != (Object)null))
{
return;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val == null)
{
return;
}
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Medic" || name == "MedicHelmet")
{
ManualLogSource val2 = Logger.CreateLogSource("PeakClassMod");
val2.LogInfo((object)("[ClassMod] Affliction_Chaos detected for Medic class character: " + ((Affliction)__instance).character.characterName + ", will prevent curse removal"));
}
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "ClearAllStatus")]
public class CharacterAfflictions_ClearAllStatus_Patch
{
private static void Prefix(CharacterAfflictions __instance, bool excludeCurse, ref bool __state)
{
__state = excludeCurse;
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
val.LogInfo((object)$"[ClassMod] ClearAllStatus called with excludeCurse: {excludeCurse}");
if (!((Object)(object)__instance.character != (Object)null))
{
return;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val2 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val2 == null)
{
return;
}
int currentHat = val2.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Medic" || name == "MedicHelmet")
{
excludeCurse = true;
val.LogInfo((object)("[ClassMod] ClearAllStatus called for Medic class character: " + __instance.character.characterName + ", forcing excludeCurse = true"));
}
}
}
}
[HarmonyPatch(typeof(Item), "StartUsePrimary")]
public class Item_StartUsePrimary_Patch
{
private static bool Prefix(Item __instance)
{
if ((Object)(object)__instance.holderCharacter != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.holderCharacter).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab" && (Object)(object)((Component)__instance).GetComponent<Action_RestoreHunger>() != (Object)null)
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Item), "StartUseSecondary")]
public class Item_StartUseSecondary_Patch
{
private static bool Prefix(Item __instance)
{
if ((Object)(object)__instance.holderCharacter != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.holderCharacter).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab" && (Object)(object)((Component)__instance).GetComponent<Action_RestoreHunger>() != (Object)null)
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Character), "AddExtraStamina")]
public class Character_AddExtraStamina_Patch
{
private static bool Prefix(Character __instance, float add)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Affliction_InfiniteStamina), "OnApplied")]
public class Affliction_InfiniteStamina_OnApplied_Patch
{
private static bool Prefix(Affliction_InfiniteStamina __instance)
{
if ((Object)(object)((Affliction)__instance).character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Affliction_InfiniteStamina), "UpdateEffect")]
public class Affliction_InfiniteStamina_UpdateEffect_Patch
{
private static bool Prefix(Affliction_InfiniteStamina __instance)
{
if ((Object)(object)((Affliction)__instance).character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Affliction_AddBonusStamina), "OnApplied")]
public class Affliction_AddBonusStamina_OnApplied_Patch
{
private static bool Prefix(Affliction_AddBonusStamina __instance)
{
if ((Object)(object)((Affliction)__instance).character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Action_GiveExtraStamina), "RunAction")]
public class Action_GiveExtraStamina_RunAction_Patch
{
private static bool Prefix(Action_GiveExtraStamina __instance)
{
object? obj = typeof(ItemActionBase).GetField("item", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(__instance);
Item val = (Item)((obj is Item) ? obj : null);
Character val2 = ((val != null) ? val.holderCharacter : null);
if ((Object)(object)val2 != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val3 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)val2).photonView.Owner) : null);
if (val3 != null)
{
int currentHat = val3.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Affliction_FasterBoi), "OnApplied")]
public class Affliction_FasterBoi_OnApplied_Patch
{
private static bool Prefix(Affliction_FasterBoi __instance)
{
if ((Object)(object)((Affliction)__instance).character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Action_ApplyInfiniteStamina), "RunAction")]
public class Action_ApplyInfiniteStamina_RunAction_Patch
{
private static bool Prefix(Action_ApplyInfiniteStamina __instance)
{
object? obj = typeof(ItemActionBase).GetField("item", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(__instance);
Item val = (Item)((obj is Item) ? obj : null);
Character val2 = ((val != null) ? val.holderCharacter : null);
if ((Object)(object)val2 != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val3 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)val2).photonView.Owner) : null);
if (val3 != null)
{
int currentHat = val3.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Action_ApplyMassAffliction), "TryAddAfflictionToLocalCharacter")]
public class Action_ApplyMassAffliction_TryAddAfflictionToLocalCharacter_Patch
{
private static bool Prefix(Action_ApplyMassAffliction __instance)
{
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a8: Invalid comparison between Unknown and I4
if ((Object)(object)Character.localCharacter != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)Character.localCharacter).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Crab" && ((Action_ApplyAffliction)__instance).affliction != null && (int)((Action_ApplyAffliction)__instance).affliction.GetAfflictionType() == 1)
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Affliction_PoisonOverTime), "OnApplied")]
public class Affliction_PoisonOverTime_OnApplied_Patch
{
private static bool Prefix(Affliction_PoisonOverTime __instance)
{
if ((Object)(object)((Affliction)__instance).character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)((Affliction)__instance).character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Mushroom")
{
return false;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "AddStatus")]
public class CharacterAfflictions_AddStatus_Poison_Patch
{
private static bool Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, ref float amount, bool fromRPC)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
if ((int)statusType == 3 && (Object)(object)__instance.character != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)__instance.character).photonView.Owner) : null);
if (val != null)
{
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array != null && currentHat >= 0 && currentHat < array.Length)
{
string name = ((Object)array[currentHat]).name;
if (name == "Hat_Mushroom")
{
amount = 0f;
}
}
}
}
return true;
}
}
[HarmonyPatch(typeof(Character), "UseStamina")]
public class Character_UseStamina_Mushroomancer_Patch
{
private static void Postfix(Character __instance, float usage, bool useBonusStamina, bool __result)
{
if (__instance.data.currentStamina <= 0f || (!__result && __instance.data.isClimbingAnything))
{
ClassManager.TryActivateStaminaZeroMechanic(__instance);
}
}
}
[HarmonyPatch(typeof(Character), "OutOfStamina")]
public class Character_OutOfStamina_Mushroomancer_Patch
{
private static void Postfix(Character __instance, bool __result)
{
if (__result && __instance.data.isClimbingAnything)
{
ClassManager.TryActivateStaminaZeroMechanic(__instance);
}
}
}
public static class ClassManager
{
[CompilerGenerated]
private sealed class <GreatEpeePermanentEffects>d__20 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character character;
private ManualLogSource <logger>5__1;
private bool <hasFasterBoi>5__2;
private List<Affliction>.Enumerator <>s__3;
private Affliction <aff>5__4;
private Affliction_FasterBoi <fasterBoi>5__5;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GreatEpeePermanentEffects>d__20(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<>s__3 = default(List<Affliction>.Enumerator);
<aff>5__4 = null;
<fasterBoi>5__5 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0142: Expected O, but got Unknown
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_00ec: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
break;
case 1:
<>1__state = -1;
break;
}
if (IsGreatEpeeActive() && (Object)(object)character != (Object)null && character.IsLocal)
{
<hasFasterBoi>5__2 = false;
<>s__3 = character.refs.afflictions.afflictionList.GetEnumerator();
try
{
while (<>s__3.MoveNext())
{
<aff>5__4 = <>s__3.Current;
if (((object)<aff>5__4).GetType().Name == "Affliction_FasterBoi")
{
<hasFasterBoi>5__2 = true;
break;
}
<aff>5__4 = null;
}
}
finally
{
((IDisposable)<>s__3).Dispose();
}
<>s__3 = default(List<Affliction>.Enumerator);
if (!<hasFasterBoi>5__2)
{
<fasterBoi>5__5 = new Affliction_FasterBoi();
((Affliction)<fasterBoi>5__5).totalTime = 99999f;
character.refs.afflictions.AddAffliction((Affliction)(object)<fasterBoi>5__5, false);
<logger>5__1.LogInfo((object)"[ClassMod] Great Épée: Permanent energy drink effect applied!");
<fasterBoi>5__5 = null;
}
<>2__current = (object)new WaitForSeconds(1f);
<>1__state = 1;
return true;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <GreatEpeeStaminaRoutine>d__21 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character character;
private ManualLogSource <logger>5__1;
private float <waitTime>5__2;
private float <duration>5__3;
private float <elapsed>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <GreatEpeeStaminaRoutine>d__21(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_0094: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
break;
case 1:
<>1__state = -1;
<duration>5__3 = 3f;
<elapsed>5__4 = 0f;
character.refs.afflictions.AddStatus((STATUSTYPE)6, 1f, false);
<logger>5__1.LogInfo((object)"[ClassMod] Great Épée: 100% Sleep (Drowsy) effect applied!");
goto IL_0115;
case 2:
<>1__state = -1;
goto IL_0115;
case 3:
{
<>1__state = -1;
break;
}
IL_0115:
if (<elapsed>5__4 < <duration>5__3)
{
<elapsed>5__4 += Time.deltaTime;
<>2__current = null;
<>1__state = 2;
return true;
}
<logger>5__1.LogInfo((object)"[ClassMod] Great Épée: 3 mp Drowsy effect completed!");
<>2__current = null;
<>1__state = 3;
return true;
}
if (IsGreatEpeeActive() && (Object)(object)character != (Object)null && character.IsLocal)
{
<waitTime>5__2 = Random.Range(50f, 190f);
<logger>5__1.LogInfo((object)$"[ClassMod] Great Épée: Következő stamina feltöltés {<waitTime>5__2} mp múlva");
<>2__current = (object)new WaitForSeconds(<waitTime>5__2);
<>1__state = 1;
return true;
}
return false;
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
[CompilerGenerated]
private sealed class <SpawnRandomMushroomDelayed>d__3 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character character;
private ManualLogSource <logger>5__1;
private string[] <mushroomTypes>5__2;
private string <selectedMushroom>5__3;
private Item <mushroomPrefab>5__4;
private Item[] <>s__5;
private int <>s__6;
private Item <item>5__7;
private Vector3 <spawnPosition>5__8;
private Item <spawnedItem>5__9;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <SpawnRandomMushroomDelayed>d__3(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<mushroomTypes>5__2 = null;
<selectedMushroom>5__3 = null;
<mushroomPrefab>5__4 = null;
<>s__5 = null;
<item>5__7 = null;
<spawnedItem>5__9 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_01bc: 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_01d6: 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_01e0: Unknown result type (might be due to invalid IL or missing references)
//IL_01ea: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
//IL_03fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0491: Unknown result type (might be due to invalid IL or missing references)
//IL_0496: Unknown result type (might be due to invalid IL or missing references)
//IL_043e: Unknown result type (might be due to invalid IL or missing references)
//IL_0469: Unknown result type (might be due to invalid IL or missing references)
//IL_0257: Unknown result type (might be due to invalid IL or missing references)
//IL_0267: 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)
//IL_0276: Unknown result type (might be due to invalid IL or missing references)
//IL_027b: Unknown result type (might be due to invalid IL or missing references)
//IL_0285: Unknown result type (might be due to invalid IL or missing references)
//IL_028a: Unknown result type (might be due to invalid IL or missing references)
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
//IL_04e0: Unknown result type (might be due to invalid IL or missing references)
//IL_04ed: Unknown result type (might be due to invalid IL or missing references)
//IL_0510: Unknown result type (might be due to invalid IL or missing references)
//IL_032a: Unknown result type (might be due to invalid IL or missing references)
//IL_032f: Unknown result type (might be due to invalid IL or missing references)
//IL_0339: Unknown result type (might be due to invalid IL or missing references)
//IL_033e: Unknown result type (might be due to invalid IL or missing references)
//IL_0343: Unknown result type (might be due to invalid IL or missing references)
//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
//IL_02f2: Unknown result type (might be due to invalid IL or missing references)
//IL_02fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0301: Unknown result type (might be due to invalid IL or missing references)
//IL_0306: Unknown result type (might be due to invalid IL or missing references)
//IL_0310: Unknown result type (might be due to invalid IL or missing references)
//IL_0315: Unknown result type (might be due to invalid IL or missing references)
//IL_031a: Unknown result type (might be due to invalid IL or missing references)
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
<mushroomTypes>5__2 = new string[3] { "ShelfShroom", "HealingPuffShroom", "BounceShroom" };
<selectedMushroom>5__3 = <mushroomTypes>5__2[Random.Range(0, <mushroomTypes>5__2.Length)];
<mushroomPrefab>5__4 = null;
<>s__5 = Resources.FindObjectsOfTypeAll<Item>();
for (<>s__6 = 0; <>s__6 < <>s__5.Length; <>s__6++)
{
<item>5__7 = <>s__5[<>s__6];
if (((Object)<item>5__7).name == <selectedMushroom>5__3)
{
<mushroomPrefab>5__4 = <item>5__7;
<logger>5__1.LogInfo((object)$"[ClassMod] Found {<selectedMushroom>5__3} with ID: {<item>5__7.itemID}");
break;
}
<item>5__7 = null;
}
<>s__5 = null;
if ((Object)(object)<mushroomPrefab>5__4 == (Object)null)
{
<logger>5__1.LogError((object)("[ClassMod] Could not find " + <selectedMushroom>5__3 + " prefab!"));
return false;
}
if ((Object)(object)character != (Object)null && (Object)(object)((Component)character).transform != (Object)null)
{
if (character.data.isClimbing)
{
<spawnPosition>5__8 = character.data.climbPos + character.data.climbNormal * 0.4f + Vector3.down * 0.5f;
}
else if (character.data.isRopeClimbing && (Object)(object)character.data.heldRope != (Object)null)
{
<spawnPosition>5__8 = character.data.heldRope.climbingAPI.GetPosition(character.data.ropePercent) + character.data.ropeClimbWorldNormal * 0.5f + Vector3.down * 0.5f;
}
else if (character.data.isVineClimbing && (Object)(object)character.data.heldVine != (Object)null)
{
<spawnPosition>5__8 = character.data.heldVine.GetPosition(character.data.vinePercent) + Vector3.down * 1f + Vector3.down * 0.5f;
}
else
{
<spawnPosition>5__8 = character.Center + Vector3.down * 0.5f;
}
<logger>5__1.LogInfo((object)("[ClassMod] Spawn position calculation for " + character.characterName + ":"));
<logger>5__1.LogInfo((object)$"[ClassMod] - isClimbing: {character.data.isClimbing}");
<logger>5__1.LogInfo((object)$"[ClassMod] - isRopeClimbing: {character.data.isRopeClimbing}");
<logger>5__1.LogInfo((object)$"[ClassMod] - isVineClimbing: {character.data.isVineClimbing}");
<logger>5__1.LogInfo((object)$"[ClassMod] - Final spawn position: {<spawnPosition>5__8}");
if (character.data.isClimbing)
{
<logger>5__1.LogInfo((object)$"[ClassMod] - ClimbPos: {character.data.climbPos}");
<logger>5__1.LogInfo((object)$"[ClassMod] - ClimbNormal: {character.data.climbNormal}");
}
<spawnedItem>5__9 = PhotonNetwork.InstantiateItemRoom(((Object)((Component)<mushroomPrefab>5__4).gameObject).name, <spawnPosition>5__8, Quaternion.identity).GetComponent<Item>();
if ((Object)(object)<spawnedItem>5__9 != (Object)null)
{
((Component)<spawnedItem>5__9).GetComponent<PhotonView>().RPC("SetKinematicRPC", (RpcTarget)3, new object[3]
{
true,
<spawnPosition>5__8,
Quaternion.identity
});
<logger>5__1.LogInfo((object)$"[ClassMod] Successfully spawned {<selectedMushroom>5__3} at position {<spawnPosition>5__8} for {character.characterName} due to stamina reaching 0");
}
else
{
<logger>5__1.LogError((object)("[ClassMod] Failed to spawn " + <selectedMushroom>5__3 + " for " + character.characterName));
}
<spawnedItem>5__9 = null;
}
else
{
ManualLogSource obj = <logger>5__1;
Character obj2 = character;
obj.LogError((object)("[ClassMod] Character " + (((obj2 != null) ? obj2.characterName : null) ?? "NULL") + " has no transform component!"));
}
<logger>5__1.LogInfo((object)"[ClassMod] Mushroom spawn completed for Mushroomancer");
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static Dictionary<Player, float> lastStaminaZeroTime = new Dictionary<Player, float>();
private const float COOLDOWN_DURATION = 5f;
private static Dictionary<Character, Coroutine> greatEpeeStaminaCoroutines = new Dictionary<Character, Coroutine>();
public static bool TryActivateStaminaZeroMechanic(Character character)
{
if (!((Object)(object)character == (Object)null))
{
PhotonView photonView = ((MonoBehaviourPun)character).photonView;
if (((photonView != null) ? photonView.Owner : null) != null)
{
Player owner = ((MonoBehaviourPun)character).photonView.Owner;
float time = Time.time;
if (lastStaminaZeroTime.ContainsKey(owner) && time - lastStaminaZeroTime[owner] < 5f)
{
return false;
}
if (!IsMushroomancerClass(character))
{
return false;
}
if (character.data.currentStamina > 0f)
{
return false;
}
lastStaminaZeroTime[owner] = time;
if (character.IsLocal)
{
character.refs.afflictions.AddStatus((STATUSTYPE)5, 0.02f, false);
}
if (PhotonNetwork.IsMasterClient)
{
((MonoBehaviour)character).StartCoroutine(SpawnRandomMushroomDelayed(character));
}
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
val.LogInfo((object)("[ClassMod] Stamina zero mechanic activated for player: " + owner.NickName));
return true;
}
}
return false;
}
[IteratorStateMachine(typeof(<SpawnRandomMushroomDelayed>d__3))]
public static IEnumerator SpawnRandomMushroomDelayed(Character character)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <SpawnRandomMushroomDelayed>d__3(0)
{
character = character
};
}
public static void ActivateScoutClass()
{
PeakClassModPlugin.scoutActive = true;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.currentClass = "Scout";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
}
public static void ActivateMedicClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = true;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.currentClass = "Medic";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
}
public static void ActivateTechPriestClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = true;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.currentClass = "Tech-Priest";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
}
public static void ActivateMushroomancerClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = true;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.currentClass = "Mushroomancer";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
}
public static void ActivateGreatEpeeClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = true;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.currentClass = "GreatEpee";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
if ((Object)(object)Character.localCharacter != (Object)null)
{
((MonoBehaviour)Character.localCharacter).StartCoroutine(GreatEpeePermanentEffects(Character.localCharacter));
if (greatEpeeStaminaCoroutines.ContainsKey(Character.localCharacter))
{
((MonoBehaviour)Character.localCharacter).StopCoroutine(greatEpeeStaminaCoroutines[Character.localCharacter]);
greatEpeeStaminaCoroutines.Remove(Character.localCharacter);
}
Coroutine value = ((MonoBehaviour)Character.localCharacter).StartCoroutine(GreatEpeeStaminaRoutine(Character.localCharacter));
greatEpeeStaminaCoroutines[Character.localCharacter] = value;
}
}
public static void ActivateRogueClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = true;
PeakClassModPlugin.currentClass = "Rogue";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 2;
}
}
public static void DeactivateAllClasses()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.currentClass = "None";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
if ((Object)(object)Character.localCharacter != (Object)null && greatEpeeStaminaCoroutines.ContainsKey(Character.localCharacter))
{
((MonoBehaviour)Character.localCharacter).StopCoroutine(greatEpeeStaminaCoroutines[Character.localCharacter]);
greatEpeeStaminaCoroutines.Remove(Character.localCharacter);
}
}
public static bool IsScoutActive()
{
return PeakClassModPlugin.scoutActive;
}
public static bool IsMedicActive()
{
return PeakClassModPlugin.medicActive;
}
public static bool IsTechPriestActive()
{
return PeakClassModPlugin.techPriestActive;
}
public static bool IsMushroomancerActive()
{
return PeakClassModPlugin.mushroomancerActive;
}
public static bool IsGreatEpeeActive()
{
return PeakClassModPlugin.greatEpeeActive;
}
public static bool IsRogueActive()
{
return PeakClassModPlugin.rogueActive;
}
public static string GetCurrentClass()
{
return PeakClassModPlugin.currentClass;
}
private static bool IsMushroomancerClass(Character character)
{
if ((Object)(object)character == (Object)null || (Object)(object)((MonoBehaviourPun)character).photonView == (Object)null || ((MonoBehaviourPun)character).photonView.Owner == null)
{
return false;
}
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
PersistentPlayerData val = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)character).photonView.Owner) : null);
if (val == null)
{
return false;
}
int currentHat = val.customizationData.currentHat;
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
if (array == null || currentHat < 0 || currentHat >= array.Length)
{
return false;
}
string name = ((Object)array[currentHat]).name;
return name == "Hat_Mushroom";
}
[IteratorStateMachine(typeof(<GreatEpeePermanentEffects>d__20))]
private static IEnumerator GreatEpeePermanentEffects(Character character)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GreatEpeePermanentEffects>d__20(0)
{
character = character
};
}
[IteratorStateMachine(typeof(<GreatEpeeStaminaRoutine>d__21))]
private static IEnumerator GreatEpeeStaminaRoutine(Character character)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <GreatEpeeStaminaRoutine>d__21(0)
{
character = character
};
}
public static void ActivateEddieClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.eddieActive = true;
PeakClassModPlugin.currentClass = "Eddie";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
}
public static bool IsEddieActive()
{
return PeakClassModPlugin.eddieActive;
}
public static void ActivateBillClass()
{
PeakClassModPlugin.scoutActive = false;
PeakClassModPlugin.medicActive = false;
PeakClassModPlugin.techPriestActive = false;
PeakClassModPlugin.mushroomancerActive = false;
PeakClassModPlugin.greatEpeeActive = false;
PeakClassModPlugin.rogueActive = false;
PeakClassModPlugin.eddieActive = false;
PeakClassModPlugin.billActive = true;
PeakClassModPlugin.currentClass = "Bill";
if ((Object)(object)Character.localCharacter != (Object)null)
{
Character.localCharacter.data.jumpsRemaining = 1;
}
}
public static bool IsBillActive()
{
return PeakClassModPlugin.billActive;
}
}
[HarmonyPatch(typeof(CharacterMovement), "EvaluateGroundChecks")]
public class CharacterMovement_EvaluateGroundChecks_Rogue_Patch
{
private static void Postfix(CharacterMovement __instance)
{
Character component = ((Component)__instance).GetComponent<Character>();
if (!((Object)(object)component == (Object)null) && component.IsLocal)
{
if (ClassManager.IsRogueActive())
{
component.data.jumpsRemaining = 2;
}
else
{
component.data.jumpsRemaining = 1;
}
}
}
}
[HarmonyPatch(typeof(CharacterMovement), "TryToJump")]
public class CharacterMovement_TryToJump_Rogue_Patch
{
private static bool Prefix(CharacterMovement __instance)
{
Character component = ((Component)__instance).GetComponent<Character>();
if ((Object)(object)component == (Object)null || !component.IsLocal)
{
return true;
}
if (ClassManager.IsRogueActive() && component.data.jumpsRemaining > 0 && component.data.currentStamina > 0.005f && !component.data.fullyPassedOut && !component.data.isClimbing && !component.data.isRopeClimbing && !component.data.isVineClimbing && (Object)(object)component.data.currentClimbHandle == (Object)null)
{
CharacterData data = component.data;
data.jumpsRemaining--;
component.data.isCrouching = false;
component.data.chargingJump = true;
component.refs.view.RPC("JumpRpc", (RpcTarget)0, new object[1] { false });
return false;
}
if (component.data.jumpsRemaining > 0 && component.data.isGrounded && !component.data.fullyPassedOut && !component.data.isClimbing && !component.data.isRopeClimbing && !component.data.isVineClimbing && (Object)(object)component.data.currentClimbHandle == (Object)null)
{
return true;
}
return false;
}
}
[HarmonyPatch(typeof(Character), "UseStamina")]
public class Character_UseStamina_RogueJumpCost_Patch
{
private static void Prefix(Character __instance, ref float usage, bool useBonusStamina)
{
if (__instance.IsLocal && ClassManager.IsRogueActive())
{
usage *= 2.5f;
}
}
}
[HarmonyPatch(typeof(CharacterCustomization), "SetCharacterHat")]
public class CharacterCustomization_SetCharacterHat_Eddie_Patch
{
private static void Postfix(int index)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
string text = "Unknown";
if (array != null && index >= 0 && index < array.Length)
{
CustomizationOption obj = array[index];
text = ((obj != null) ? ((Object)obj).name : null) ?? "NULL";
}
if (text == "Hat_Beret")
{
ClassManager.ActivateEddieClass();
val.LogInfo((object)"[ClassMod] Eddie class activated!");
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "AddStatus")]
public class CharacterAfflictions_AddStatus_Eddie_Patch
{
private static void Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, ref float amount, bool fromRPC)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Invalid comparison between Unknown and I4
Character character = __instance.character;
if (!((Object)(object)character == (Object)null) && character.IsLocal && ClassManager.IsEddieActive() && (int)statusType == 1)
{
amount *= 1.5f;
}
}
}
[HarmonyPatch(typeof(BarAffliction), "ChangeAffliction")]
public class BarAffliction_ChangeAffliction_Eddie_Patch
{
private static void Postfix(BarAffliction __instance, StaminaBar bar)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Invalid comparison between Unknown and I4
if (ClassManager.IsEddieActive() && (int)__instance.afflictionType == 7)
{
__instance.size *= 0.5f;
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "get_statusSum")]
public class CharacterAfflictions_StatusSum_Eddie_Patch
{
private static void Postfix(CharacterAfflictions __instance, ref float __result)
{
if (ClassManager.IsEddieActive())
{
float num = 0f;
if (__instance.currentStatuses != null && __instance.currentStatuses.Length > 7)
{
num = __instance.currentStatuses[7];
}
__result = __result - num + num * 0.5f;
}
}
}
[HarmonyPatch(typeof(CharacterCustomization), "SetCharacterHat")]
public class CharacterCustomization_SetCharacterHat_Bill_Patch
{
private static void Postfix(int index)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
CustomizationOption[] array = Singleton<Customization>.Instance?.hats;
string text = "Unknown";
if (array != null && index >= 0 && index < array.Length)
{
CustomizationOption obj = array[index];
text = ((obj != null) ? ((Object)obj).name : null) ?? "NULL";
}
if (text == "Hat_Bandana")
{
ClassManager.ActivateBillClass();
val.LogInfo((object)"[ClassMod] Bill class activated!");
}
}
}
[HarmonyPatch(typeof(RunManager), "StartRun")]
public class RunManager_StartRun_Bill_Patch
{
[CompilerGenerated]
private sealed class <AddBillCurseDelayed>d__1 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
private PersistentPlayerData <playerData>5__1;
private int <hatIndex>5__2;
private CustomizationOption[] <hats>5__3;
private string <hatName>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <AddBillCurseDelayed>d__1(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<playerData>5__1 = null;
<hats>5__3 = null;
<hatName>5__4 = null;
<>1__state = -2;
}
private bool MoveNext()
{
//IL_0026: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<>2__current = (object)new WaitForSeconds(5f);
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)Character.localCharacter != (Object)null && (Object)(object)Character.localCharacter.refs?.afflictions != (Object)null)
{
PersistentPlayerDataService service = GameHandler.GetService<PersistentPlayerDataService>();
<playerData>5__1 = ((service != null) ? service.GetPlayerData(((MonoBehaviourPun)Character.localCharacter).photonView.Owner) : null);
if (<playerData>5__1 != null)
{
<hatIndex>5__2 = <playerData>5__1.customizationData.currentHat;
<hats>5__3 = Singleton<Customization>.Instance?.hats;
if (<hats>5__3 != null && <hatIndex>5__2 >= 0 && <hatIndex>5__2 < <hats>5__3.Length)
{
<hatName>5__4 = ((Object)<hats>5__3[<hatIndex>5__2]).name;
if (<hatName>5__4 == "Hat_Bandana")
{
Character.localCharacter.refs.afflictions.AddStatus((STATUSTYPE)5, 0.35f, false);
}
<hatName>5__4 = null;
}
<hats>5__3 = null;
}
<playerData>5__1 = 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();
}
}
private static void Postfix()
{
((MonoBehaviour)RunManager.Instance).StartCoroutine(AddBillCurseDelayed());
}
[IteratorStateMachine(typeof(<AddBillCurseDelayed>d__1))]
private static IEnumerator AddBillCurseDelayed()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <AddBillCurseDelayed>d__1(0);
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "AddStatus")]
public class CharacterAfflictions_AddStatus_Bill_Patch
{
private static void Prefix(CharacterAfflictions __instance, STATUSTYPE statusType, ref float amount, bool fromRPC)
{
//IL_002d: Unknown result type (might be due to invalid IL or missing references)
//IL_002f: Invalid comparison between Unknown and I4
//IL_0043: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Invalid comparison between Unknown and I4
Character character = __instance.character;
if (!((Object)(object)character == (Object)null) && character.IsLocal && ClassManager.IsBillActive())
{
if ((int)statusType == 7)
{
amount *= 2f;
}
else if ((int)statusType == 1)
{
amount *= 2f;
}
}
}
}
[HarmonyPatch(typeof(BarAffliction), "ChangeAffliction")]
public class BarAffliction_ChangeAffliction_Bill_Patch
{
private static void Postfix(BarAffliction __instance, StaminaBar bar)
{
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Invalid comparison between Unknown and I4
if (ClassManager.IsBillActive() && (int)__instance.afflictionType == 7)
{
__instance.size *= 2f;
}
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "get_statusSum")]
public class CharacterAfflictions_StatusSum_Bill_Patch
{
private static void Postfix(CharacterAfflictions __instance, ref float __result)
{
if (ClassManager.IsBillActive())
{
float num = 0f;
if (__instance.currentStatuses != null && __instance.currentStatuses.Length > 7)
{
num = __instance.currentStatuses[7];
}
__result = __result - num + num * 2f;
}
}
}
[HarmonyPatch(typeof(CharacterMovement), "Update")]
public class CharacterMovement_Update_MedicHeal_Patch
{
[CompilerGenerated]
private sealed class <MedicHealAllPlayers>d__2 : IEnumerator<object>, IDisposable, IEnumerator
{
private int <>1__state;
private object <>2__current;
public Character medicCharacter;
private ManualLogSource <logger>5__1;
private int <remainingHeals>5__2;
private float <currentInjury>5__3;
private float <healAmount>5__4;
object IEnumerator<object>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <MedicHealAllPlayers>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
<logger>5__1 = null;
<>1__state = -2;
}
private bool MoveNext()
{
switch (<>1__state)
{
default:
return false;
case 0:
<>1__state = -1;
<logger>5__1 = Logger.CreateLogSource("PeakClassMod");
if (!medicHealUses.ContainsKey(((MonoBehaviourPun)medicCharacter).photonView.Owner))
{
medicHealUses[((MonoBehaviourPun)medicCharacter).photonView.Owner] = 10;
}
if (medicHealUses[((MonoBehaviourPun)medicCharacter).photonView.Owner] <= 0)
{
<logger>5__1.LogInfo((object)"[ClassMod] Medic class has no more heals remaining!");
return false;
}
medicHealUses[((MonoBehaviourPun)medicCharacter).photonView.Owner]--;
<remainingHeals>5__2 = medicHealUses[((MonoBehaviourPun)medicCharacter).photonView.Owner];
<logger>5__1.LogInfo((object)$"[ClassMod] Medic class using heal! Remaining heals: {<remainingHeals>5__2}");
<>2__current = null;
<>1__state = 1;
return true;
case 1:
<>1__state = -1;
if ((Object)(object)medicCharacter.refs?.afflictions != (Object)null)
{
<currentInjury>5__3 = medicCharacter.refs.afflictions.GetCurrentStatus((STATUSTYPE)0);
if (<currentInjury>5__3 > 0f)
{
<healAmount>5__4 = Math.Min(0.1f, <currentInjury>5__3);
medicCharacter.refs.afflictions.SubtractStatus((STATUSTYPE)0, <healAmount>5__4, false);
<logger>5__1.LogInfo((object)$"[ClassMod] Healed {medicCharacter.characterName} for {<healAmount>5__4} Injury. New Injury: {medicCharacter.refs.afflictions.GetCurrentStatus((STATUSTYPE)0)}");
}
else
{
<logger>5__1.LogInfo((object)("[ClassMod] " + medicCharacter.characterName + " has no Injury to heal"));
}
}
else
{
ManualLogSource obj = <logger>5__1;
Character obj2 = medicCharacter;
obj.LogWarning((object)("[ClassMod] Medic character " + (((obj2 != null) ? obj2.characterName : null) ?? "NULL") + " has no afflictions component"));
}
((MonoBehaviourPun)medicCharacter).photonView.RPC("ShowMedicHealEffectRPC", (RpcTarget)0, new object[1] { <remainingHeals>5__2 });
return false;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
}
private static Dictionary<Player, int> medicHealUses = new Dictionary<Player, int>();
private static void Postfix(CharacterMovement __instance)
{
Character component = ((Component)__instance).GetComponent<Character>();
if (!((Object)(object)component == (Object)null) && component.IsLocal && ClassManager.IsMedicActive() && (Object)(object)component.input != (Object)null && Input.GetKeyDown((KeyCode)104))
{
((MonoBehaviour)component).StartCoroutine(MedicHealAllPlayers(component));
}
}
[IteratorStateMachine(typeof(<MedicHealAllPlayers>d__2))]
private static IEnumerator MedicHealAllPlayers(Character medicCharacter)
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <MedicHealAllPlayers>d__2(0)
{
medicCharacter = medicCharacter
};
}
}
[HarmonyPatch(typeof(Character), "ShowMedicHealEffectRPC")]
public class Character_ShowMedicHealEffectRPC_Patch
{
private static void Postfix(Character __instance, int remainingHeals)
{
if (__instance.IsLocal)
{
ManualLogSource val = Logger.CreateLogSource("PeakClassMod");
val.LogInfo((object)$"[ClassMod] Medic heal effect displayed! Remaining heals: {remainingHeals}");
}
}
}