Decompiled source of Shields v0.1.1

Shields.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
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 BelowTheStone;
using BelowTheStone.Animation;
using BelowTheStone.Crafting;
using BelowTheStone.InventorySystem;
using BelowTheStone.NewDatabase;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
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: AssemblyTitle("Shields")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Shields")]
[assembly: AssemblyCopyright("Copyright ©  2023")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("542DE3E1-64DA-42F8-AC30-0D02E37BDE1A")]
[assembly: AssemblyFileVersion("0.1.1")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("0.1.1.0")]
[module: UnverifiableCode]
namespace Shields;

public static class Mocks
{
	public static void FixMocks(ItemStack itemStack)
	{
		if (itemStack != null && Object.op_Implicit((Object)(object)itemStack.ItemType) && ((Object)itemStack.ItemType).name.StartsWith("Mock_"))
		{
			string key = ((Object)itemStack.ItemType).name.Substring(5);
			AccessTools.FieldRefAccess<Item, ItemType>(itemStack.Item, "itemType") = ItemPatches.vanillaItems[key];
		}
	}

	public static void FixMocks(Ingredient ingredient)
	{
		if (ingredient != null && Object.op_Implicit((Object)(object)ingredient.ItemType) && ((Object)ingredient.ItemType).name.StartsWith("Mock_"))
		{
			string key = ((Object)ingredient.ItemType).name.Substring(5);
			AccessTools.FieldRefAccess<Ingredient, ItemType>(ingredient, "itemType") = ItemPatches.vanillaItems[key];
		}
	}

	public static void FixMocks(ItemType itemType)
	{
		if ((Object)(object)itemType != (Object)null && Object.op_Implicit((Object)(object)itemType.EquipItemPrefab))
		{
			FixMocks(itemType.EquipItemPrefab);
		}
	}

	public static void FixMocks(GameObject gameObject)
	{
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005b: Expected O, but got Unknown
		if (!Object.op_Implicit((Object)(object)gameObject))
		{
			return;
		}
		EquippedItem equippedItem = default(EquippedItem);
		if (gameObject.TryGetComponent<EquippedItem>(ref equippedItem))
		{
			FixMocks(equippedItem);
		}
		Renderer renderer = default(Renderer);
		if (gameObject.TryGetComponent<Renderer>(ref renderer))
		{
			FixMocks(renderer);
		}
		foreach (Transform item in gameObject.transform)
		{
			Transform val = item;
			FixMocks(((Component)val).gameObject);
		}
	}

	public static void FixMocks(Renderer renderer)
	{
		if (Object.op_Implicit((Object)(object)renderer) && Object.op_Implicit((Object)(object)renderer.sharedMaterial) && ((Object)renderer.sharedMaterial).name.StartsWith("Mock_"))
		{
			string materialName = ((Object)renderer.sharedMaterial).name.Substring(5);
			if (materialName.EndsWith(" (Instance)"))
			{
				materialName = materialName.Substring(0, materialName.Length - 11);
			}
			Material val = Resources.FindObjectsOfTypeAll<Material>().First((Material mat) => ((Object)mat).name == materialName);
			AccessTools.PropertySetter(typeof(Renderer), "sharedMaterial").Invoke(renderer, new object[1] { val });
		}
	}

	public static void FixMocks(EquippedItem equippedItem)
	{
		if (Object.op_Implicit((Object)(object)equippedItem))
		{
			if (Object.op_Implicit((Object)(object)equippedItem.ItemTypeData) && ((Object)equippedItem.ItemTypeData).name.StartsWith("Mock_"))
			{
				string key = ((Object)equippedItem.ItemTypeData).name.Substring(5);
				AccessTools.FieldRefAccess<EquippedItem, ItemType>(equippedItem, "itemTypeData") = ItemPatches.vanillaItems[key];
			}
			if (Object.op_Implicit((Object)(object)equippedItem.HandAnimations) && ((Object)equippedItem.HandAnimations).name.StartsWith("Mock_"))
			{
				string key2 = ((Object)equippedItem.HandAnimations).name.Substring(5);
				AccessTools.FieldRefAccess<EquippedItem, RuntimeAnimatorController>(equippedItem, "handAnimations") = ItemPatches.vanillaAnimations[key2];
			}
		}
	}
}
[HarmonyPatch]
public static class ItemPatches
{
	public static Dictionary<string, ItemType> vanillaItems = new Dictionary<string, ItemType>();

	public static Dictionary<string, RuntimeAnimatorController> vanillaAnimations = new Dictionary<string, RuntimeAnimatorController>();

	[HarmonyPatch(typeof(SODatabase), "Init", new Type[] { })]
	[HarmonyPrefix]
	public static void SODatabaseInit(SODatabase __instance)
	{
		EquippedItem val2 = default(EquippedItem);
		foreach (DatabaseElement master in __instance.MasterList)
		{
			ItemType val = (ItemType)(object)((master is ItemType) ? master : null);
			if (val != null)
			{
				vanillaItems[((DatabaseElement)val).NameID] = val;
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.EquipItemPrefab) && val.EquipItemPrefab.TryGetComponent<EquippedItem>(ref val2) && Object.op_Implicit((Object)(object)val2.HandAnimations))
				{
					vanillaAnimations[((Object)val2.HandAnimations).name] = val2.HandAnimations;
				}
			}
		}
		AssetBundle val3 = LoadAssetBundleFromResources("shields");
		ShieldItemType shieldItemType = val3.LoadAsset<ShieldItemType>("MS_shield_tin");
		Mocks.FixMocks((ItemType)(object)shieldItemType);
		__instance.MasterList.Add((DatabaseElement)(object)shieldItemType);
		__instance.MasterList.Add((DatabaseElement)(object)val3.LoadAsset<CraftingRecipe>("MS_shield_tin_recipe"));
		ShieldItemType shieldItemType2 = val3.LoadAsset<ShieldItemType>("MS_shield_copper");
		Mocks.FixMocks((ItemType)(object)shieldItemType2);
		__instance.MasterList.Add((DatabaseElement)(object)shieldItemType2);
		__instance.MasterList.Add((DatabaseElement)(object)val3.LoadAsset<CraftingRecipe>("MS_shield_copper_recipe"));
		ShieldItemType shieldItemType3 = val3.LoadAsset<ShieldItemType>("MS_shield_iron");
		Mocks.FixMocks((ItemType)(object)shieldItemType3);
		__instance.MasterList.Add((DatabaseElement)(object)shieldItemType3);
		__instance.MasterList.Add((DatabaseElement)(object)val3.LoadAsset<CraftingRecipe>("MS_shield_iron_recipe"));
	}

	[HarmonyPatch(typeof(CraftingRecipe), "OnEnable")]
	[HarmonyPrefix]
	public static void CraftingRecipeOnEnable(CraftingRecipe __instance)
	{
		Mocks.FixMocks(__instance.OutputItem);
		foreach (Ingredient ingredient in __instance.Ingredients)
		{
			Mocks.FixMocks(ingredient);
		}
	}

	public static AssetBundle LoadAssetBundleFromResources(string bundleName)
	{
		Assembly executingAssembly = Assembly.GetExecutingAssembly();
		string name = executingAssembly.GetManifestResourceNames().Single((string str) => str.EndsWith(bundleName));
		using Stream stream = executingAssembly.GetManifestResourceStream(name);
		return AssetBundle.LoadFromStream(stream);
	}
}
[HarmonyPatch]
public static class PlayerPatches
{
	private static Dictionary<ClothingVisualController, SpriteRenderer> shieldRenderer = new Dictionary<ClothingVisualController, SpriteRenderer>();

	private static Dictionary<ClothingVisualController, ClothingItem> shieldItem = new Dictionary<ClothingVisualController, ClothingItem>();

	private static bool shieldActive = false;

	[HarmonyPatch(typeof(PlayerObject), "Update")]
	[HarmonyPostfix]
	private static void PlayerObjectUpdate(PlayerObject __instance)
	{
		shieldActive = Input.GetMouseButton(1);
	}

	[HarmonyPatch(typeof(PlayerObject), "FixedUpdate")]
	[HarmonyPostfix]
	private static void PlayerObjectUpdate2(PlayerObject __instance)
	{
		//IL_004e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: Expected O, but got Unknown
		//IL_006b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0075: Unknown result type (might be due to invalid IL or missing references)
		if (shieldActive && Object.op_Implicit((Object)(object)__instance) && Object.op_Implicit((Object)(object)__instance.mover))
		{
			ArmorInventory armorInventory = __instance.PlayerInventory.ArmorInventory;
			InventorySlot accessorySlot = armorInventory.GetAccessorySlot(-1);
			object obj;
			if (accessorySlot == null)
			{
				obj = null;
			}
			else
			{
				ItemStack itemStack = accessorySlot.ItemStack;
				obj = ((itemStack != null) ? itemStack.ItemType : null);
			}
			ShieldItemType shieldItemType = ((ClothingItem)obj) as ShieldItemType;
			if (Object.op_Implicit((Object)(object)shieldItemType))
			{
				CharacterMover mover = __instance.mover;
				((VelocityMover)mover).TargetVelocity = ((VelocityMover)mover).TargetVelocity / 3f;
			}
		}
	}

	[HarmonyPatch(typeof(DamageReciever), "CalculateNetDamage")]
	[HarmonyPostfix]
	private static void DamageRecieverCalculateNetDamage(DamageReciever __instance, ref int __result)
	{
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Expected O, but got Unknown
		if (shieldActive && Object.op_Implicit((Object)(object)__instance) && Object.op_Implicit((Object)(object)__instance.plyInvScr))
		{
			ArmorInventory armorInventory = __instance.plyInvScr.PlayerInventory.ArmorInventory;
			InventorySlot accessorySlot = armorInventory.GetAccessorySlot(-1);
			object obj;
			if (accessorySlot == null)
			{
				obj = null;
			}
			else
			{
				ItemStack itemStack = accessorySlot.ItemStack;
				obj = ((itemStack != null) ? itemStack.ItemType : null);
			}
			ShieldItemType shieldItemType = ((ClothingItem)obj) as ShieldItemType;
			if (Object.op_Implicit((Object)(object)shieldItemType))
			{
				__result = CalculateDamageAfterShield(shieldItemType.BlockValue, __result);
			}
		}
	}

	private static int CalculateDamageAfterShield(int block, int damage)
	{
		return Mathf.FloorToInt(Mathf.Max(0f, (float)damage * (1f / ((float)block * 0.1f + 1f)) - (float)block));
	}

	[HarmonyPatch(typeof(DamageReciever), "DealDamage", new Type[] { typeof(DamageInfo) })]
	[HarmonyPostfix]
	private static void DamageRecieverDealDamage1(DamageReciever __instance, DamageInfo damageInfo)
	{
		//IL_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0059: Expected O, but got Unknown
		//IL_0069: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_008b: Unknown result type (might be due to invalid IL or missing references)
		if (shieldActive && Object.op_Implicit((Object)(object)__instance) && Object.op_Implicit((Object)(object)__instance.plyInvScr))
		{
			ArmorInventory armorInventory = __instance.plyInvScr.PlayerInventory.ArmorInventory;
			InventorySlot accessorySlot = armorInventory.GetAccessorySlot(-1);
			object obj;
			if (accessorySlot == null)
			{
				obj = null;
			}
			else
			{
				ItemStack itemStack = accessorySlot.ItemStack;
				obj = ((itemStack != null) ? itemStack.ItemType : null);
			}
			ShieldItemType shieldItemType = ((ClothingItem)obj) as ShieldItemType;
			if (Object.op_Implicit((Object)(object)shieldItemType))
			{
				int block = (int)damageInfo.baseDamage - CalculateDamageAfterShield(shieldItemType.BlockValue, (int)damageInfo.baseDamage);
				EmitBlockParticle(((Component)__instance).transform.position, block);
			}
		}
	}

	public static void EmitBlockParticle(Vector3 position, int block)
	{
		//IL_003f: 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_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_0073: Unknown result type (might be due to invalid IL or missing references)
		//IL_0078: Unknown result type (might be due to invalid IL or missing references)
		//IL_007d: Unknown result type (might be due to invalid IL or missing references)
		//IL_0082: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)GameState.current.gameDefines.damageIndicator))
		{
			DamageParticle component = Object.Instantiate<GameObject>(GameState.current.gameDefines.damageIndicator).GetComponent<DamageParticle>();
			((Component)component).transform.position = position + new Vector3(0f, 0.1f, 0.1f);
			component.InitParticle(block.ToString());
			((TMP_Text)component.textMesh).colorGradient = new VertexGradient(Color.white, Color.gray, Color.gray, Color.gray);
		}
	}

	[HarmonyPatch(typeof(ClothingVisualController), "Start")]
	[HarmonyPostfix]
	private static void ClothingVisualControllerStart(ClothingVisualController __instance)
	{
		//IL_000c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0057: Unknown result type (might be due to invalid IL or missing references)
		//IL_0072: Unknown result type (might be due to invalid IL or missing references)
		//IL_008d: Unknown result type (might be due to invalid IL or missing references)
		shieldRenderer[__instance] = new GameObject("Shield").AddComponent<SpriteRenderer>();
		((Component)shieldRenderer[__instance]).transform.SetParent(((Component)__instance).transform);
		((Component)shieldRenderer[__instance]).transform.localPosition = new Vector3(0.3f, 0.15f, 0f);
		((Component)shieldRenderer[__instance]).transform.localRotation = Quaternion.identity;
		((Component)shieldRenderer[__instance]).transform.localScale = Vector3.one;
		((Renderer)shieldRenderer[__instance]).sortingOrder = 2;
		shieldItem[__instance] = null;
	}

	[HarmonyPatch(typeof(ClothingVisualController), "SetClothingItem")]
	[HarmonyPostfix]
	private static void ClothingVisualControllerSetClothingItem(ClothingVisualController __instance, ClothingBodyPart bodyPart, ClothingItem clothingItem)
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		//IL_0003: Invalid comparison between Unknown and I4
		if ((int)bodyPart == 5)
		{
			shieldItem[__instance] = clothingItem;
		}
	}

	[HarmonyPatch(typeof(ClothingVisualController), "UpdateCharacterSprites")]
	[HarmonyPostfix]
	private static void ClothingVisualControllerUpdateCharacterSprites(ClothingVisualController __instance)
	{
		//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		if (Object.op_Implicit((Object)(object)shieldItem[__instance]) && Object.op_Implicit((Object)(object)shieldItem[__instance].ClothingSprites))
		{
			shieldRenderer[__instance].sprite = shieldItem[__instance].ClothingSprites.GetSprite(((SpriteAnimationVisualReciever)__instance).clipName, ((SpriteAnimationVisualReciever)__instance).spriteIndex);
		}
		else
		{
			shieldRenderer[__instance].sprite = null;
		}
		if (shieldActive)
		{
			((Component)shieldRenderer[__instance]).transform.localPosition = new Vector3(0.25f, 0.2f, 0f);
		}
		else
		{
			((Component)shieldRenderer[__instance]).transform.localPosition = new Vector3(0.2f, 0.15f, 0f);
		}
	}

	[HarmonyPatch(typeof(CharacterClothing), "Update")]
	[HarmonyPostfix]
	private static void CharacterClothingUpdate(CharacterClothing __instance)
	{
		//IL_0031: Unknown result type (might be due to invalid IL or missing references)
		//IL_0037: Expected O, but got Unknown
		ArmorInventory armorInventory = __instance.plyInv.PlayerInventory.ArmorInventory;
		InventorySlot accessorySlot = armorInventory.GetAccessorySlot(-1);
		object obj;
		if (accessorySlot == null)
		{
			obj = null;
		}
		else
		{
			ItemStack itemStack = accessorySlot.ItemStack;
			obj = ((itemStack != null) ? itemStack.ItemType : null);
		}
		ClothingItem val = (ClothingItem)obj;
		__instance.clothingVis.SetClothingItem((ClothingBodyPart)5, val);
	}
}
[BepInPlugin("com.maxsch.BelowTheStone.Shields", "Shields", "0.1.1")]
public class Plugin : BaseUnityPlugin
{
	public const string PluginGUID = "com.maxsch.BelowTheStone.Shields";

	public const string PluginName = "Shields";

	public const string PluginVersion = "0.1.1";

	public static ManualLogSource Log { get; private set; }

	private void Awake()
	{
		//IL_0006: Unknown result type (might be due to invalid IL or missing references)
		//IL_000c: Expected O, but got Unknown
		Harmony val = new Harmony("com.maxsch.BelowTheStone.Shields");
		val.PatchAll();
		Log = ((BaseUnityPlugin)this).Logger;
	}
}
[CreateAssetMenu(fileName = "New Shield Item Type", menuName = "Below The Stone/Database Objects/Shield Item Type")]
public class ShieldItemType : ClothingItem
{
	[SerializeField]
	private int blockValue;

	public int BlockValue => blockValue;

	public override string Stats => $"Block: {BlockValue}";
}