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 PettableVikings v1.0.0
PettableVikings.dll
Decompiled 4 days agousing System; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; 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("PettableVikings")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("PettableVikings")] [assembly: AssemblyTitle("PettableVikings")] [assembly: AssemblyVersion("1.0.0.0")] namespace PettableVikings; [BepInPlugin("com.valheim.pettablevikings", "Pettable Vikings", "1.0.0")] public class PettableVikingsPlugin : BaseUnityPlugin { private const string ModGUID = "com.valheim.pettablevikings"; private const string ModName = "Pettable Vikings"; private const string ModVersion = "1.0.0"; public static ConfigEntry<bool> ModEnabled; public static ConfigEntry<string> HoverText; public static ConfigEntry<string> InteractionMessage; public static ConfigEntry<float> InteractionDistance; public static ConfigEntry<float> CooldownTimer; public static ConfigEntry<bool> ShowHearts; public static ConfigEntry<bool> PlaySound; private void Awake() { //IL_0102: Unknown result type (might be due to invalid IL or missing references) ModEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("1 - General", "1_Enabled", true, "Enable the mod."); HoverText = ((BaseUnityPlugin)this).Config.Bind<string>("1 - General", "2_HoverText", "Pet @viking", "Text shown on the crosshair. Use @viking to insert the player's name."); InteractionMessage = ((BaseUnityPlugin)this).Config.Bind<string>("1 - General", "3_Message", "@viking loves you", "Text displayed after a successful pet. Use @viking to insert the player's name."); InteractionDistance = ((BaseUnityPlugin)this).Config.Bind<float>("1 - General", "4_Distance", 2f, "Maximum distance in meters to allow petting."); CooldownTimer = ((BaseUnityPlugin)this).Config.Bind<float>("1 - General", "5_Cooldown", 1f, "Seconds to wait before you can pet someone again."); ShowHearts = ((BaseUnityPlugin)this).Config.Bind<bool>("2 - Visuals & Audio", "1_ShowHearts", true, "Show the pink hearts effect when petting."); PlaySound = ((BaseUnityPlugin)this).Config.Bind<bool>("2 - Visuals & Audio", "2_PlaySound", true, "Play the default love sound when petting."); if (ModEnabled.Value) { new Harmony("com.valheim.pettablevikings").PatchAll(); } } } [HarmonyPatch(typeof(Player), "Awake")] public static class Player_Awake_Patch { public static void Postfix(Player __instance) { ((Component)__instance).gameObject.AddComponent<PettableComponent>(); } } [HarmonyPatch(typeof(Player), "GetHoverText")] public static class Player_GetHoverText_Patch { public static void Postfix(Player __instance, ref string __result) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) if (PettableVikingsPlugin.ModEnabled.Value && !((Object)(object)__instance == (Object)(object)Player.m_localPlayer) && !((Character)__instance).IsDead() && !(Vector3.Distance(((Component)Player.m_localPlayer).transform.position, ((Component)__instance).transform.position) > PettableVikingsPlugin.InteractionDistance.Value)) { string text = PettableVikingsPlugin.HoverText.Value.Replace("@viking", __instance.GetPlayerName()); string text2 = Localization.instance.Localize("\n[<color=yellow><b>$KEY_Use</b></color>] " + text); __result += text2; } } } public class PettableComponent : MonoBehaviour, Interactable { private Player _thisPlayer; private ZNetView _nview; private float _lastPetTime; private void Awake() { _thisPlayer = ((Component)this).GetComponent<Player>(); _nview = ((Component)this).GetComponent<ZNetView>(); if ((Object)(object)_nview != (Object)null && _nview.IsValid()) { _nview.Register("PetVFX", (Action<long>)RPC_PetVFX); } } public bool Interact(Humanoid user, bool hold, bool alt) { //IL_0031: 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) if (!PettableVikingsPlugin.ModEnabled.Value) { return false; } if (hold || alt || (Object)(object)_thisPlayer == (Object)(object)Player.m_localPlayer) { return false; } if (Vector3.Distance(((Component)Player.m_localPlayer).transform.position, ((Component)_thisPlayer).transform.position) > PettableVikingsPlugin.InteractionDistance.Value) { return false; } if (Time.time - _lastPetTime < PettableVikingsPlugin.CooldownTimer.Value) { return false; } _lastPetTime = Time.time; Animator component = ((Component)user).GetComponent<Animator>(); if (component != null) { component.SetTrigger("interact"); } string text = PettableVikingsPlugin.InteractionMessage.Value.Replace("@viking", _thisPlayer.GetPlayerName()); MessageHud.instance.ShowMessage((MessageType)2, text, 0, (Sprite)null, false); if ((Object)(object)_nview != (Object)null && _nview.IsValid()) { _nview.InvokeRPC(ZNetView.Everybody, "PetVFX", Array.Empty<object>()); } return true; } public bool UseItem(Humanoid user, ItemData item) { return false; } private void RPC_PetVFX(long sender) { //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) if (!PettableVikingsPlugin.ShowHearts.Value && !PettableVikingsPlugin.PlaySound.Value) { return; } GameObject prefab = ZNetScene.instance.GetPrefab("Boar"); if (!((Object)(object)prefab != (Object)null)) { return; } Tameable component = prefab.GetComponent<Tameable>(); if (!((Object)(object)component != (Object)null) || component.m_petEffect == null) { return; } EffectData[] effectPrefabs = component.m_petEffect.m_effectPrefabs; foreach (EffectData val in effectPrefabs) { if (!((Object)(object)val.m_prefab != (Object)null)) { continue; } GameObject val2 = Object.Instantiate<GameObject>(val.m_prefab, ((Character)_thisPlayer).GetTopPoint(), Quaternion.identity); if (!PettableVikingsPlugin.PlaySound.Value) { ZSFX[] componentsInChildren = val2.GetComponentsInChildren<ZSFX>(); for (int j = 0; j < componentsInChildren.Length; j++) { Object.Destroy((Object)(object)componentsInChildren[j]); } AudioSource[] componentsInChildren2 = val2.GetComponentsInChildren<AudioSource>(); for (int j = 0; j < componentsInChildren2.Length; j++) { Object.Destroy((Object)(object)componentsInChildren2[j]); } } if (!PettableVikingsPlugin.ShowHearts.Value) { ParticleSystem[] componentsInChildren3 = val2.GetComponentsInChildren<ParticleSystem>(); for (int j = 0; j < componentsInChildren3.Length; j++) { Object.Destroy((Object)(object)componentsInChildren3[j]); } } } } }