using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using System.Text.RegularExpressions;
using BepInEx;
using BepInEx.Configuration;
using HarmonyLib;
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: AssemblyTitle("CapeAndTorchResistanceChanges")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("CapeAndTorchResistanceChanges")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("537a77b1-f957-47ac-a3d3-2814f59d3b72")]
[assembly: AssemblyFileVersion("1.0.3.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.3.0")]
[module: UnverifiableCode]
namespace CapeAndTorchResistanceChanges;
[BepInIncompatibility("castix_FireIsHot")]
[BepInIncompatibility("SSyl.ToastyTorches")]
[BepInIncompatibility("aedenthorn.CustomArmorStats")]
[BepInIncompatibility("goldenrevolver.TeleportWeatherWetAndColdFixes")]
[BepInIncompatibility("goldenrevolver.TrollArmorSetBonusWithoutCape")]
[BepInPlugin("goldenrevolver.CapeAndTorchResistanceChanges", "Cape and Torch Resistance Changes - Water and Cold Resistance", "1.0.3")]
public class CapeAndTorchResistanceChangesPlugin : BaseUnityPlugin
{
public enum CapeChanges
{
Disabled,
ResistanceChanges,
MovementSpeedBuffs,
Both
}
public enum TorchChanges
{
Disabled,
ResistanceChanges,
ResistanceChangesAndDurability
}
public enum WaterResistance
{
Disabled,
Resistant,
ImmuneExceptSwimming,
Immune
}
public enum ColdResistance
{
ImmuneWhileNotWet,
Immune
}
public const string NAME = "Cape and Torch Resistance Changes - Water and Cold Resistance";
public const string VERSION = "1.0.3";
public static ConfigEntry<CapeChanges> EnableCapeChanges;
public static ConfigEntry<TorchChanges> EnableTorchChanges;
public static ConfigEntry<bool> EnableTrollArmorSetBonusChange;
public static ConfigEntry<WaterResistance> TrollCapeWaterResistance;
public static ConfigEntry<ColdResistance> LoxCapeColdResistance;
public static ConfigEntry<TeleportChange> TeleportInstantlyUpdatesWeather;
public static ConfigEntry<bool> TeleportGrantsTemporaryWetAndColdImmunity;
public static ConfigEntry<string> WaterModifierLabel;
public static ConfigEntry<string> ColdModifierLabel;
protected void Awake()
{
LoadConfig();
Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null);
}
private void LoadConfig()
{
string text = "0 - Teleporting";
TeleportInstantlyUpdatesWeather = ((BaseUnityPlugin)this).Config.Bind<TeleportChange>(text, "TeleportInstantlyUpdatesWeather", TeleportChange.InstantlyUpdateWeatherAndClearWetAndColdDebuff, string.Empty);
TeleportGrantsTemporaryWetAndColdImmunity = ((BaseUnityPlugin)this).Config.Bind<bool>(text, "TeleportGrantsTemporaryWetAndColdImmunity", false, string.Empty);
text = "1 - Requires Restart";
EnableCapeChanges = ((BaseUnityPlugin)this).Config.Bind<CapeChanges>(text, "EnableCapeChanges", CapeChanges.Both, string.Empty);
EnableTorchChanges = ((BaseUnityPlugin)this).Config.Bind<TorchChanges>(text, "EnableTorchChanges", TorchChanges.ResistanceChangesAndDurability, string.Empty);
EnableTrollArmorSetBonusChange = ((BaseUnityPlugin)this).Config.Bind<bool>(text, "EnableTrollArmorSetBonusChange", true, string.Empty);
TrollCapeWaterResistance = ((BaseUnityPlugin)this).Config.Bind<WaterResistance>(text, "TrollCapeWaterResistance", WaterResistance.ImmuneExceptSwimming, string.Empty);
LoxCapeColdResistance = ((BaseUnityPlugin)this).Config.Bind<ColdResistance>(text, "LoxCapeColdResistance", ColdResistance.Immune, string.Empty);
text = "9 - Localization";
WaterModifierLabel = ((BaseUnityPlugin)this).Config.Bind<string>(text, "WaterModifierLabel", "Water", string.Empty);
ColdModifierLabel = ((BaseUnityPlugin)this).Config.Bind<string>(text, "ColdModifierLabel", "Cold", string.Empty);
}
}
[HarmonyPatch(typeof(Humanoid), "DrainEquipedItemDurability")]
internal static class Humanoid_DrainEquipedItemDurability_Patch
{
private static void Postfix(Humanoid __instance, ref ItemData item, ref float dt)
{
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0054: Invalid comparison between Unknown and I4
if (CapeAndTorchResistanceChangesPlugin.EnableTorchChanges.Value != CapeAndTorchResistanceChangesPlugin.TorchChanges.ResistanceChangesAndDurability || !((Character)__instance).IsPlayer())
{
return;
}
Player val = (Player)(object)((__instance is Player) ? __instance : null);
if (val != null && (int)item.m_shared.m_itemType == 15)
{
bool flag = val.InShelter();
bool flag2 = EnvMan.instance.IsFreezing();
bool flag3 = EnvMan.instance.IsCold();
bool flag4 = EnvMan.instance.IsWet();
bool flag5 = (flag3 || flag2) && !flag;
bool flag6 = flag4 && !val.m_underRoof;
if (flag6 || flag5)
{
ItemData obj = item;
obj.m_durability -= item.m_shared.m_durabilityDrain * dt;
}
}
}
}
[HarmonyPatch(typeof(ObjectDB))]
internal static class PatchObjectDB
{
internal static SE_Stats teleportBuff;
private static readonly string[] trollSet = new string[3] { "HelmetTrollLeather", "ArmorTrollLeatherChest", "ArmorTrollLeatherLegs" };
private static DamageModifier ParseWaterResistance(CapeAndTorchResistanceChangesPlugin.WaterResistance res)
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0020: Unknown result type (might be due to invalid IL or missing references)
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
return (DamageModifier)(res switch
{
CapeAndTorchResistanceChangesPlugin.WaterResistance.Resistant => 1,
CapeAndTorchResistanceChangesPlugin.WaterResistance.Immune => 3,
CapeAndTorchResistanceChangesPlugin.WaterResistance.ImmuneExceptSwimming => 5,
_ => 0,
});
}
[HarmonyPatch("Awake")]
[HarmonyPostfix]
public static void Awake_Postfix(ObjectDB __instance)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_0113: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_013f: Unknown result type (might be due to invalid IL or missing references)
//IL_0144: Unknown result type (might be due to invalid IL or missing references)
//IL_0214: Unknown result type (might be due to invalid IL or missing references)
//IL_0221: Unknown result type (might be due to invalid IL or missing references)
//IL_0232: Unknown result type (might be due to invalid IL or missing references)
//IL_0237: Unknown result type (might be due to invalid IL or missing references)
//IL_023c: Unknown result type (might be due to invalid IL or missing references)
//IL_039d: Unknown result type (might be due to invalid IL or missing references)
//IL_03aa: Unknown result type (might be due to invalid IL or missing references)
//IL_03b2: Unknown result type (might be due to invalid IL or missing references)
//IL_03b7: Unknown result type (might be due to invalid IL or missing references)
//IL_0337: Unknown result type (might be due to invalid IL or missing references)
//IL_0344: Unknown result type (might be due to invalid IL or missing references)
//IL_034c: Unknown result type (might be due to invalid IL or missing references)
//IL_0351: Unknown result type (might be due to invalid IL or missing references)
//IL_047d: Unknown result type (might be due to invalid IL or missing references)
//IL_048a: Unknown result type (might be due to invalid IL or missing references)
//IL_0492: Unknown result type (might be due to invalid IL or missing references)
//IL_0497: Unknown result type (might be due to invalid IL or missing references)
//IL_040a: Unknown result type (might be due to invalid IL or missing references)
//IL_0416: Unknown result type (might be due to invalid IL or missing references)
//IL_0423: Unknown result type (might be due to invalid IL or missing references)
//IL_042a: Unknown result type (might be due to invalid IL or missing references)
//IL_042c: Unknown result type (might be due to invalid IL or missing references)
//IL_0431: Unknown result type (might be due to invalid IL or missing references)
Scene activeScene = SceneManager.GetActiveScene();
if (((Scene)(ref activeScene)).name != "main")
{
return;
}
SE_Stats val = ScriptableObject.CreateInstance<SE_Stats>();
((Object)val).name = "GoldensTeleportBuff";
((StatusEffect)val).m_ttl = 5f;
val.m_mods = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)2048,
m_modifier = (DamageModifier)3
},
new DamageModPair
{
m_type = (DamageType)1024,
m_modifier = (DamageModifier)3
}
};
teleportBuff = val;
__instance.m_StatusEffects.Add((StatusEffect)(object)val);
foreach (GameObject item in __instance.m_items)
{
if (CapeAndTorchResistanceChangesPlugin.EnableTorchChanges.Value != 0 && ((Object)item).name == "Torch")
{
SharedData shared = item.GetComponent<ItemDrop>().m_itemData.m_shared;
shared.m_damageModifiers = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)2048,
m_modifier = (DamageModifier)1
},
new DamageModPair
{
m_type = (DamageType)1024,
m_modifier = (DamageModifier)1
}
};
}
bool flag = CapeAndTorchResistanceChangesPlugin.EnableCapeChanges.Value == CapeAndTorchResistanceChangesPlugin.CapeChanges.MovementSpeedBuffs || CapeAndTorchResistanceChangesPlugin.EnableCapeChanges.Value == CapeAndTorchResistanceChangesPlugin.CapeChanges.Both;
bool flag2 = CapeAndTorchResistanceChangesPlugin.EnableCapeChanges.Value == CapeAndTorchResistanceChangesPlugin.CapeChanges.ResistanceChanges || CapeAndTorchResistanceChangesPlugin.EnableCapeChanges.Value == CapeAndTorchResistanceChangesPlugin.CapeChanges.Both;
if (((Object)item).name == "CapeTrollHide")
{
SharedData shared2 = item.GetComponent<ItemDrop>().m_itemData.m_shared;
if (CapeAndTorchResistanceChangesPlugin.EnableTrollArmorSetBonusChange.Value)
{
shared2.m_setName = string.Empty;
shared2.m_setSize = 0;
shared2.m_setStatusEffect = null;
}
if (flag)
{
shared2.m_movementModifier = 0.05f;
}
if (flag2)
{
shared2.m_damageModifiers = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)1024,
m_modifier = ParseWaterResistance(CapeAndTorchResistanceChangesPlugin.TrollCapeWaterResistance.Value)
}
};
}
}
if (CapeAndTorchResistanceChangesPlugin.EnableTrollArmorSetBonusChange.Value && trollSet.Contains(((Object)item).name))
{
item.GetComponent<ItemDrop>().m_itemData.m_shared.m_setSize = 3;
}
if (CapeAndTorchResistanceChangesPlugin.EnableCapeChanges.Value == CapeAndTorchResistanceChangesPlugin.CapeChanges.Disabled)
{
continue;
}
if (((Object)item).name == "CapeDeerHide" && flag)
{
item.GetComponent<ItemDrop>().m_itemData.m_shared.m_movementModifier = 0.03f;
}
if (((Object)item).name == "CapeLinen")
{
SharedData shared3 = item.GetComponent<ItemDrop>().m_itemData.m_shared;
if (flag)
{
shared3.m_movementModifier = 0.1f;
}
if (flag2)
{
shared3.m_damageModifiers = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)2048,
m_modifier = (DamageModifier)1
}
};
}
}
if (((Object)item).name == "CapeWolf")
{
SharedData shared4 = item.GetComponent<ItemDrop>().m_itemData.m_shared;
if (flag2)
{
shared4.m_damageModifiers = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)2048,
m_modifier = (DamageModifier)5
}
};
}
}
if (((Object)item).name == "CapeLox")
{
SharedData shared5 = item.GetComponent<ItemDrop>().m_itemData.m_shared;
if (flag2)
{
DamageModifier modifier = (DamageModifier)((CapeAndTorchResistanceChangesPlugin.LoxCapeColdResistance.Value == CapeAndTorchResistanceChangesPlugin.ColdResistance.Immune) ? 3 : 5);
shared5.m_damageModifiers = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)2048,
m_modifier = modifier
}
};
}
}
if (((Object)item).name == "CapeFeather")
{
SharedData shared6 = item.GetComponent<ItemDrop>().m_itemData.m_shared;
if (flag2)
{
shared6.m_damageModifiers = new List<DamageModPair>
{
new DamageModPair
{
m_type = (DamageType)2048,
m_modifier = (DamageModifier)5
}
};
}
}
}
}
}
internal static class ResistanceHelper
{
private static readonly int[] modifierCompare = new int[7] { 6, 3, 5, 1, 0, 2, 4 };
internal static bool IsAtLeastResistant(DamageModifier damageModifier)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0004: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
//IL_000b: Unknown result type (might be due to invalid IL or missing references)
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Invalid comparison between Unknown and I4
if ((int)damageModifier == 1 || damageModifier - 3 <= 2)
{
return true;
}
return false;
}
internal static DamageModifier GetNewDamageTypeModifier(NewResistances.NewDamageTypes type, Player player)
{
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_004c: Invalid comparison between Unknown and I4
//IL_005a: Unknown result type (might be due to invalid IL or missing references)
//IL_005b: Unknown result type (might be due to invalid IL or missing references)
//IL_0060: Unknown result type (might be due to invalid IL or missing references)
//IL_0062: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0170: Unknown result type (might be due to invalid IL or missing references)
//IL_0171: Unknown result type (might be due to invalid IL or missing references)
//IL_0176: Unknown result type (might be due to invalid IL or missing references)
//IL_017a: Unknown result type (might be due to invalid IL or missing references)
//IL_00fc: Unknown result type (might be due to invalid IL or missing references)
//IL_0101: Unknown result type (might be due to invalid IL or missing references)
//IL_0104: Unknown result type (might be due to invalid IL or missing references)
//IL_0106: Unknown result type (might be due to invalid IL or missing references)
//IL_010c: Invalid comparison between Unknown and I4
//IL_011a: Unknown result type (might be due to invalid IL or missing references)
//IL_011b: Unknown result type (might be due to invalid IL or missing references)
//IL_0120: Unknown result type (might be due to invalid IL or missing references)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_0135: Unknown result type (might be due to invalid IL or missing references)
DamageModPair val = default(DamageModPair);
foreach (ItemData equippedItem in ((Humanoid)player).m_inventory.GetEquippedItems())
{
foreach (DamageModPair damageModifier in equippedItem.m_shared.m_damageModifiers)
{
if ((int)damageModifier.m_type == (int)type && ShouldOverride(val.m_modifier, damageModifier.m_modifier))
{
val = damageModifier;
}
}
}
foreach (StatusEffect statusEffect in ((Character)player).m_seman.m_statusEffects)
{
SE_Stats val2 = (SE_Stats)(object)((statusEffect is SE_Stats) ? statusEffect : null);
if (val2 == null)
{
continue;
}
foreach (DamageModPair mod in val2.m_mods)
{
if ((int)mod.m_type == (int)type && ShouldOverride(val.m_modifier, mod.m_modifier))
{
val = mod;
}
}
}
return val.m_modifier;
}
private static bool ShouldOverride(DamageModifier oldModifier, DamageModifier newModifier)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
if (TryShouldOverride(oldModifier, newModifier, out var shouldOverride))
{
return shouldOverride;
}
return ShouldOverrideOld(oldModifier, newModifier);
}
internal static bool TryShouldOverride(DamageModifier oldModifier, DamageModifier newModifier, out bool shouldOverride)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Expected I4, but got Unknown
//IL_0003: Unknown result type (might be due to invalid IL or missing references)
//IL_0005: Expected I4, but got Unknown
int num = (int)oldModifier;
int num2 = (int)newModifier;
if (num >= 0 && num <= 6 && num2 >= 0 && num2 <= 6)
{
shouldOverride = modifierCompare[num2] < modifierCompare[num];
return true;
}
shouldOverride = false;
return false;
}
private static bool ShouldOverrideOld(DamageModifier oldMod, DamageModifier newMod)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0003: Invalid comparison between Unknown and I4
//IL_0005: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
//IL_0009: Unknown result type (might be due to invalid IL or missing references)
//IL_000b: Invalid comparison between Unknown and I4
//IL_0011: Unknown result type (might be due to invalid IL or missing references)
//IL_0013: Invalid comparison between Unknown and I4
//IL_000d: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Invalid comparison between Unknown and I4
//IL_0015: Unknown result type (might be due to invalid IL or missing references)
//IL_0017: Invalid comparison between Unknown and I4
return (int)oldMod != 4 && ((int)newMod == 3 || (((int)oldMod != 5 || (int)newMod != 1) && ((int)oldMod != 6 || (int)newMod != 2)));
}
}
internal static class NewResistances
{
internal enum NewDamageTypes
{
Water = 0x400,
Cold = 0x800
}
[HarmonyPatch(typeof(SEMan), "AddStatusEffect", new Type[]
{
typeof(int),
typeof(bool),
typeof(int),
typeof(float)
})]
private static class SEMan_AddStatusEffectByName_Patch
{
private static bool Prefix(SEMan __instance, int nameHash, bool resetTime, ref StatusEffect __result)
{
StatusEffect statusEffect = ObjectDB.instance.GetStatusEffect(nameHash);
if ((Object)(object)statusEffect == (Object)null || !resetTime || CanAddStatusEffectOverride(((Object)statusEffect).name, __instance.m_character))
{
return true;
}
__result = null;
return false;
}
}
[HarmonyPatch(typeof(SEMan), "AddStatusEffect", new Type[]
{
typeof(StatusEffect),
typeof(bool),
typeof(int),
typeof(float)
})]
private static class SEMan_AddStatusEffectByType_Patch
{
private static bool Prefix(SEMan __instance, StatusEffect statusEffect, ref StatusEffect __result)
{
if (CanAddStatusEffectOverride(((Object)statusEffect).name, __instance.m_character))
{
return true;
}
__result = null;
return false;
}
}
[HarmonyPatch(typeof(SE_Wet), "UpdateStatusEffect")]
private static class SE_Wet_UpdateStatusEffect_Patch
{
private static void Postfix(SE_Wet __instance, float dt)
{
//IL_003c: Unknown result type (might be due to invalid IL or missing references)
//IL_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0042: Unknown result type (might be due to invalid IL or missing references)
//IL_0044: Invalid comparison between Unknown and I4
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Invalid comparison between Unknown and I4
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Invalid comparison between Unknown and I4
//IL_0093: Unknown result type (might be due to invalid IL or missing references)
//IL_0095: Invalid comparison between Unknown and I4
if (!((StatusEffect)__instance).m_character.IsPlayer())
{
return;
}
Character character = ((StatusEffect)__instance).m_character;
Player val = (Player)(object)((character is Player) ? character : null);
if (val != null)
{
DamageModifier newDamageTypeModifier = ResistanceHelper.GetNewDamageTypeModifier(NewDamageTypes.Water, val);
if ((int)newDamageTypeModifier == 1 || (int)newDamageTypeModifier == 5)
{
((StatusEffect)__instance).m_time = ((StatusEffect)__instance).m_time + dt * 3f / 2f;
}
else if ((int)newDamageTypeModifier == 2)
{
((StatusEffect)__instance).m_time = ((StatusEffect)__instance).m_time - dt / 3f;
}
else if ((int)newDamageTypeModifier == 6)
{
((StatusEffect)__instance).m_time = ((StatusEffect)__instance).m_time - dt * 2f / 3f;
}
}
}
}
[HarmonyPatch(typeof(Player), "UpdateEnvStatusEffects")]
private static class Player_UpdateEnvStatusEffects_Patch
{
private static bool Prefix(Player __instance, float dt)
{
//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_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0046: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_010e: Unknown result type (might be due to invalid IL or missing references)
//IL_0131: Unknown result type (might be due to invalid IL or missing references)
//IL_0136: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_0149: Unknown result type (might be due to invalid IL or missing references)
//IL_014c: Invalid comparison between Unknown and I4
//IL_014e: Unknown result type (might be due to invalid IL or missing references)
//IL_0151: Invalid comparison between Unknown and I4
__instance.m_nearFireTimer += dt;
DamageModifiers damageModifiers = ((Character)__instance).GetDamageModifiers((WeakSpot)null);
bool flag = __instance.m_nearFireTimer < 0.25f;
bool flag2 = ((Character)__instance).m_seman.HaveStatusEffect("Burning");
bool flag3 = __instance.InShelter();
DamageModifier modifier = ((DamageModifiers)(ref damageModifiers)).GetModifier((DamageType)64);
bool flag4 = EnvMan.instance.IsFreezing();
bool flag5 = EnvMan.instance.IsCold();
bool flag6 = EnvMan.instance.IsWet();
bool flag7 = __instance.IsSensed();
bool flag8 = ((Character)__instance).IsSitting();
bool flag9 = Object.op_Implicit((Object)(object)EffectArea.IsPointInsideArea(((Component)__instance).transform.position, (Type)64, 1f));
bool flag10 = flag4 && !flag && !flag3;
bool flag11 = (flag5 && !flag) || (flag4 && flag && !flag3) || (flag4 && !flag && flag3);
if (flag6 && !__instance.m_underRoof)
{
((Character)__instance).m_seman.AddStatusEffect(Player.s_statusEffectWet, true, 0, 0f);
}
bool flag12 = ((Character)__instance).m_seman.HaveStatusEffect("Wet");
if (ResistanceHelper.IsAtLeastResistant(modifier) || flag9 || flag2)
{
flag10 = false;
flag11 = false;
}
else
{
DamageModifier newDamageTypeModifier = ResistanceHelper.GetNewDamageTypeModifier(NewDamageTypes.Cold, __instance);
if (ResistanceHelper.IsAtLeastResistant(newDamageTypeModifier))
{
flag11 = false;
if ((int)newDamageTypeModifier != 1 && ((int)newDamageTypeModifier != 5 || !flag12))
{
flag10 = false;
}
}
}
if (flag3)
{
((Character)__instance).m_seman.AddStatusEffect(Player.s_statusEffectShelter, false, 0, 0f);
}
else
{
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectShelter, false);
}
if (flag)
{
((Character)__instance).m_seman.AddStatusEffect(Player.s_statusEffectCampFire, false, 0, 0f);
}
else
{
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectCampFire, false);
}
bool flag13 = !flag7 && (flag8 || flag3) && !flag11 && !flag10 && (!flag12 || flag9) && !flag2 && flag;
if (flag13)
{
((Character)__instance).m_seman.AddStatusEffect(Player.s_statusEffectResting, false, 0, 0f);
}
else
{
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectResting, false);
}
__instance.m_safeInHome = flag13 && flag3 && (float)__instance.GetBaseValue() >= 1f;
if (flag10)
{
if (!((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectCold, true))
{
((Character)__instance).m_seman.AddStatusEffect(Player.s_statusEffectFreezing, false, 0, 0f);
return false;
}
}
else if (flag11)
{
if (!((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectFreezing, true) && Object.op_Implicit((Object)(object)((Character)__instance).m_seman.AddStatusEffect(Player.s_statusEffectCold, false, 0, 0f)))
{
__instance.ShowTutorial("cold", false);
return false;
}
}
else
{
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectCold, false);
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectFreezing, false);
}
return false;
}
}
[HarmonyPatch(typeof(SE_Stats), "GetDamageModifiersTooltipString")]
private static class SE_Stats_GetDamageModifiersTooltipString_Patch
{
private static void Postfix(ref string __result, List<DamageModPair> mods)
{
//IL_0023: Unknown result type (might be due to invalid IL or missing references)
//IL_0028: Unknown result type (might be due to invalid IL or missing references)
//IL_0034: Unknown result type (might be due to invalid IL or missing references)
//IL_0035: Unknown result type (might be due to invalid IL or missing references)
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Invalid comparison between Unknown and I4
//IL_0057: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Invalid comparison between Unknown and I4
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0071: Unknown result type (might be due to invalid IL or missing references)
//IL_0073: Unknown result type (might be due to invalid IL or missing references)
//IL_0075: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: Unknown result type (might be due to invalid IL or missing references)
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Expected I4, but got Unknown
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00eb: Unknown result type (might be due to invalid IL or missing references)
//IL_00f5: Invalid comparison between Unknown and I4
//IL_011e: Unknown result type (might be due to invalid IL or missing references)
//IL_011f: Unknown result type (might be due to invalid IL or missing references)
//IL_0129: Invalid comparison between Unknown and I4
__result = Regex.Replace(__result, "\\n.*<color=orange></color>", "");
foreach (DamageModPair mod in mods)
{
if (!Enum.IsDefined(typeof(DamageType), mod.m_type) && (int)mod.m_modifier != 4 && (int)mod.m_modifier > 0)
{
DamageModifier modifier = mod.m_modifier;
DamageModifier val = modifier;
switch (val - 1)
{
case 0:
__result += "\n$inventory_dmgmod: <color=orange>$inventory_resistant</color> VS ";
break;
case 1:
__result += "\n$inventory_dmgmod: <color=orange>$inventory_weak</color> VS ";
break;
case 2:
__result += "\n$inventory_dmgmod: <color=orange>$inventory_immune</color> VS ";
break;
case 4:
__result += "\n$inventory_dmgmod: <color=orange>$inventory_veryresistant</color> VS ";
break;
case 5:
__result += "\n$inventory_dmgmod: <color=orange>$inventory_veryweak</color> VS ";
break;
}
if ((int)mod.m_type == 1024)
{
__result = __result + "<color=orange>" + CapeAndTorchResistanceChangesPlugin.WaterModifierLabel.Value + "</color>";
}
else if ((int)mod.m_type == 2048)
{
__result = __result + "<color=orange>" + CapeAndTorchResistanceChangesPlugin.ColdModifierLabel.Value + "</color>";
}
}
}
}
}
private static bool CanAddStatusEffectOverride(string name, Character character)
{
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Invalid comparison between Unknown and I4
//IL_0054: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Invalid comparison between Unknown and I4
//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00b1: Unknown result type (might be due to invalid IL or missing references)
//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
//IL_00b6: Invalid comparison between Unknown and I4
//IL_0067: Unknown result type (might be due to invalid IL or missing references)
//IL_006a: Invalid comparison between Unknown and I4
//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
//IL_00bb: Invalid comparison between Unknown and I4
if (!character.IsPlayer())
{
return true;
}
Player val = (Player)(object)((character is Player) ? character : null);
if (val == null)
{
return true;
}
if (name == "Wet")
{
DamageModifier newDamageTypeModifier = ResistanceHelper.GetNewDamageTypeModifier(NewDamageTypes.Water, val);
if ((int)newDamageTypeModifier == 4 || (int)newDamageTypeModifier == 3)
{
return false;
}
if ((int)newDamageTypeModifier == 5 && !((Character)val).InLiquidSwimDepth())
{
return false;
}
}
if (name == "Cold" || name == "Freezing")
{
DamageModifier newDamageTypeModifier2 = ResistanceHelper.GetNewDamageTypeModifier(NewDamageTypes.Cold, val);
if ((int)newDamageTypeModifier2 == 4 || (int)newDamageTypeModifier2 == 3)
{
return false;
}
}
return true;
}
}
[HarmonyPatch(typeof(Player), "UpdateTeleport")]
internal static class PatchPlayer
{
public static void Prefix(Player __instance, ref bool __state)
{
__state = __instance.m_teleporting;
if (CapeAndTorchResistanceChangesPlugin.TeleportInstantlyUpdatesWeather.Value != 0 && __instance.m_distantTeleport && __instance.m_teleporting && __instance.m_teleportTimer == 0f)
{
TeleportHelper.RemoveAndBackupTransition(ref EnvMan.instance.m_wetTransitionDuration, ref TeleportHelper.oldWetTransitionDuration);
TeleportHelper.RemoveAndBackupTransition(ref EnvMan.instance.m_windTransitionDuration, ref TeleportHelper.oldWindTransitionDuration);
TeleportHelper.RemoveAndBackupTransition(ref EnvMan.instance.m_transitionDuration, ref TeleportHelper.oldTransitionDuration);
}
}
public static void Postfix(Player __instance, ref bool __state)
{
if (__instance.m_distantTeleport && __state && !__instance.m_teleporting)
{
if (CapeAndTorchResistanceChangesPlugin.TeleportGrantsTemporaryWetAndColdImmunity.Value)
{
((Character)__instance).m_seman.AddStatusEffect((StatusEffect)(object)PatchObjectDB.teleportBuff, false, 0, 0f);
}
if (CapeAndTorchResistanceChangesPlugin.TeleportInstantlyUpdatesWeather.Value != 0)
{
TeleportHelper.ResetTransition(ref EnvMan.instance.m_wetTransitionDuration, ref TeleportHelper.oldWetTransitionDuration, 15f);
TeleportHelper.ResetTransition(ref EnvMan.instance.m_windTransitionDuration, ref TeleportHelper.oldWindTransitionDuration, 10f);
TeleportHelper.ResetTransition(ref EnvMan.instance.m_transitionDuration, ref TeleportHelper.oldTransitionDuration, 10f);
}
if (CapeAndTorchResistanceChangesPlugin.TeleportInstantlyUpdatesWeather.Value == TeleportChange.InstantlyUpdateWeatherAndClearWetAndColdDebuff)
{
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectWet, false);
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectCold, false);
((Character)__instance).m_seman.RemoveStatusEffect(Player.s_statusEffectFreezing, false);
}
}
}
}
public enum TeleportChange
{
Disabled,
InstantlyUpdateWeather,
InstantlyUpdateWeatherAndClearWetAndColdDebuff
}
internal static class TeleportHelper
{
internal static float oldWetTransitionDuration = float.Epsilon;
internal static float oldTransitionDuration = float.Epsilon;
internal static float oldWindTransitionDuration = float.Epsilon;
internal static void ResetTransition(ref float transitionDuration, ref float preTeleportDuration, float defaultValue)
{
if (transitionDuration == float.Epsilon)
{
if (preTeleportDuration != float.Epsilon)
{
transitionDuration = preTeleportDuration;
preTeleportDuration = float.Epsilon;
}
else
{
transitionDuration = defaultValue;
}
}
}
internal static void RemoveAndBackupTransition(ref float transitionDuration, ref float backup)
{
if (transitionDuration != float.Epsilon)
{
backup = transitionDuration;
transitionDuration = float.Epsilon;
}
}
}