Decompiled source of ClanheimFoods v1.0.4

plugins\ClanheimFoods\ClanheimFoods.dll

Decompiled 6 days ago
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using BepInEx;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Jotunn.Utils;
using UnityEngine;

[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: CompilationRelaxations(8)]
[assembly: AssemblyVersion("0.0.0.0")]
namespace ClanheimFoods;

[BepInPlugin("com.clanheim.foods", "ClanheimFoods", "1.0.4")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
public class ClanheimFoodsPlugin : BaseUnityPlugin
{
	private class FoodRequirement
	{
		public string Item;

		public int Amount;

		public FoodRequirement(string item, int amount)
		{
			Item = item;
			Amount = amount;
		}
	}

	private class FoodDefinition
	{
		public string Prefab;

		public string BasePrefab;

		public string IconResource;

		public string Name;

		public string Description;

		public float Health;

		public float Stamina;

		public float Duration;

		public float Regen;

		public int Stack;

		public float Weight;

		public string Station;

		public int CraftAmount;

		public List<FoodRequirement> Requirements = new List<FoodRequirement>();

		public FoodDefinition(string prefab, string basePrefab, string iconResource, string name, string description, float health, float stamina, float duration, float regen, int stack, float weight, string station, int craftAmount)
		{
			Prefab = prefab;
			BasePrefab = basePrefab;
			IconResource = iconResource;
			Name = name;
			Description = description;
			Health = health;
			Stamina = stamina;
			Duration = duration;
			Regen = regen;
			Stack = stack;
			Weight = weight;
			Station = station;
			CraftAmount = craftAmount;
		}

		public FoodDefinition Require(string item, int amount)
		{
			Requirements.Add(new FoodRequirement(item, amount));
			return this;
		}
	}

	public const string PluginGuid = "com.clanheim.foods";

	public const string PluginName = "ClanheimFoods";

	public const string PluginVersion = "1.0.4";

	private bool registered;

	private void Awake()
	{
		PrefabManager.OnVanillaPrefabsAvailable += RegisterFoods;
		((BaseUnityPlugin)this).Logger.LogInfo((object)"ClanheimFoods 1.0.4 loaded.");
	}

	private void RegisterFoods()
	{
		if (registered)
		{
			return;
		}
		try
		{
			List<FoodDefinition> list = CreateFoodDefinitions();
			for (int i = 0; i < list.Count; i++)
			{
				RegisterFood(list[i]);
			}
			registered = true;
			((BaseUnityPlugin)this).Logger.LogInfo((object)("Registered " + list.Count + " Clanheim foods with custom embedded icons."));
		}
		catch (Exception ex)
		{
			((BaseUnityPlugin)this).Logger.LogError((object)("ClanheimFoods registration failed: " + ex));
		}
		finally
		{
			PrefabManager.OnVanillaPrefabsAvailable -= RegisterFoods;
		}
	}

	private void RegisterFood(FoodDefinition food)
	{
		//IL_0000: Unknown result type (might be due to invalid IL or missing references)
		//IL_0006: Expected O, but got Unknown
		//IL_0080: Unknown result type (might be due to invalid IL or missing references)
		//IL_0086: Expected O, but got Unknown
		ItemConfig val = new ItemConfig();
		val.Name = food.Name;
		val.Description = food.Description;
		val.CraftingStation = food.Station;
		val.Amount = food.CraftAmount;
		val.Enabled = true;
		for (int i = 0; i < food.Requirements.Count; i++)
		{
			FoodRequirement foodRequirement = food.Requirements[i];
			val.AddRequirement(foodRequirement.Item, foodRequirement.Amount, 0);
		}
		CustomItem val2 = new CustomItem(food.Prefab, food.BasePrefab, val);
		val2.ItemDrop.m_itemData.m_shared.m_food = food.Health;
		val2.ItemDrop.m_itemData.m_shared.m_foodStamina = food.Stamina;
		val2.ItemDrop.m_itemData.m_shared.m_foodBurnTime = food.Duration;
		val2.ItemDrop.m_itemData.m_shared.m_foodRegen = food.Regen;
		val2.ItemDrop.m_itemData.m_shared.m_maxStackSize = food.Stack;
		val2.ItemDrop.m_itemData.m_shared.m_weight = food.Weight;
		Sprite val3 = LoadEmbeddedIcon(food.IconResource);
		if ((Object)(object)val3 != (Object)null)
		{
			val2.ItemDrop.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { val3 };
		}
		if (!ItemManager.Instance.AddItem(val2))
		{
			throw new Exception("Jotunn rejected item " + food.Prefab);
		}
		((BaseUnityPlugin)this).Logger.LogInfo((object)("Added " + food.Name + " (" + food.Prefab + ")"));
	}

	private Sprite LoadEmbeddedIcon(string logicalName)
	{
		//IL_007a: Unknown result type (might be due to invalid IL or missing references)
		//IL_0081: Expected O, but got Unknown
		//IL_00ef: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
		string text = "ClanheimFoods.Icons." + logicalName + ".png";
		try
		{
			Assembly executingAssembly = Assembly.GetExecutingAssembly();
			using Stream stream = executingAssembly.GetManifestResourceStream(text);
			if (stream == null)
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Embedded icon not found: " + text));
				return null;
			}
			byte[] array = new byte[stream.Length];
			int num;
			for (int i = 0; i < array.Length; i += num)
			{
				num = stream.Read(array, i, array.Length - i);
				if (num <= 0)
				{
					break;
				}
			}
			Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
			((Object)val).name = logicalName + "_Icon";
			((Texture)val).wrapMode = (TextureWrapMode)1;
			if (!ImageConversion.LoadImage(val, array))
			{
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Could not decode icon: " + text));
				Object.Destroy((Object)(object)val);
				return null;
			}
			val.Apply(false, false);
			Sprite val2 = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), 100f);
			((Object)val2).name = logicalName + "_Icon";
			return val2;
		}
		catch (Exception ex)
		{
			((BaseUnityPlugin)this).Logger.LogWarning((object)("Failed loading icon " + text + ": " + ex.Message));
			return null;
		}
	}

	private List<FoodDefinition> CreateFoodDefinitions()
	{
		List<FoodDefinition> list = new List<FoodDefinition>();
		list.Add(new FoodDefinition("Clanheim_HuntersBroth", "DeerStew", "HuntersBroth", "Hunter's Broth", "A warming venison broth for hunters returning from the wilds.", 35f, 30f, 1200f, 2f, 10, 1f, "piece_cauldron", 1).Require("CookedDeerMeat", 1).Require("Carrot", 1).Require("Mushroom", 2));
		list.Add(new FoodDefinition("Clanheim_HighlandStew", "DeerStew", "HighlandStew", "Highland Stew", "A thick Highland venison stew made to keep a warrior on his feet.", 45f, 25f, 1500f, 2f, 10, 1f, "piece_cauldron", 1).Require("CookedDeerMeat", 2).Require("Carrot", 2).Require("Mushroom", 1));
		list.Add(new FoodDefinition("Clanheim_HeatherBerryPudding", "QueensJam", "HeatherBerryPudding", "Heather Berry Pudding", "Sweet berries and honey mashed into a travelling pudding.", 25f, 45f, 1200f, 2f, 10, 0.5f, "piece_cauldron", 1).Require("Raspberry", 4).Require("Blueberries", 4).Require("Honey", 2));
		list.Add(new FoodDefinition("Clanheim_Haggis", "Sausages", "ClanheimHaggis", "Clanheim Haggis", "A fearless mix of entrails, turnip and thistle. Better than it sounds.", 50f, 30f, 1500f, 3f, 10, 1f, "piece_cauldron", 1).Require("Entrails", 4).Require("Turnip", 2).Require("Thistle", 2));
		list.Add(new FoodDefinition("Clanheim_DraugrStew", "Sausages", "DraugrStew", "Draugr Stew", "Dark, rich and slightly suspicious. Nobody asks what went into the pot.", 55f, 25f, 1500f, 3f, 10, 1f, "piece_cauldron", 1).Require("Entrails", 2).Require("Turnip", 2).Require("Bloodbag", 1));
		list.Add(new FoodDefinition("Clanheim_WolfOnionStew", "WolfJerky", "WolfOnionStew", "Wolf & Onion Stew", "Rich mountain wolf simmered with onions until the cold becomes somebody else's problem.", 60f, 30f, 1800f, 3f, 10, 1f, "piece_cauldron", 1).Require("WolfMeat", 2).Require("Onion", 2).Require("Mushroom", 1));
		list.Add(new FoodDefinition("Clanheim_MountainBroth", "OnionSoup", "MountainBroth", "Mountain Broth", "A hot broth built for long climbs and frozen nights.", 40f, 45f, 1500f, 3f, 10, 1f, "piece_cauldron", 1).Require("WolfMeat", 1).Require("Onion", 2).Require("Carrot", 2));
		list.Add(new FoodDefinition("Clanheim_HeatherHoneyLoaf", "Bread", "HeatherHoneyLoaf", "Heather Honey Loaf", "A sweet barley loaf glazed with honey and cloudberries.", 30f, 55f, 1500f, 3f, 20, 0.5f, "piece_cauldron", 2).Require("BarleyFlour", 8).Require("Honey", 4).Require("Cloudberry", 2));
		list.Add(new FoodDefinition("Clanheim_Cranachan", "QueensJam", "Cranachan", "Queen's Cranachan", "Cloudberries, honey and barley turned into a feast-worthy Highland dessert.", 40f, 60f, 1800f, 3f, 10, 0.5f, "piece_cauldron", 1).Require("Cloudberry", 6).Require("Honey", 2).Require("BarleyFlour", 2));
		list.Add(new FoodDefinition("Clanheim_ClanFeast", "MeatPlatter", "ClanFeast", "Clanheim Feast", "A table-filling meat feast made for an entire warband.", 65f, 45f, 1800f, 4f, 5, 2f, "piece_cauldron", 1).Require("LoxMeat", 2).Require("HareMeat", 2).Require("ChickenMeat", 2)
			.Require("BarleyFlour", 4));
		list.Add(new FoodDefinition("Clanheim_OdinsSupper", "MisthareSupreme", "OdinsSupper", "Odin's Supper", "A mythic supper fit for the All-Father and the longest of raids.", 70f, 50f, 1800f, 4f, 5, 2f, "piece_cauldron", 1).Require("HareMeat", 2).Require("MushroomMagecap", 2).Require("MushroomJotunPuffs", 3)
			.Require("Onion", 2));
		return list;
	}
}