using 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.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("TrophyEater")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("TrophyEater")] [assembly: AssemblyTitle("TrophyEater")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace TrophyEater { public class ConfigurationManagerAttributes { public int? Order; } [BepInPlugin("Harchytek.TrophyEater", "TrophyEater", "1.0.0")] public class TrophyEaterPlugin : BaseUnityPlugin { public enum SkillChoice { Random, Axes, Blocking, Bows, Clubs, Crossbows, Knives, Polearms, Spears, Swords, Unarmed, BloodMagic, ElementalMagic, Pickaxes, WoodCutting, Farming, Fishing, Crafting, Cooking, Dodge, Jump, Ride, Run, Sneak, Swim } public class TrophySettings { public ConfigEntry Points; public ConfigEntry Skill; public ConfigEntry Duration; } public const string ModGUID = "Harchytek.TrophyEater"; public const string ModName = "TrophyEater"; public const string ModVersion = "1.0.0"; private readonly Harmony harmony = new Harmony("Harchytek.TrophyEater"); public static Dictionary TrophyConfigs = new Dictionary(); public static ConfigEntry EnableBossCategory; public static ConfigEntry EnableBossSummoningCategory; public static readonly string[] BossItems = new string[7] { "TrophyEikthyr", "TrophyTheElder", "TrophyBonemass", "TrophyDragonQueen", "TrophyGoblinKing", "TrophySeekerQueen", "TrophyFader" }; public static readonly string[] BossSummoningItems = new string[7] { "TrophyDeer", "AncientSeed", "WitheredBone", "DragonEgg", "GoblinTotem", "DvergrKeyFragment", "BellFragment" }; public static Dictionary ItemToPower = new Dictionary { { "TrophyEikthyr", "GP_Eikthyr" }, { "TrophyTheElder", "GP_TheElder" }, { "TrophyBonemass", "GP_Bonemass" }, { "TrophyDragonQueen", "GP_Moder" }, { "TrophyGoblinKing", "GP_Yagluth" }, { "TrophySeekerQueen", "GP_Queen" }, { "TrophyFader", "GP_Fader" }, { "TrophyDeer", "GP_Eikthyr" }, { "AncientSeed", "GP_TheElder" }, { "WitheredBone", "GP_Bonemass" }, { "DragonEgg", "GP_Moder" }, { "GoblinTotem", "GP_Yagluth" }, { "DvergrKeyFragment", "GP_Queen" }, { "BellFragment", "GP_Fader" } }; public static Dictionary PowerTranslations = new Dictionary { { "GP_Eikthyr", "Eikthyr" }, { "GP_TheElder", "The Elder" }, { "GP_Bonemass", "Bonemass" }, { "GP_Moder", "Moder" }, { "GP_Yagluth", "Yagluth" }, { "GP_Queen", "The Queen" }, { "GP_Fader", "Fader" } }; private void Awake() { SetupTrophies(); harmony.PatchAll(); } private void SetupTrophies() { //IL_071c: Unknown result type (might be due to invalid IL or missing references) //IL_0726: Expected O, but got Unknown //IL_0775: Unknown result type (might be due to invalid IL or missing references) //IL_077f: Expected O, but got Unknown //IL_0929: Unknown result type (might be due to invalid IL or missing references) //IL_0933: Expected O, but got Unknown //IL_0973: Unknown result type (might be due to invalid IL or missing references) //IL_097d: Expected O, but got Unknown //IL_0844: Unknown result type (might be due to invalid IL or missing references) //IL_084e: Expected O, but got Unknown //IL_088f: Unknown result type (might be due to invalid IL or missing references) //IL_0899: Expected O, but got Unknown //IL_08d9: Unknown result type (might be due to invalid IL or missing references) //IL_08e3: Expected O, but got Unknown int num = 10000; Dictionary dictionary = new Dictionary { { "TrophyBoar", 4f }, { "TrophyDeer", 8f }, { "TrophyNeck", 10f }, { "TrophySerpent", 150f }, { "TrophyEikthyr", 100f }, { "TrophyGreydwarf", 5f }, { "TrophyGreydwarfBrute", 25f }, { "TrophyGreydwarfShaman", 15f }, { "TrophySkeletonPoison", 25f }, { "TrophySkeleton", 10f }, { "TrophyGhost", 20f }, { "TrophyFrostTroll", 30f }, { "TrophyBjorn", 40f }, { "TrophySkeletonHildir", 100f }, { "TrophyTheElder", 200f }, { "TrophyAbomination", 150f }, { "TrophyBlob", 20f }, { "TrophyDraugr", 20f }, { "TrophyDraugrElite", 30f }, { "TrophyLeech", 25f }, { "TrophySurtling", 25f }, { "TrophyWraith", 30f }, { "TrophyKvastur", 60f }, { "TrophyBonemass", 300f }, { "TrophyCultist", 50f }, { "TrophyHatchling", 40f }, { "TrophyFenring", 40f }, { "TrophySGolem", 50f }, { "TrophyUlv", 50f }, { "TrophyWolf", 35f }, { "TrophyCultist_Hildir", 300f }, { "TrophyDragonQueen", 400f }, { "TrophyDeathsquito", 80f }, { "TrophyGoblin", 50f }, { "TrophyGoblinBrute", 70f }, { "TrophyGoblinShaman", 50f }, { "TrophyGrowth", 50f }, { "TrophyLox", 100f }, { "TrophyBjornUndead", 150f }, { "TrophyGoblinBruteBrosShaman", 400f }, { "TrophyGoblinBruteBrosBrute", 400f }, { "TrophyGoblinKing", 500f }, { "TrophyDvergr", 300f }, { "TrophyHare", 50f }, { "TrophyGjall", 100f }, { "TrophySeeker", 80f }, { "TrophySeekerBrute", 110f }, { "TrophyTick", 70f }, { "TrophySeekerQueen", 600f }, { "TrophyAsksvin", 120f }, { "TrophyBonemawSerpent", 250f }, { "TrophyFallenValkyrie", 200f }, { "TrophyCharredArcher", 110f }, { "TrophyMorgen", 200f }, { "TrophyVolture", 80f }, { "TrophyCharredMage", 120f }, { "TrophyCharredMelee", 300f }, { "TrophyFader", 700f }, { "AncientSeed", 25f }, { "WitheredBone", 30f }, { "DragonEgg", 100f }, { "GoblinTotem", 70f }, { "DvergrKeyFragment", 100f }, { "BellFragment", 120f } }; Dictionary dictionary2 = new Dictionary { { "TrophyDeer", 120f }, { "AncientSeed", 120f }, { "WitheredBone", 120f }, { "DragonEgg", 300f }, { "GoblinTotem", 120f }, { "DvergrKeyFragment", 120f }, { "BellFragment", 120f } }; Dictionary dictionary3 = new Dictionary(); dictionary3.Add("Meadows", new string[3] { "TrophyBoar", "TrophyNeck", "TrophySerpent" }); dictionary3.Add("BlackForest", new string[9] { "TrophyGreydwarf", "TrophyGreydwarfBrute", "TrophyGreydwarfShaman", "TrophySkeletonPoison", "TrophySkeleton", "TrophyGhost", "TrophyFrostTroll", "TrophyBjorn", "TrophySkeletonHildir" }); dictionary3.Add("Swamp", new string[8] { "TrophyAbomination", "TrophyBlob", "TrophyDraugr", "TrophyDraugrElite", "TrophyLeech", "TrophySurtling", "TrophyWraith", "TrophyKvastur" }); dictionary3.Add("Mountains", new string[7] { "TrophyCultist", "TrophyHatchling", "TrophyFenring", "TrophySGolem", "TrophyUlv", "TrophyWolf", "TrophyCultist_Hildir" }); dictionary3.Add("Plains", new string[9] { "TrophyDeathsquito", "TrophyGoblin", "TrophyGoblinBrute", "TrophyGoblinShaman", "TrophyGrowth", "TrophyLox", "TrophyBjornUndead", "TrophyGoblinBruteBrosShaman", "TrophyGoblinBruteBrosBrute" }); dictionary3.Add("Mistlands", new string[6] { "TrophyDvergr", "TrophyHare", "TrophyGjall", "TrophySeeker", "TrophySeekerBrute", "TrophyTick" }); dictionary3.Add("Ashlands", new string[8] { "TrophyAsksvin", "TrophyBonemawSerpent", "TrophyFallenValkyrie", "TrophyCharredArcher", "TrophyMorgen", "TrophyVolture", "TrophyCharredMage", "TrophyCharredMelee" }); dictionary3.Add("Bosses", BossItems); dictionary3.Add("Boss Summoning", BossSummoningItems); Dictionary dictionary4 = dictionary3; foreach (KeyValuePair item in dictionary4) { if (item.Key == "Bosses") { EnableBossCategory = ((BaseUnityPlugin)this).Config.Bind("Bosses", "Enable Bosses Category", true, new ConfigDescription("Enable or disable the entire Bosses category.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); } else if (item.Key == "Boss Summoning") { EnableBossSummoningCategory = ((BaseUnityPlugin)this).Config.Bind("Boss Summoning", "Enable Boss Summoning Category", true, new ConfigDescription("Enable or disable the entire Boss Summoning category.", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); } string[] value = item.Value; foreach (string text in value) { float num2 = (dictionary.ContainsKey(text) ? dictionary[text] : 1f); bool flag = item.Key == "Bosses" || dictionary2.ContainsKey(text); ConfigEntry duration = null; ConfigEntry points; ConfigEntry skill; if (flag) { float num3 = ((item.Key == "Bosses") ? 300f : dictionary2[text]); duration = ((BaseUnityPlugin)this).Config.Bind(item.Key, text + "_Duration", num3, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); points = ((BaseUnityPlugin)this).Config.Bind(item.Key, text + "_Points", num2, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); skill = ((BaseUnityPlugin)this).Config.Bind(item.Key, text + "_Skill", SkillChoice.Random, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); } else { points = ((BaseUnityPlugin)this).Config.Bind(item.Key, text + "_Points", num2, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); skill = ((BaseUnityPlugin)this).Config.Bind(item.Key, text + "_Skill", SkillChoice.Random, new ConfigDescription("", (AcceptableValueBase)null, new object[1] { new ConfigurationManagerAttributes { Order = num-- } })); } TrophyConfigs[text] = new TrophySettings { Points = points, Skill = skill, Duration = duration }; } } } public static SkillType GetSkillType(SkillChoice choice) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) if (choice == SkillChoice.Random) { SkillType[] array = (from SkillType s in Enum.GetValues(typeof(SkillType)) where (int)s > 0 && (int)s < 999 select s).ToArray(); return array[Random.Range(0, array.Length)]; } if (!Enum.TryParse(choice.ToString(), out SkillType result)) { return (SkillType)1; } return result; } public static string GetTranslation(string key, params object[] args) { string selectedLanguage = Localization.instance.GetSelectedLanguage(); string format = ""; if (selectedLanguage == "French") { switch (key) { case "TooltipPoints": format = "\nAjoute {0} points pour {1} skill."; break; case "TooltipPower": format = "\nAccorde le buff {0} pour {1} sec."; break; case "MessageSkill": format = "Vous augmentez {0} points de compétence pour {1}"; break; } } else { switch (key) { case "TooltipPoints": format = "\nAdds {0} points to {1} skill."; break; case "TooltipPower": format = "\nGrants {0} power for {1} sec."; break; case "MessageSkill": format = "You increase {0} skill points to {1}"; break; } } return string.Format(format, args); } } [HarmonyPatch(typeof(ObjectDB), "Awake")] public static class MakeConsumablePatch { private static void Postfix(ObjectDB __instance) { //IL_00c0: Unknown result type (might be due to invalid IL or missing references) ItemDrop val = default(ItemDrop); foreach (KeyValuePair trophyConfig in TrophyEaterPlugin.TrophyConfigs) { string key = trophyConfig.Key; if ((TrophyEaterPlugin.BossItems.Contains(key) && !TrophyEaterPlugin.EnableBossCategory.Value) || (TrophyEaterPlugin.BossSummoningItems.Contains(key) && !TrophyEaterPlugin.EnableBossSummoningCategory.Value)) { continue; } TrophyEaterPlugin.TrophySettings value = trophyConfig.Value; bool flag = value.Points.Value > 0f; bool flag2 = value.Duration != null && value.Duration.Value > 0f; if (flag || flag2) { GameObject itemPrefab = __instance.GetItemPrefab(key); if (itemPrefab != null && itemPrefab.TryGetComponent(ref val)) { val.m_itemData.m_shared.m_itemType = (ItemType)2; val.m_itemData.m_shared.m_food = 0f; } } } } } [HarmonyPatch] public static class TooltipPatch { [HarmonyTargetMethod] private static MethodBase TargetMethod() { return typeof(ItemData).GetMethods().First((MethodInfo m) => m.Name == "GetTooltip" && m.GetParameters().Length >= 1); } private static void Postfix(ItemData __instance, ref string __result) { if ((Object)(object)__instance?.m_dropPrefab == (Object)null || !TrophyEaterPlugin.TrophyConfigs.ContainsKey(((Object)__instance.m_dropPrefab).name)) { return; } string name = ((Object)__instance.m_dropPrefab).name; if ((!TrophyEaterPlugin.BossItems.Contains(name) || TrophyEaterPlugin.EnableBossCategory.Value) && (!TrophyEaterPlugin.BossSummoningItems.Contains(name) || TrophyEaterPlugin.EnableBossSummoningCategory.Value)) { TrophyEaterPlugin.TrophySettings trophySettings = TrophyEaterPlugin.TrophyConfigs[name]; if (trophySettings.Points.Value > 0f) { __result += TrophyEaterPlugin.GetTranslation("TooltipPoints", trophySettings.Points.Value, trophySettings.Skill.Value); } if (trophySettings.Duration != null && trophySettings.Duration.Value > 0f && TrophyEaterPlugin.ItemToPower.TryGetValue(name, out var value)) { string text = (TrophyEaterPlugin.PowerTranslations.ContainsKey(value) ? TrophyEaterPlugin.PowerTranslations[value] : value); __result += TrophyEaterPlugin.GetTranslation("TooltipPower", text, trophySettings.Duration.Value); } } } } [HarmonyPatch(typeof(Player), "ConsumeItem")] public static class ConsumePatch { private static void Postfix(Player __instance, ItemData item, ref bool __result) { //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) if (!__result || (Object)(object)item?.m_dropPrefab == (Object)null || !TrophyEaterPlugin.TrophyConfigs.ContainsKey(((Object)item.m_dropPrefab).name)) { return; } string name = ((Object)item.m_dropPrefab).name; if ((TrophyEaterPlugin.BossItems.Contains(name) && !TrophyEaterPlugin.EnableBossCategory.Value) || (TrophyEaterPlugin.BossSummoningItems.Contains(name) && !TrophyEaterPlugin.EnableBossSummoningCategory.Value)) { return; } TrophyEaterPlugin.TrophySettings trophySettings = TrophyEaterPlugin.TrophyConfigs[name]; if (trophySettings.Points.Value > 0f) { SkillType skillType = TrophyEaterPlugin.GetSkillType(trophySettings.Skill.Value); ((Character)__instance).RaiseSkill(skillType, trophySettings.Points.Value); string translation = TrophyEaterPlugin.GetTranslation("MessageSkill", trophySettings.Points.Value, skillType); ((Character)__instance).Message((MessageType)2, translation, 0, (Sprite)null); } if (trophySettings.Duration == null || !(trophySettings.Duration.Value > 0f)) { return; } if (TrophyEaterPlugin.ItemToPower.TryGetValue(name, out var seName)) { StatusEffect val = ((IEnumerable)ObjectDB.instance.m_StatusEffects).FirstOrDefault((Func)((StatusEffect se) => ((Object)se).name == seName)); if ((Object)(object)val != (Object)null) { StatusEffect val2 = Object.Instantiate(val); val2.m_ttl = trophySettings.Duration.Value; ((Character)__instance).GetSEMan().AddStatusEffect(val2, true, 0, 0f); } } } } }