Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of DeathTweaks v1.4.1
DeathTweaks.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using Splatform; using TMPro; using UnityEngine; [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.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+0d3a68cc3093072d4161198fe3adb85b4a5c9f87")] [assembly: AssemblyVersion("1.0.0.0")] public class AedenthornUtils { public static bool IgnoreKeyPresses(bool extra = false) { int result; if (!extra) { if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog()) { Chat instance = Chat.instance; if (instance == null || !instance.HasFocus()) { result = (Menu.IsVisible() ? 1 : 0); goto IL_005f; } } result = 1; goto IL_005f; } int result2; if (!((Object)(object)ZNetScene.instance == (Object)null) && !((Object)(object)Player.m_localPlayer == (Object)null) && !Minimap.IsOpen() && !Console.IsVisible() && !TextInput.IsVisible() && !ZNet.instance.InPasswordDialog()) { Chat instance2 = Chat.instance; if ((instance2 == null || !instance2.HasFocus()) && !StoreGui.IsVisible() && !InventoryGui.IsVisible() && !Menu.IsVisible()) { TextViewer instance3 = TextViewer.instance; result2 = ((instance3 != null && instance3.IsVisible()) ? 1 : 0); goto IL_00d9; } } result2 = 1; goto IL_00d9; IL_005f: return (byte)result != 0; IL_00d9: return (byte)result2 != 0; } public static bool CheckKeyDown(string value) { try { return Input.GetKeyDown(value.ToLower()); } catch { return false; } } public static bool CheckKeyHeld(string value, bool req = true) { try { return Input.GetKey(value.ToLower()); } catch { return !req; } } } namespace DeathTweaks; [BepInPlugin("aedenthorn.DeathTweaks", "Death Tweaks", "1.4.1")] public class BepInExPlugin : BaseUnityPlugin { private class InventoryInfos { public List<ItemData> drop_list; public Inventory inventory; public InventoryInfos(Inventory i, List<ItemData> d) { drop_list = d; inventory = i; } } [HarmonyPatch(typeof(Player), "OnDeath")] [HarmonyPriority(800)] public static class OnDeath_Patch { public static bool Prefix(Player __instance, Inventory ___m_inventory, ref float ___m_timeSinceDeath, float ___m_hardDeathCooldown, ZNetView ___m_nview, List<Food> ___m_foods, Skills ___m_skills, SEMan ___m_seman, HitData ___m_lastHit) { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected I4, but got Unknown //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_08c1: Unknown result type (might be due to invalid IL or missing references) //IL_08c6: Unknown result type (might be due to invalid IL or missing references) //IL_08d0: Unknown result type (might be due to invalid IL or missing references) //IL_08d5: Unknown result type (might be due to invalid IL or missing references) //IL_08da: Unknown result type (might be due to invalid IL or missing references) //IL_08e2: Unknown result type (might be due to invalid IL or missing references) //IL_08ea: Unknown result type (might be due to invalid IL or missing references) //IL_0bc9: Unknown result type (might be due to invalid IL or missing references) //IL_0bce: Unknown result type (might be due to invalid IL or missing references) //IL_0bd8: Unknown result type (might be due to invalid IL or missing references) //IL_0bdd: Unknown result type (might be due to invalid IL or missing references) //IL_0be2: Unknown result type (might be due to invalid IL or missing references) //IL_0bec: Unknown result type (might be due to invalid IL or missing references) //IL_0bf1: Unknown result type (might be due to invalid IL or missing references) //IL_0bf6: Unknown result type (might be due to invalid IL or missing references) //IL_0c0e: Unknown result type (might be due to invalid IL or missing references) //IL_0c13: Unknown result type (might be due to invalid IL or missing references) //IL_0c18: Unknown result type (might be due to invalid IL or missing references) //IL_0c1a: Unknown result type (might be due to invalid IL or missing references) //IL_0a10: Unknown result type (might be due to invalid IL or missing references) //IL_0a15: Unknown result type (might be due to invalid IL or missing references) //IL_0a28: Unknown result type (might be due to invalid IL or missing references) //IL_0a34: Unknown result type (might be due to invalid IL or missing references) //IL_0a63: Unknown result type (might be due to invalid IL or missing references) //IL_0afe: Unknown result type (might be due to invalid IL or missing references) //IL_0d18: Unknown result type (might be due to invalid IL or missing references) //IL_0d47: Unknown result type (might be due to invalid IL or missing references) //IL_0d4d: Unknown result type (might be due to invalid IL or missing references) //IL_0d78: Unknown result type (might be due to invalid IL or missing references) //IL_0d7d: Unknown result type (might be due to invalid IL or missing references) //IL_0561: Unknown result type (might be due to invalid IL or missing references) //IL_05d2: Unknown result type (might be due to invalid IL or missing references) //IL_05d7: Invalid comparison between O and Unknown //IL_06ce: Unknown result type (might be due to invalid IL or missing references) //IL_0734: Unknown result type (might be due to invalid IL or missing references) //IL_0784: Unknown result type (might be due to invalid IL or missing references) if (!modEnabled.Value) { return true; } ___m_nview.GetZDO().Set("dead", true); ___m_nview.InvokeRPC(ZNetView.Everybody, "OnDeath", new object[0]); Game.instance.IncrementPlayerStat((PlayerStatType)0, 1f); HitType hitType = ___m_lastHit.m_hitType; HitType val = hitType; switch ((int)val) { case 0: Game.instance.IncrementPlayerStat((PlayerStatType)55, 1f); break; case 1: Game.instance.IncrementPlayerStat((PlayerStatType)56, 1f); break; case 2: Game.instance.IncrementPlayerStat((PlayerStatType)57, 1f); break; case 3: Game.instance.IncrementPlayerStat((PlayerStatType)58, 1f); break; case 4: Game.instance.IncrementPlayerStat((PlayerStatType)59, 1f); break; case 5: Game.instance.IncrementPlayerStat((PlayerStatType)60, 1f); break; case 6: Game.instance.IncrementPlayerStat((PlayerStatType)61, 1f); break; case 7: Game.instance.IncrementPlayerStat((PlayerStatType)62, 1f); break; case 8: Game.instance.IncrementPlayerStat((PlayerStatType)64, 1f); break; case 9: Game.instance.IncrementPlayerStat((PlayerStatType)63, 1f); break; case 10: Game.instance.IncrementPlayerStat((PlayerStatType)65, 1f); break; case 11: Game.instance.IncrementPlayerStat((PlayerStatType)66, 1f); break; case 12: Game.instance.IncrementPlayerStat((PlayerStatType)67, 1f); break; case 13: Game.instance.IncrementPlayerStat((PlayerStatType)68, 1f); break; case 14: Game.instance.IncrementPlayerStat((PlayerStatType)69, 1f); break; case 15: Game.instance.IncrementPlayerStat((PlayerStatType)70, 1f); break; case 16: Game.instance.IncrementPlayerStat((PlayerStatType)71, 1f); break; case 17: Game.instance.IncrementPlayerStat((PlayerStatType)72, 1f); break; case 18: Game.instance.IncrementPlayerStat((PlayerStatType)73, 1f); break; default: ZLog.LogWarning((object)("Not implemented death type " + ((object)(HitType)(ref ___m_lastHit.m_hitType)).ToString())); break; } Game.instance.GetPlayerProfile().SetDeathPoint(((Component)__instance).transform.position); if (createDeathEffects.Value) { Traverse.Create((object)__instance).Method("CreateDeathEffects", Array.Empty<object>()).GetValue(); } List<InventoryInfos> list = new List<InventoryInfos>(); if (!keepAllItems.Value) { if (quickSlotsAssembly != null) { object obj = quickSlotsAssembly.GetType("EquipmentAndQuickSlots.InventoryExtensions").GetMethod("Extended", BindingFlags.Static | BindingFlags.Public).Invoke(null, new object[1] { ___m_inventory }); foreach (Inventory item in (List<Inventory>)quickSlotsAssembly.GetType("EquipmentAndQuickSlots.ExtendedInventory").GetField("_inventories", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(obj)) { list.Add(new InventoryInfos(item, new List<ItemData>())); } } else { list.Add(new InventoryInfos(___m_inventory, new List<ItemData>())); } string[] source = (string.IsNullOrEmpty(keepItemTypes.Value) ? new string[0] : keepItemTypes.Value.Split(new char[1] { ',' })); string[] source2 = (string.IsNullOrEmpty(keepItemNames.Value) ? new string[0] : keepItemNames.Value.Split(new char[1] { ',' })); string[] source3 = (string.IsNullOrEmpty(destroyItemTypes.Value) ? new string[0] : destroyItemTypes.Value.Split(new char[1] { ',' })); string[] source4 = (string.IsNullOrEmpty(destroyItemNames.Value) ? new string[0] : destroyItemNames.Value.Split(new char[1] { ',' })); string[] source5 = (string.IsNullOrEmpty(dropItemTypes.Value) ? new string[0] : dropItemTypes.Value.Split(new char[1] { ',' })); string[] source6 = (string.IsNullOrEmpty(dropItemNames.Value) ? new string[0] : dropItemNames.Value.Split(new char[1] { ',' })); for (int i = 0; i < list.Count; i++) { Inventory inventory = list[i].inventory; List<ItemData> drop_list = list[i].drop_list; Dbgl($" inventory {i}"); List<ItemData> allItems = inventory.GetAllItems(); for (int num = allItems.Count - 1; num >= 0; num--) { ItemData val2 = allItems[num]; Dbgl($" Item Name: {((Object)val2.m_dropPrefab).name} Cat: {val2.m_shared.m_itemType}"); } if (quickSlotsAssembly != null && keepQuickSlotItems.Value && (object)inventory == (object)(Inventory)quickSlotsAssembly.GetType("EquipmentAndQuickSlots.PlayerExtensions").GetMethod("GetQuickSlotInventory", BindingFlags.Static | BindingFlags.Public).Invoke(null, new object[1] { __instance })) { Dbgl("Skipping quick slot inventory"); continue; } List<ItemData> value = Traverse.Create((object)inventory).Field("m_inventory").GetValue<List<ItemData>>(); if (destroyAllItems.Value) { value.Clear(); } else { for (int num2 = value.Count - 1; num2 >= 0; num2--) { ItemData val3 = value[num2]; if ((!keepEquippedItems.Value || !val3.m_equipped) && (!keepHotbarItems.Value || !(inventory.GetName() == ___m_inventory.GetName()) || val3.m_gridPos.y != 0) && !val3.m_shared.m_questItem) { if (source3.Contains<string>(Enum.GetName(typeof(ItemType), val3.m_shared.m_itemType))) { value.RemoveAt(num2); } else if (source4.Contains(((Object)val3.m_dropPrefab).name)) { value.RemoveAt(num2); } else if (!source.Contains<string>(Enum.GetName(typeof(ItemType), val3.m_shared.m_itemType)) && !source2.Contains(((Object)val3.m_dropPrefab).name)) { if (source5.Contains<string>(Enum.GetName(typeof(ItemType), val3.m_shared.m_itemType))) { drop_list.Add(val3); value.RemoveAt(num2); } else if (source6.Contains(((Object)val3.m_dropPrefab).name)) { drop_list.Add(val3); value.RemoveAt(num2); } else if (!val3.m_shared.m_teleportable || !keepTeleportableItems.Value) { drop_list.Add(val3); value.RemoveAt(num2); } } } } } Traverse.Create((object)inventory).Method("Changed", Array.Empty<object>()).GetValue(); } } for (int j = 0; j < list.Count; j++) { Inventory inventory2 = list[j].inventory; List<ItemData> drop_list2 = list[j].drop_list; if (useTombStone.Value && drop_list2.Any()) { Dbgl(" dropItems.Any"); Vector3 val4 = ((Character)__instance).GetCenterPoint() + Vector3.left * (float)(j * 2); GameObject val5 = Object.Instantiate<GameObject>(__instance.m_tombstone, val4, ((Component)__instance).transform.rotation); val5.GetComponent<Container>().GetInventory().RemoveAll(); int value2 = Traverse.Create((object)inventory2).Field("m_width").GetValue<int>(); int value3 = Traverse.Create((object)inventory2).Field("m_height").GetValue<int>(); Traverse.Create((object)val5.GetComponent<Container>().GetInventory()).Field("m_width").SetValue((object)value2); Traverse.Create((object)val5.GetComponent<Container>().GetInventory()).Field("m_height").SetValue((object)value3); TombStone component = val5.GetComponent<TombStone>(); PlayerProfile playerProfile = Game.instance.GetPlayerProfile(); switch (j) { case 0: component.Setup(playerProfile.GetName(), playerProfile.GetPlayerID()); break; case 1: component.Setup(playerProfile.GetName() + "- Quickslots", playerProfile.GetPlayerID()); foreach (ItemData item2 in drop_list2) { Vector2i gridPos = item2.m_gridPos; item2.m_customData["eaqs-qs"] = $"{gridPos.x},{gridPos.y}"; Dbgl($" Quickslot Item Name: {((Object)item2.m_dropPrefab).name} Cat: {item2.m_shared.m_itemType}"); } break; case 2: component.Setup(playerProfile.GetName() + "- Eqipment", playerProfile.GetPlayerID()); foreach (ItemData item3 in drop_list2) { item3.m_customData["eaqs-e"] = "1"; Dbgl($" Eqipment Item Name: {((Object)item3.m_dropPrefab).name} Cat: {item3.m_shared.m_itemType}"); } break; } Traverse.Create((object)val5.GetComponent<Container>().GetInventory()).Field("m_inventory").SetValue((object)drop_list2); Traverse.Create((object)val5.GetComponent<Container>().GetInventory()).Method("Changed", Array.Empty<object>()).GetValue(); continue; } Dbgl(" !! dropItems.Any"); foreach (ItemData item4 in drop_list2) { Dbgl(" Item : " + ((Object)item4.m_dropPrefab).name); Vector3 val6 = ((Component)__instance).transform.position + Vector3.up * 0.5f + Random.insideUnitSphere * 0.3f; Quaternion val7 = Quaternion.Euler(0f, (float)Random.Range(0, 360), 0f); ItemDrop.DropItem(item4, 0, val6, val7); } } if (!keepFoodLevels.Value) { ___m_foods.Clear(); } bool flag = noSkillProtection.Value || ___m_timeSinceDeath > ___m_hardDeathCooldown; if (flag && reduceSkills.Value) { ___m_skills.LowerAllSkills(skillReduceFactor.Value); } ___m_seman.RemoveAllStatusEffects(false); Game.instance.RequestRespawn(10f, false); ___m_timeSinceDeath = 0f; if (!flag) { ((Character)__instance).Message((MessageType)1, "$msg_softdeath", 0, (Sprite)null); } ((Character)__instance).Message((MessageType)2, "$msg_youdied", 0, (Sprite)null); __instance.ShowTutorial("death", false); Minimap.instance.AddPin(((Component)__instance).transform.position, (PinType)4, $"$hud_mapday {EnvMan.instance.GetDay(ZNet.instance.GetTimeSeconds())}", true, false, 0L, default(PlatformUserID)); if (((Character)__instance).m_onDeath != null) { ((Character)__instance).m_onDeath(); } Biome currentBiome = __instance.GetCurrentBiome(); string text = "biome:" + ((object)(Biome)(ref currentBiome)).ToString(); Gogan.LogEvent("Game", "Death", text, 0L); return false; } } [HarmonyPatch(typeof(Player), "HardDeath")] public static class HardDeath_Patch { public static bool Prefix(ref bool __result) { if (!modEnabled.Value || !noSkillProtection.Value) { return true; } __result = true; return false; } } [HarmonyPatch(typeof(Game), "FindSpawnPoint")] public static class FindSpawnPoint_Patch { public static bool Prefix(ref Vector3 point, ref bool usedLogoutPoint, bool ___m_firstSpawn, ref bool __result) { //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_010c: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: 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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_0137: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Unknown result type (might be due to invalid IL or missing references) if (!modEnabled.Value || ___m_firstSpawn) { return true; } if (spawnAtStart.Value) { usedLogoutPoint = false; Vector3 val = default(Vector3); if (ZoneSystem.instance.GetLocationIcon(Game.instance.m_StartLocation, ref val)) { point = val + Vector3.up * 2f; ZNet.instance.SetReferencePosition(point); __result = ZNetScene.instance.IsAreaReady(point); if (__result) { Dbgl($"respawning at start: {point}"); } } else { Dbgl("start point not found"); ZNet.instance.SetReferencePosition(Vector3.zero); point = Vector3.zero; __result = false; } return false; } if (useFixedSpawnCoordinates.Value) { usedLogoutPoint = false; point = fixedSpawnCoordinates.Value; ZNet.instance.SetReferencePosition(point); __result = ZNetScene.instance.IsAreaReady(point); if (__result) { Dbgl($"respawning at custom point {point}"); } return false; } return true; } } [HarmonyPatch(typeof(Skills), "OnDeath")] public static class Skills_OnDeath_Patch { public static bool Prefix() { if (!modEnabled.Value) { return true; } return reduceSkills.Value; } } [HarmonyPatch(typeof(Terminal), "InputText")] public static class InputText_Patch { public static bool Prefix(Terminal __instance) { if (!modEnabled.Value) { return true; } string text = ((TMP_InputField)__instance.m_input).text; if (text.ToLower().Equals(typeof(BepInExPlugin).Namespace.ToLower() + " reset")) { ((BaseUnityPlugin)context).Config.Reload(); ((BaseUnityPlugin)context).Config.Save(); __instance.AddString(text); __instance.AddString(((BaseUnityPlugin)context).Info.Metadata.Name + " config reloaded"); return false; } return true; } } public static ConfigEntry<bool> modEnabled; public static ConfigEntry<bool> isDebug; public static ConfigEntry<int> nexusID; public static ConfigEntry<bool> keepEquippedItems; public static ConfigEntry<bool> keepHotbarItems; public static ConfigEntry<bool> keepAllItems; public static ConfigEntry<bool> destroyAllItems; public static ConfigEntry<bool> useTombStone; public static ConfigEntry<bool> keepFoodLevels; public static ConfigEntry<bool> keepQuickSlotItems; public static ConfigEntry<bool> keepTeleportableItems; public static ConfigEntry<bool> createDeathEffects; public static ConfigEntry<bool> reduceSkills; public static ConfigEntry<bool> noSkillProtection; public static ConfigEntry<bool> useFixedSpawnCoordinates; public static ConfigEntry<bool> spawnAtStart; public static ConfigEntry<Vector3> fixedSpawnCoordinates; public static ConfigEntry<float> skillReduceFactor; public static ConfigEntry<string> keepItemTypes; public static ConfigEntry<string> dropItemTypes; public static ConfigEntry<string> destroyItemTypes; public static ConfigEntry<string> keepItemNames; public static ConfigEntry<string> dropItemNames; public static ConfigEntry<string> destroyItemNames; public static BepInExPlugin context; public static List<string> typeEnums = new List<string>(); public static Assembly quickSlotsAssembly; public static void Dbgl(string str = "", bool pref = true) { if (isDebug.Value) { Debug.Log((object)((pref ? (typeof(BepInExPlugin).Namespace + " ") : "") + str)); } } public void Awake() { //IL_0351: Unknown result type (might be due to invalid IL or missing references) foreach (int value in Enum.GetValues(typeof(ItemType))) { typeEnums.Add(Enum.GetName(typeof(ItemType), value)); } context = this; modEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Enabled", true, "Enable this mod"); isDebug = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "IsDebug", true, "Enable debug logs"); nexusID = ((BaseUnityPlugin)this).Config.Bind<int>("General", "NexusID", 1068, "Nexus mod ID for updates"); keepItemTypes = ((BaseUnityPlugin)this).Config.Bind<string>("ItemLists", "KeepItemTypes", "", "List of items to keep (comma-separated). Leave empty if using DropItemTypes. Valid types: " + string.Join(",", typeEnums)); dropItemTypes = ((BaseUnityPlugin)this).Config.Bind<string>("ItemLists", "DropItemTypes", "", "List of items to drop (comma-separated). Leave empty if using KeepItemTypes. Valid types: " + string.Join(",", typeEnums)); destroyItemTypes = ((BaseUnityPlugin)this).Config.Bind<string>("ItemLists", "DestroyItemTypes", "", "List of items to destroy (comma-separated). Overrides other lists. Valid types: " + string.Join(",", typeEnums)); keepItemNames = ((BaseUnityPlugin)this).Config.Bind<string>("ItemLists", "KeepItems", "", "List of items to keep (comma-separated). Use Item names, for example: Iron,IronScrap,BronzeOre"); dropItemNames = ((BaseUnityPlugin)this).Config.Bind<string>("ItemLists", "DropItems", "", "List of items to drop (comma-separated). Use Item names, for example: Iron,IronScrap,BronzeOre"); destroyItemNames = ((BaseUnityPlugin)this).Config.Bind<string>("ItemLists", "DestroyItems", "", "List of items to destroy (comma-separated). Overrides other lists. Use Item names, for example: Iron,IronScrap,BronzeOre"); keepAllItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "KeepAllItems", false, "Overrides all other item options if true."); destroyAllItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "DestroyAllItems", false, "Overrides all other item options except KeepAllItems if true."); keepEquippedItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "KeepEquippedItems", false, "Overrides item lists if true."); keepTeleportableItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "KeepTeleportableItems", false, "Doesn't override item lists."); keepHotbarItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "KeepHotbarItems", false, "Overrides item lists if true."); useTombStone = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "UseTombStone", true, "Use tombstone (if false, drops items on ground)."); createDeathEffects = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "CreateDeathEffects", true, "Create death effects."); keepFoodLevels = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "KeepFoodLevels", false, "Keep food levels."); keepQuickSlotItems = ((BaseUnityPlugin)this).Config.Bind<bool>("Toggles", "KeepQuickSlotItems", false, "Keep QuickSlot items."); useFixedSpawnCoordinates = ((BaseUnityPlugin)this).Config.Bind<bool>("Spawn", "UseFixedSpawnCoordinates", false, "Use fixed spawn coordinates."); spawnAtStart = ((BaseUnityPlugin)this).Config.Bind<bool>("Spawn", "SpawnAtStart", false, "Respawn at start location."); fixedSpawnCoordinates = ((BaseUnityPlugin)this).Config.Bind<Vector3>("Spawn", "FixedSpawnCoordinates", Vector3.zero, "Fixed spawn coordinates."); noSkillProtection = ((BaseUnityPlugin)this).Config.Bind<bool>("Skills", "NoSkillProtection", false, "Prevents skill protection after death."); reduceSkills = ((BaseUnityPlugin)this).Config.Bind<bool>("Skills", "ReduceSkills", true, "Reduce skills."); skillReduceFactor = ((BaseUnityPlugin)this).Config.Bind<float>("Skills", "SkillReduceFactor", 0.25f, "Reduce skills by this fraction."); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), (string)null); } public void Start() { if (Chainloader.PluginInfos.ContainsKey("randyknapp.mods.equipmentandquickslots")) { quickSlotsAssembly = ((object)Chainloader.PluginInfos["randyknapp.mods.equipmentandquickslots"].Instance).GetType().Assembly; } } }