Decompiled source of AsksvinImproved v1.0.11

AsksvinImproved.dll

Decompiled 3 months ago
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 BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("AsksvinImproved")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("Azumatt")]
[assembly: AssemblyProduct("AsksvinImproved")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")]
[assembly: AssemblyFileVersion("1.0.11")]
[assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.11.0")]
[module: UnverifiableCode]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
namespace AsksvinImproved
{
	[BepInPlugin("Azumatt.AsksvinImproved", "AsksvinImproved", "1.0.11")]
	public class AsksvinImprovedPlugin : BaseUnityPlugin
	{
		internal const string ModName = "AsksvinImproved";

		internal const string ModVersion = "1.0.11";

		internal const string Author = "Azumatt";

		private const string ModGUID = "Azumatt.AsksvinImproved";

		private readonly Harmony _harmony = new Harmony("Azumatt.AsksvinImproved");

		public static readonly ManualLogSource AsksvinImprovedLogger = Logger.CreateLogSource("AsksvinImproved");

		public static Sprite? AsksvinSprite = null;

		public const string TrophyFab = "TrophyAsksvin";

		public const string Fab = "Asksvin";

		public void Awake()
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			_harmony.PatchAll(executingAssembly);
		}

		public static void LogIfDebug(string message)
		{
		}
	}
	[HarmonyPatch(typeof(ObjectDB), "Awake")]
	internal static class ObjectDBAwakePatch
	{
		private static void Postfix(ObjectDB __instance)
		{
			if (!((Object)(object)__instance.GetItemPrefab("TrophyAsksvin") == (Object)null))
			{
				AsksvinImprovedPlugin.AsksvinSprite = __instance.GetItemPrefab("TrophyAsksvin").GetComponent<ItemDrop>().m_itemData.m_shared.m_icons[0];
			}
		}
	}
	[HarmonyPatch(typeof(Minimap), "UpdateEventPin")]
	public static class UpdateEventPinPatch
	{
		public static void Postfix(Minimap __instance)
		{
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_01da: Invalid comparison between Unknown and I4
			//IL_022a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0247: Unknown result type (might be due to invalid IL or missing references)
			//IL_0264: Unknown result type (might be due to invalid IL or missing references)
			Minimap __instance2 = __instance;
			if (((ZDOID)(ref PlayerStartDoodadControlPatch.LastHumanoidZDOID)).IsNone())
			{
				return;
			}
			List<Character> source = (from hud in EnemyHud.instance.m_huds.Values
				where (Object)(object)hud.m_character != (Object)null && hud.m_character.IsTamed() && hud.m_character.GetZDOID() == PlayerStartDoodadControlPatch.LastHumanoidZDOID
				select hud.m_character).ToList();
			foreach (Character item in from character in source
				where !(character is Player)
				let flag = __instance2.m_pins.Any((PinData pin) => pin.m_name.Equals($"$hud_tame {character.GetHoverName()} [Health: {character.GetHealth()}]"))
				where !flag
				select character)
			{
				PinData val = __instance2.AddPin(item.GetCenterPoint(), (PinType)8, $"$hud_tame {item.GetHoverName()} [Health: {item.GetHealth()}]", false, false, 0L, "");
				if ((Object)(object)AsksvinImprovedPlugin.AsksvinSprite != (Object)null)
				{
					val.m_icon = AsksvinImprovedPlugin.AsksvinSprite;
				}
				Sadle val2 = null;
				EnemyHud.instance.UpdateHuds(Player.m_localPlayer, val2, Time.deltaTime);
			}
			List<PinData> list = new List<PinData>();
			foreach (PinData pin2 in __instance2.m_pins)
			{
				if ((int)pin2.m_type != 8)
				{
					continue;
				}
				bool flag = false;
				using (IEnumerator<Character> enumerator = source.Where((Character character) => pin2.m_name.Equals($"$hud_tame {character.GetHoverName()} [Health: {character.GetHealth()}]")).GetEnumerator())
				{
					if (enumerator.MoveNext())
					{
						Character current2 = enumerator.Current;
						pin2.m_pos.x = current2.GetCenterPoint().x;
						pin2.m_pos.y = current2.GetCenterPoint().y;
						pin2.m_pos.z = current2.GetCenterPoint().z;
						flag = true;
					}
				}
				if (!flag && ((object)pin2.m_icon).Equals((object?)AsksvinImprovedPlugin.AsksvinSprite))
				{
					AsksvinImprovedPlugin.LogIfDebug("pin to remove: " + pin2.m_name + "::" + ((object)pin2.m_icon)?.ToString() + "::" + (object)pin2.m_iconElement);
					list.Add(pin2);
				}
			}
			if (list.Count > 0)
			{
				AsksvinImprovedPlugin.LogIfDebug("number of pins to remove: " + list.Count);
			}
			foreach (PinData item2 in list)
			{
				__instance2.RemovePin(item2);
				AsksvinImprovedPlugin.LogIfDebug("removing pin for " + item2.m_name);
			}
		}
	}
	[HarmonyPatch(typeof(Player), "StartDoodadControl")]
	internal static class PlayerStartDoodadControlPatch
	{
		public static bool RidingAsksvin;

		public static Humanoid RidingHumanoid;

		public static ZDOID LastHumanoidZDOID;

		private static void Postfix(Player __instance, IDoodadController shipControl)
		{
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: 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)
			AsksvinImprovedPlugin.LogIfDebug("PlayerIsRidingPatch: They are on " + Utils.GetPrefabName(((Object)__instance.m_doodadController.GetControlledComponent().gameObject).name));
			if (Utils.GetPrefabName(((Object)shipControl.GetControlledComponent().gameObject).name) == "Asksvin")
			{
				RidingAsksvin = true;
				RidingHumanoid = ((Component)shipControl.GetControlledComponent().transform).GetComponentInParent<Humanoid>();
				LastHumanoidZDOID = ((Character)RidingHumanoid).GetZDOID();
				AsksvinImprovedPlugin.LogIfDebug($"Player is riding an Asksvin. Humanoid ZDOID: {LastHumanoidZDOID}");
			}
		}
	}
	[HarmonyPatch(typeof(Player), "StopDoodadControl")]
	internal static class PlayerStopDoodadControlPatch
	{
		private static bool Prefix(Player __instance)
		{
			AsksvinImprovedPlugin.LogIfDebug("PlayerStopDoodadControlPatch: Attempting to stop doodad control.");
			if (__instance.m_doodadController == null || !__instance.m_doodadController.IsValid())
			{
				AsksvinImprovedPlugin.LogIfDebug("PlayerStopDoodadControlPatch: Doodad controller is invalid or null.");
				PlayerStartDoodadControlPatch.RidingAsksvin = false;
				PlayerStartDoodadControlPatch.RidingHumanoid = null;
				return true;
			}
			if (PlayerStartDoodadControlPatch.RidingAsksvin)
			{
				return false;
			}
			AsksvinImprovedPlugin.LogIfDebug("PlayerStopDoodadControlPatch: Player is not riding an Asksvin.");
			return true;
		}
	}
	[HarmonyPatch(typeof(Humanoid), "StartAttack")]
	internal static class HumanoidStartAttackPatch
	{
		private static bool Prefix(Humanoid __instance)
		{
			AsksvinImprovedPlugin.LogIfDebug("HumanoidStartAttackPatch: Humanoid " + ((Character)__instance).GetHoverName() + " attempting to start attack.");
			if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer)
			{
				return true;
			}
			AsksvinImprovedPlugin.LogIfDebug($"HumanoidStartAttackPatch: Player is {((Character)Player.m_localPlayer).GetHoverName()} and riding Asksvin: {PlayerStartDoodadControlPatch.RidingAsksvin}");
			if (PlayerStartDoodadControlPatch.RidingAsksvin)
			{
				return Player.m_localPlayer.m_doodadController == null;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(Player), "AttachStop")]
	internal static class PlayerAttachStopPatch
	{
		private static bool Prefix(Player __instance)
		{
			AsksvinImprovedPlugin.LogIfDebug($"PlayerAttachStopPatch: Player is attempting to attach stop. Riding Asksvin: {PlayerStartDoodadControlPatch.RidingAsksvin}");
			return !PlayerStartDoodadControlPatch.RidingAsksvin;
		}
	}
	[HarmonyPatch(typeof(Player), "UpdateDoodadControls")]
	internal static class PlayerUpdateDoodadControlsPatch
	{
		private static void Postfix(Player __instance)
		{
			if (__instance.m_doodadController == null || !__instance.m_doodadController.IsValid() || !PlayerStartDoodadControlPatch.RidingAsksvin)
			{
				return;
			}
			Humanoid ridingHumanoid = PlayerStartDoodadControlPatch.RidingHumanoid;
			if (ridingHumanoid != null && ((Character)ridingHumanoid).GetHealth() <= 0f)
			{
				AsksvinImprovedPlugin.LogIfDebug("PlayerUpdateDoodadControlsPatch: Mount is dead, stopping control.");
				__instance.CustomAttachStop();
				return;
			}
			if (!ZInput.GetButton("Jump") && !ZInput.GetButtonDown("JoyJump"))
			{
				if ((ZInput.GetButtonDown("Use") || ZInput.GetButtonDown("JoyUse")) && !Hud.InRadial())
				{
					GameObject hovering = __instance.m_hovering;
					if ((Object)(object)((hovering != null) ? hovering.GetComponent<Sadle>() : null) == (Object)null)
					{
						goto IL_009c;
					}
				}
				__instance.HandleInput();
				return;
			}
			goto IL_009c;
			IL_009c:
			AsksvinImprovedPlugin.LogIfDebug("PlayerUpdateDoodadControlsPatch: Jump button pressed, stopping control.");
			__instance.CustomAttachStop();
		}
	}
	[HarmonyPatch(typeof(ZNetScene), "Awake")]
	internal static class MakeAsksvinCommandable
	{
		private static void Postfix(ZNetScene __instance)
		{
			if (!((Object)(object)__instance.GetPrefab("Asksvin") == (Object)null))
			{
				__instance.GetPrefab("Asksvin").GetComponent<Tameable>().m_commandable = true;
			}
		}
	}
	public static class PlayerExtensions
	{
		public static void CustomAttachStop(this Player p)
		{
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			if (p.m_sleeping || !p.m_attached)
			{
				return;
			}
			if ((Object)(object)p.m_attachPoint != (Object)null)
			{
				((Component)p).transform.position = p.m_attachPoint.TransformPoint(p.m_detachOffset);
			}
			if (p.m_attachColliders != null)
			{
				Collider[] attachColliders = p.m_attachColliders;
				foreach (Collider val in attachColliders)
				{
					if (Object.op_Implicit((Object)(object)val))
					{
						Physics.IgnoreCollision((Collider)(object)((Character)p).m_collider, val, false);
					}
				}
				p.m_attachColliders = null;
			}
			((Character)p).m_body.useGravity = true;
			p.m_attached = false;
			p.m_attachPoint = null;
			p.m_attachPointCamera = null;
			((Character)p).m_zanim.SetBool(p.m_attachAnimation, false);
			((Character)p).m_nview.GetZDO().Set(ZDOVars.s_inBed, false);
			((Character)p).ResetCloth();
			PlayerStartDoodadControlPatch.RidingAsksvin = false;
			p.StopDoodadControl();
			PlayerStartDoodadControlPatch.RidingHumanoid = null;
		}

		public static void HandleInput(this Player player)
		{
			Player player2 = player;
			ProcessInput((KeyCode)323, 0, "JoyAttack");
			ProcessInput((KeyCode)324, 1, "JoyBlock");
			ProcessInput((KeyCode)325, 2, "JoySecondaryAttack");
			void ProcessInput(KeyCode key, int weaponIndex, string controllerButton = "")
			{
				//IL_0009: Unknown result type (might be due to invalid IL or missing references)
				bool flag = false;
				flag = (ZInput.IsGamepadActive() ? ZInput.GetButtonDown(controllerButton) : Input.GetKeyDown(key));
				if (Object.op_Implicit((Object)(object)PlayerStartDoodadControlPatch.RidingHumanoid) && flag && !Menu.IsVisible() && ((Character)player2).TakeInput() && !((Character)PlayerStartDoodadControlPatch.RidingHumanoid).InAttack())
				{
					List<ItemData> list = (from i in PlayerStartDoodadControlPatch.RidingHumanoid.m_inventory.GetAllItems()
						where i.IsWeapon()
						select i).ToList();
					if (list.Count > weaponIndex)
					{
						ItemData val = list[weaponIndex];
						PlayerStartDoodadControlPatch.RidingHumanoid.EquipItem(val, true);
						float num = val.m_shared.m_attack.m_attackStamina;
						IDoodadController doodadController = player2.GetDoodadController();
						Sadle val2 = (Sadle)(object)((doodadController is Sadle) ? doodadController : null);
						if (!((Object)(object)val2 == (Object)null))
						{
							if (val.m_shared.m_attack.m_attackStamina <= 0f)
							{
								num = val2.GetMaxStamina() * 0.05f;
							}
							if (val2.HaveStamina(num))
							{
								val2.UseStamina(num);
								((Character)PlayerStartDoodadControlPatch.RidingHumanoid).StartAttack((Character)null, false);
							}
						}
					}
				}
			}
		}
	}
}