using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Reflection.Emit;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using PEAKLib.Core;
using PEAKLib.Stats;
using PeakThirst;
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(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("PeakThirst")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("PeakThirst")]
[assembly: AssemblyTitle("PeakThirst")]
[assembly: AssemblyVersion("1.0.0.0")]
[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;
}
}
}
[HarmonyPatch(typeof(Item), "Awake")]
public static class Item_TargetMethod_Patch
{
private static void Postfix(Item __instance)
{
Debug.Log((object)((Object)((Component)__instance).gameObject).name);
float restoration = ThirstRestorationCalculator.CalculateThirstRestoration(((Component)__instance).gameObject);
if (restoration <= 0f)
{
return;
}
Item obj = __instance;
obj.OnConsumed = (Action)Delegate.Combine(obj.OnConsumed, (Action)delegate
{
//IL_003a: Unknown result type (might be due to invalid IL or missing references)
Character holderCharacter = __instance.holderCharacter;
CharacterAfflictions val = (((Object)(object)holderCharacter != (Object)null) ? holderCharacter.refs : null)?.afflictions;
if ((Object)(object)val != (Object)null)
{
val.SubtractStatus(ThirstAffliction.DehydrationType, restoration, false);
}
});
}
}
[HarmonyPatch(typeof(Action_RestoreHunger), "RunAction")]
public static class Action_RestoreHunger_TargetMethod_Patch
{
private static readonly Func<ItemAction, Character> GetCharacter = AccessTools.MethodDelegate<Func<ItemAction, Character>>(AccessTools.PropertyGetter(typeof(ItemAction), "character"), (object)null, true);
private static void Postfix(Action_RestoreHunger __instance)
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
Character val = GetCharacter((ItemAction)(object)__instance);
val.refs.afflictions.SubtractStatus(ThirstAffliction.DehydrationType, __instance.restorationAmount / 4f, false);
}
}
[HarmonyPatch(typeof(CharacterAfflictions), "UpdateNormalStatuses")]
public static class CharacterAfflictions_TargetMethod_Patch
{
private static void Postfix(CharacterAfflictions __instance)
{
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
if (__instance.character.data.fullyConscious)
{
CharacterAfflictions afflictions = __instance.character.refs.afflictions;
float num = 1f + afflictions.GetCurrentStatus((STATUSTYPE)8) * 20f;
float num2 = Time.deltaTime * __instance.hungerPerSecond * Ascents.hungerRateMultiplier * 2f * num;
afflictions.AddStatus(ThirstAffliction.DehydrationType, num2, false);
}
}
}
internal static class SpriteLoader
{
public static Sprite FromEmbedded(string resourceName, float pixelsPerUnit = 100f)
{
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Expected O, but got Unknown
//IL_00ad: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
Assembly executingAssembly = Assembly.GetExecutingAssembly();
using Stream stream = executingAssembly.GetManifestResourceStream(resourceName);
if (stream == null)
{
Debug.LogError((object)("[PeakThirst] Embedded resource not found: " + resourceName));
return null;
}
using MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
Texture2D val = new Texture2D(2, 2, (TextureFormat)5, false);
if (!ImageConversion.LoadImage(val, memoryStream.ToArray()))
{
Debug.LogError((object)("[PeakThirst] Failed to load image data for: " + resourceName));
return null;
}
((Object)val).name = Path.GetFileNameWithoutExtension(resourceName);
((Texture)val).filterMode = (FilterMode)1;
return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), pixelsPerUnit);
}
}
public static class ThirstAffliction
{
public const string StatusName = "Dehydration";
public static STATUSTYPE DehydrationType;
public static void CreateThirstAffliction()
{
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0016: Unknown result type (might be due to invalid IL or missing references)
//IL_0022: Unknown result type (might be due to invalid IL or missing references)
//IL_0032: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0049: Unknown result type (might be due to invalid IL or missing references)
//IL_0051: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Expected O, but got Unknown
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
Sprite icon = SpriteLoader.FromEmbedded("PeakThirst.Sprites.Droplet.png");
Status val = new Status
{
Name = "Dehydration",
Color = new Color(0.075f, 0.286f, 1f),
MaxAmount = 2f,
AllowClear = true,
ReductionCooldown = 0f,
ReductionPerSecond = 0f,
Icon = icon
};
new StatusContent(val).Register(Thirst.Definition);
DehydrationType = val.Type;
}
}
namespace System.Runtime.CompilerServices
{
[AttributeUsage(AttributeTargets.All, Inherited = false)]
public sealed class NullableAttribute : Attribute
{
public NullableAttribute(byte b)
{
}
public NullableAttribute(byte[] b)
{
}
}
[AttributeUsage(AttributeTargets.All, Inherited = false)]
public sealed class NullableContextAttribute : Attribute
{
public NullableContextAttribute(byte b)
{
}
}
}
namespace PeakThirst
{
public static class ThirstRestorationCalculator
{
public static float CalculateThirstRestoration(GameObject item)
{
string name = ((Object)item).name;
Debug.Log((object)("Calculating thirst for " + name));
float num = 0f;
if (name.Contains("Apple Berry"))
{
num += 0.1f;
}
if (name.Contains("Berrynana"))
{
num += 0.2f;
}
if (name.Contains("Bugfix"))
{
num += 0.15f;
}
if (name.Contains("Clusterberry"))
{
num += 0.35f;
}
if (name.Contains("Kingberry"))
{
num += 0.15f;
}
if (name.Contains("Marshmallow"))
{
num += 0.45f;
}
if (name.Contains("Mushroom"))
{
num += 0.075f;
}
if (name.Contains("Sports Drink"))
{
num += 1f;
}
if (name.Contains("Winterberry"))
{
num += 0.3f;
}
if (name.Contains("Honeycomb"))
{
num += 0.15f;
}
if (name.Contains("Coconut_half"))
{
num += 0.6f;
}
if (name.Contains("AloeVera"))
{
num += 1.5f;
}
if (name.Contains("Turkey"))
{
num += 0.7f;
}
if (name.Contains("Napberry"))
{
num += 1f;
}
if (name.Contains("Prickleberry"))
{
num += 0.5f;
}
if (name.Contains("Cure-All"))
{
num += 0.9f;
}
if (name.Contains("MedicinalRoot"))
{
num += 0.2f;
}
if (name.Contains("Energy Drink"))
{
num += 0.5f;
}
return num;
}
}
public static class OnsenThirst
{
public static void AddThirstToOnsens(bool includeInactive = false)
{
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
GameObject[] array = FindAllByName("heat zone", includeInactive);
GameObject[] array2 = array;
foreach (GameObject val in array2)
{
GameObject val2 = Object.Instantiate<GameObject>(val);
val2.transform.SetParent(val.transform.parent, true);
StatusEmitter val3 = val2.GetComponent<StatusEmitter>();
if ((Object)(object)val3 == (Object)null)
{
val3 = val2.AddComponent<StatusEmitter>();
}
val3.statusType = ThirstAffliction.DehydrationType;
}
}
public static GameObject[] FindAllByName(string targetName, bool includeInactive = false)
{
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
if (string.IsNullOrEmpty(targetName))
{
return Array.Empty<GameObject>();
}
FindObjectsInactive val = (FindObjectsInactive)(includeInactive ? 1 : 0);
Transform[] array = Object.FindObjectsByType<Transform>(val, (FindObjectsSortMode)0);
List<GameObject> list = new List<GameObject>(array.Length);
Transform[] array2 = array;
foreach (Transform val2 in array2)
{
if ((Object)(object)val2 != (Object)null && ((Object)val2).name == targetName)
{
list.Add(((Component)val2).gameObject);
}
}
return list.ToArray();
}
}
public class Action_MergerAction : ItemAction
{
public ItemAction action1;
public ItemAction action2;
public override void RunAction()
{
((ItemActionBase)action1).RunAction();
((ItemActionBase)action2).RunAction();
}
}
[BepInPlugin("com.khakixd.thirst", "Thirst", "0.1.0")]
public class Thirst : BaseUnityPlugin
{
private Harmony _harmony;
public static ModDefinition Definition { get; set; }
private void Awake()
{
//IL_002e: Unknown result type (might be due to invalid IL or missing references)
//IL_0038: Expected O, but got Unknown
Definition = ModDefinition.GetOrCreate(((BaseUnityPlugin)this).Info.Metadata);
((BaseUnityPlugin)this).Logger.LogInfo((object)"Thirst loaded!");
_harmony = new Harmony("com.khakixd.thirst");
ThirstAffliction.CreateThirstAffliction();
_harmony.PatchAll(Assembly.GetExecutingAssembly());
try
{
int num = Harmony.GetAllPatchedMethods().Count();
((BaseUnityPlugin)this).Logger.LogInfo((object)$"Harmony: total patched methods in process = {num}");
}
catch
{
}
SceneManager.sceneLoaded += OnSceneLoaded;
}
private void OnDestroy()
{
try
{
Harmony harmony = _harmony;
if (harmony != null)
{
harmony.UnpatchSelf();
}
}
catch
{
Debug.Log((object)"Cannot unpatch thirst!");
}
}
private void OnSceneLoaded(Scene scene, LoadSceneMode sceneMode)
{
OnsenThirst.AddThirstToOnsens();
}
}
}
namespace PeakThirst.Patches
{
[HarmonyPatch]
internal static class GetEatenHydrationPatch
{
[CompilerGenerated]
private sealed class <TargetMethods>d__2 : IEnumerable<MethodBase>, IEnumerable, IEnumerator<MethodBase>, IDisposable, IEnumerator
{
private int <>1__state;
private MethodBase <>2__current;
private int <>l__initialThreadId;
private IEnumerator<Type> <>s__1;
private Type <t>5__2;
private MethodInfo <m>5__3;
MethodBase IEnumerator<MethodBase>.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
object IEnumerator.Current
{
[DebuggerHidden]
get
{
return <>2__current;
}
}
[DebuggerHidden]
public <TargetMethods>d__2(int <>1__state)
{
this.<>1__state = <>1__state;
<>l__initialThreadId = Environment.CurrentManagedThreadId;
}
[DebuggerHidden]
void IDisposable.Dispose()
{
int num = <>1__state;
if (num == -3 || num == 1)
{
try
{
}
finally
{
<>m__Finally1();
}
}
<>s__1 = null;
<t>5__2 = null;
<m>5__3 = null;
<>1__state = -2;
}
private bool MoveNext()
{
try
{
int num = <>1__state;
if (num != 0)
{
if (num != 1)
{
return false;
}
<>1__state = -3;
goto IL_00ae;
}
<>1__state = -1;
<>s__1 = AccessTools.AllTypes().GetEnumerator();
<>1__state = -3;
goto IL_00bd;
IL_00ae:
<m>5__3 = null;
<t>5__2 = null;
goto IL_00bd;
IL_00bd:
if (<>s__1.MoveNext())
{
<t>5__2 = <>s__1.Current;
<m>5__3 = AccessTools.DeclaredMethod(<t>5__2, "GetEaten", new Type[1] { typeof(Character) }, (Type[])null);
if (<m>5__3 != null)
{
<>2__current = <m>5__3;
<>1__state = 1;
return true;
}
goto IL_00ae;
}
<>m__Finally1();
<>s__1 = null;
return false;
}
catch
{
//try-fault
((IDisposable)this).Dispose();
throw;
}
}
bool IEnumerator.MoveNext()
{
//ILSpy generated this explicit interface implementation from .override directive in MoveNext
return this.MoveNext();
}
private void <>m__Finally1()
{
<>1__state = -1;
if (<>s__1 != null)
{
<>s__1.Dispose();
}
}
[DebuggerHidden]
void IEnumerator.Reset()
{
throw new NotSupportedException();
}
[DebuggerHidden]
IEnumerator<MethodBase> IEnumerable<MethodBase>.GetEnumerator()
{
if (<>1__state == -2 && <>l__initialThreadId == Environment.CurrentManagedThreadId)
{
<>1__state = 0;
return this;
}
return new <TargetMethods>d__2(0);
}
[DebuggerHidden]
IEnumerator IEnumerable.GetEnumerator()
{
return ((IEnumerable<MethodBase>)this).GetEnumerator();
}
}
private static MethodInfo Apply => AccessTools.Method(typeof(GetEatenHydrationPatch), "ApplyHydration", (Type[])null, (Type[])null);
[IteratorStateMachine(typeof(<TargetMethods>d__2))]
private static IEnumerable<MethodBase> TargetMethods()
{
//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
return new <TargetMethods>d__2(-2);
}
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator il)
{
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Expected O, but got Unknown
//IL_006e: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Expected O, but got Unknown
CodeMatcher codes = new CodeMatcher(instructions, il);
if (!InsertedAt("ThrowAchievement") && !InsertedAt("AddStatus") && !InsertedAt("DieInstantly"))
{
codes.End().Insert((CodeInstruction[])(object)new CodeInstruction[2]
{
new CodeInstruction(OpCodes.Ldarg_1, (object)null),
new CodeInstruction(OpCodes.Call, (object)Apply)
});
}
return codes.InstructionEnumeration();
bool InsertedAt(string methodName)
{
//IL_0036: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Expected O, but got Unknown
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_0085: Expected O, but got Unknown
//IL_0091: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Expected O, but got Unknown
int pos = codes.Pos;
codes.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction i) => (i.opcode == OpCodes.Call || i.opcode == OpCodes.Callvirt) && i.operand is MethodInfo methodInfo && methodInfo.Name == methodName), (string)null)
});
if (!codes.IsValid)
{
codes.Start().Advance(pos);
return false;
}
codes.Insert((CodeInstruction[])(object)new CodeInstruction[2]
{
new CodeInstruction(OpCodes.Ldarg_1, (object)null),
new CodeInstruction(OpCodes.Call, (object)Apply)
});
return true;
}
}
private static void ApplyHydration(Character eater)
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)eater == (Object)null) && eater.IsLocal)
{
eater.refs.afflictions.SubtractStatus(ThirstAffliction.DehydrationType, 500f, false);
}
}
}
[HarmonyPatch(typeof(StormVisual))]
internal static class StormVisualRainHydrationPatch
{
[HarmonyPatch("LateUpdate")]
[HarmonyPostfix]
private static void Postfix(StormVisual __instance)
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0008: Invalid comparison between Unknown and I4
//IL_004b: Unknown result type (might be due to invalid IL or missing references)
if ((int)__instance.stormType <= 0 && __instance.playerInWindZone)
{
Character observedCharacter = Character.observedCharacter;
if (!((Object)(object)observedCharacter == (Object)null) && observedCharacter.IsLocal)
{
observedCharacter.refs.afflictions.SubtractStatus(ThirstAffliction.DehydrationType, 0.1f * Time.deltaTime, false);
}
}
}
}
[HarmonyPatch(typeof(WaterfallPusher))]
internal static class WaterfallPusher_OnTriggerEnter_Patch
{
[HarmonyPatch("OnTriggerEnter")]
[HarmonyTranspiler]
private static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions, ILGenerator il)
{
//IL_0069: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Expected O, but got Unknown
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Expected O, but got Unknown
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_00d2: Expected O, but got Unknown
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00e0: Expected O, but got Unknown
MethodInfo playCall = AccessTools.Method(typeof(SFX_PlayOneShot), "Play", (Type[])null, (Type[])null);
MethodInfo methodInfo = AccessTools.Method(typeof(Component), "GetComponentInParent", Type.EmptyTypes, new Type[1] { typeof(Character) });
MethodInfo methodInfo2 = AccessTools.Method(typeof(WaterfallPusher_OnTriggerEnter_Patch), "ApplyHydration", (Type[])null, (Type[])null);
CodeMatcher val = new CodeMatcher(instructions, il).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1]
{
new CodeMatch((Func<CodeInstruction, bool>)((CodeInstruction ci) => CodeInstructionExtensions.Calls(ci, playCall)), (string)null)
});
if (!val.IsValid)
{
return val.InstructionEnumeration();
}
val.Advance(1).Insert((CodeInstruction[])(object)new CodeInstruction[3]
{
new CodeInstruction(OpCodes.Ldarg_1, (object)null),
new CodeInstruction(OpCodes.Callvirt, (object)methodInfo),
new CodeInstruction(OpCodes.Call, (object)methodInfo2)
});
return val.InstructionEnumeration();
}
private static void ApplyHydration(Character c)
{
//IL_0019: Unknown result type (might be due to invalid IL or missing references)
if (!((Object)(object)c == (Object)null))
{
c.refs.afflictions.SubtractStatus(ThirstAffliction.DehydrationType, 500f, false);
}
}
}
}