Please disclose if any significant portion of your mod was created 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 FeedFromHand v1.2.0
FeedFromHand.dll
Decompiled 2 years agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("FeedFromHand")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("FeedFromHand")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("a99fd3be-c055-4c36-8bb4-1b81a1ee7df9")] [assembly: AssemblyFileVersion("1.2.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.2.0.0")] [module: UnverifiableCode] namespace FeedFromHand; [BepInPlugin("org.bepinex.plugins.feedfromhand", "FeedFromHand", "1.2.0")] [BepInProcess("valheim.exe")] public class FeedFromHand : BaseUnityPlugin { [HarmonyPatch] internal class FeedFromHand_Patch { [HarmonyPatch(typeof(Humanoid), "UseItem")] public static class Humanoid_UseItem_Prefix_Patch { public static bool Prefix(Humanoid __instance, ItemData item) { //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Invalid comparison between Unknown and I4 //IL_016b: Unknown result type (might be due to invalid IL or missing references) GameObject hoverObject = __instance.GetHoverObject(); if ((Object)(object)hoverObject == (Object)null) { return true; } if (!Object.op_Implicit((Object)(object)hoverObject.GetComponent<MonsterAI>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Character>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Tameable>()) && !Object.op_Implicit((Object)(object)hoverObject.GetComponent<Humanoid>())) { return true; } MonsterAI component = hoverObject.GetComponent<MonsterAI>(); Character component2 = hoverObject.GetComponent<Character>(); Tameable component3 = hoverObject.GetComponent<Tameable>(); Humanoid component4 = hoverObject.GetComponent<Humanoid>(); ZNetView component5 = hoverObject.GetComponent<ZNetView>(); string hoverName = component2.GetHoverName(); if (!component2.IsTamed()) { return true; } if (!component.CanConsume(item)) { if ((int)item.m_shared.m_itemType == 2) { ((Character)__instance).Message((MessageType)2, hoverName + " can't consume " + item.m_shared.m_name + ".", 0, (Sprite)null); return false; } return true; } if (component2.GetHealth() < component2.GetMaxHealth()) { ZDO zDO = component5.GetZDO(); if (!zDO.GetBool("CanConsume", false)) { return false; } component2.Heal((float)HealingReceived, true); component3.Interact(component4, false, false); __instance.DoInteractAnimation(hoverObject.transform.position); if (UseItem) { Inventory inventory = __instance.GetInventory(); inventory.RemoveOneItem(item); } if (SuccessMessage) { ((Character)__instance).Message((MessageType)2, hoverName + " is happy!", 0, (Sprite)null); } zDO.Set("CanConsume", false); return false; } ((Character)__instance).Message((MessageType)2, hoverName + " is already max health.", 0, (Sprite)null); return false; } } [HarmonyPatch(typeof(MonsterAI), "UpdateAI")] public static class MonsterAI_UpdateAI_Prefix_Patch { public static void Prefix(MonsterAI __instance, ref float dt) { Character componentInParent = ((Component)__instance).GetComponentInParent<Character>(); if (componentInParent.IsTamed()) { ZNetView componentInParent2 = ((Component)__instance).GetComponentInParent<ZNetView>(); ZDO zDO = componentInParent2.GetZDO(); float num = zDO.GetFloat("TimeSinceConsumption", 0f) + dt; zDO.Set("TimeSinceConsumption", num); if (num >= Cooldown) { zDO.Set("CanConsume", true); zDO.Set("TimeSinceConsumption", 0f); } } } } public static int HealingReceived = 50; public static float Cooldown = 60f; public static bool UseItem = true; public static bool SuccessMessage = true; } private readonly Harmony harmony = new Harmony("org.bepinex.plugins.feedfromhand"); private ConfigEntry<int> HealingReceived; private ConfigEntry<float> Cooldown; private ConfigEntry<bool> UseItem; private ConfigEntry<bool> SuccessMessage; private void Awake() { harmony.PatchAll(); HealingReceived = ((BaseUnityPlugin)this).Config.Bind<int>("FeedFromHand", "HealingReceived", FeedFromHand_Patch.HealingReceived, "Amount that is healed upon consuming item"); Cooldown = ((BaseUnityPlugin)this).Config.Bind<float>("FeedFromHand", "Cooldown", FeedFromHand_Patch.Cooldown, "Feeding cooldown"); UseItem = ((BaseUnityPlugin)this).Config.Bind<bool>("FeedFromHand", "UseItem", FeedFromHand_Patch.UseItem, "Whether or not item is removed from inventory when item is consumed"); SuccessMessage = ((BaseUnityPlugin)this).Config.Bind<bool>("FeedFromHand", "SuccessMessage", FeedFromHand_Patch.SuccessMessage, "Whether or not success message (Wolf is Happy!) is shown when item is consumed"); HealingReceived.SettingChanged += HealingReceived_SettingChanged; Cooldown.SettingChanged += Cooldown_SettingChanged; UseItem.SettingChanged += UseItem_SettingChanged; SuccessMessage.SettingChanged += SuccessMessage_SettingChanged; SettingsChanged(); } private void SettingsChanged() { HealingReceived_SettingChanged(null, null); Cooldown_SettingChanged(null, null); UseItem_SettingChanged(null, null); SuccessMessage_SettingChanged(null, null); } private void HealingReceived_SettingChanged(object sender, EventArgs e) { FeedFromHand_Patch.HealingReceived = HealingReceived.Value; } private void Cooldown_SettingChanged(object sender, EventArgs e) { FeedFromHand_Patch.Cooldown = Cooldown.Value; } private void UseItem_SettingChanged(object sender, EventArgs e) { FeedFromHand_Patch.UseItem = UseItem.Value; } private void SuccessMessage_SettingChanged(object sender, EventArgs e) { FeedFromHand_Patch.SuccessMessage = SuccessMessage.Value; } }