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 BepInEx;
using HarmonyLib;
using Jotunn;
using Jotunn.Configs;
using Jotunn.Entities;
using Jotunn.Managers;
using Microsoft.CodeAnalysis;
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("Trollberrymead")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("HP")]
[assembly: AssemblyProduct("Trollberrymead")]
[assembly: AssemblyCopyright("Copyright © HP 2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("379729c7-ddb4-44e4-9365-2f169e344b41")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace TrollberryMeadMod
{
[BepInPlugin("youdied.trollberry", "Trollberry Mead", "1.7.2")]
[BepInDependency(/*Could not decode attribute arguments.*/)]
public class TrollberryMeadPlugin : BaseUnityPlugin
{
public static SE_Stats toxicityEffect;
public static readonly Dictionary<string, Color> RecolorTargets = new Dictionary<string, Color>();
public static readonly Color LightBlue = new Color(0.1f, 0.5f, 1f, 1f);
public static Texture2D MeadBaseTexture = null;
public static Texture2D MeadTexture = null;
public static TrollberryMeadPlugin Instance { get; private set; }
private void Awake()
{
Instance = this;
CreateToxicityEffect();
SafePatch(typeof(TrollDropPatch));
SafePatch(typeof(FermenterPatch));
SafePatch(typeof(ObjectDBPatch));
SafePatch(typeof(ToxicityDamagePatch));
SafePatch(typeof(TrollberryConsumePatch));
SafePatch(typeof(ItemDropRecolorPatch));
PrefabManager.OnVanillaPrefabsAvailable += CreateItems;
ItemManager.OnItemsRegistered += ApplyMeadBaseTexture;
ItemManager.OnItemsRegistered += ApplyMeadTexture;
Logger.LogInfo((object)"Trollberry Mead (v1.7.2)");
}
private void SafePatch(Type t)
{
try
{
Harmony.CreateAndPatchAll(t, (string)null);
}
catch (Exception ex)
{
Logger.LogWarning((object)("[TrollberryMead] Patch failed for " + t.Name + ": " + ex.Message));
}
}
private void CreateToxicityEffect()
{
//IL_0059: 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)
toxicityEffect = ScriptableObject.CreateInstance<SE_Stats>();
((Object)toxicityEffect).name = "SE_TrollBerryToxicity";
((StatusEffect)toxicityEffect).m_name = "Trollberry Toxin";
((StatusEffect)toxicityEffect).m_tooltip = "Poisoned! 1 damage/sec for 20 seconds.";
((StatusEffect)toxicityEffect).m_icon = null;
((StatusEffect)toxicityEffect).m_ttl = 20f;
((StatusEffect)toxicityEffect).m_startMessageType = (MessageType)1;
((StatusEffect)toxicityEffect).m_startMessage = "You ate a Trollberry...";
((StatusEffect)toxicityEffect).m_stopMessageType = (MessageType)1;
((StatusEffect)toxicityEffect).m_stopMessage = "The toxin has passed.";
}
private void CreateItems()
{
//IL_0079: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_008a: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Expected O, but got Unknown
//IL_0096: Unknown result type (might be due to invalid IL or missing references)
//IL_009c: Expected O, but got Unknown
//IL_0154: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Expected O, but got Unknown
//IL_018c: Unknown result type (might be due to invalid IL or missing references)
//IL_0191: Unknown result type (might be due to invalid IL or missing references)
//IL_019d: Unknown result type (might be due to invalid IL or missing references)
//IL_01a6: Expected O, but got Unknown
//IL_01a8: Unknown result type (might be due to invalid IL or missing references)
//IL_01ad: Unknown result type (might be due to invalid IL or missing references)
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Expected O, but got Unknown
//IL_01c4: Unknown result type (might be due to invalid IL or missing references)
//IL_01c9: Unknown result type (might be due to invalid IL or missing references)
//IL_01d5: Unknown result type (might be due to invalid IL or missing references)
//IL_01df: Expected O, but got Unknown
//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
//IL_01ed: Expected O, but got Unknown
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
//IL_0270: Unknown result type (might be due to invalid IL or missing references)
//IL_0275: Unknown result type (might be due to invalid IL or missing references)
//IL_0281: Unknown result type (might be due to invalid IL or missing references)
//IL_0292: Expected O, but got Unknown
//IL_028d: Unknown result type (might be due to invalid IL or missing references)
//IL_0293: Expected O, but got Unknown
//IL_0341: Unknown result type (might be due to invalid IL or missing references)
MeadBaseTexture = LoadEmbeddedTexture("meadbase_d2.png");
if ((Object)(object)MeadBaseTexture != (Object)null)
{
Logger.LogInfo((object)"[TrollberryMead] Loaded meadbase_d2.png successfully.");
}
else
{
Logger.LogWarning((object)"[TrollberryMead] meadbase_d2.png not found -- check it is an embedded resource.");
}
MeadTexture = LoadEmbeddedTexture("staminapot_d2.png");
if ((Object)(object)MeadTexture != (Object)null)
{
Logger.LogInfo((object)"[TrollberryMead] Loaded staminapot_d2.png successfully.");
}
else
{
Logger.LogWarning((object)"[TrollberryMead] staminapot_d2.png not found -- check it is an embedded resource.");
}
CustomItem val = new CustomItem("trollberry", "Blueberries", new ItemConfig
{
Name = "Trollberry",
Description = "A brown pile of 'berries' often found near trolls. Looks and smells like you shouldn't eat it."
});
if ((Object)(object)val.ItemDrop != (Object)null)
{
SharedData shared = val.ItemDrop.m_itemData.m_shared;
shared.m_icons = (Sprite[])(object)new Sprite[1] { LoadEmbeddedSprite("trollberry_icon.png") };
shared.m_itemType = (ItemType)1;
shared.m_food = 0f;
shared.m_foodStamina = 0f;
shared.m_foodBurnTime = 0f;
shared.m_foodRegen = 0f;
shared.m_consumeStatusEffect = null;
shared.m_useDurability = false;
shared.m_maxStackSize = 20;
ApplyTrollBrown(val.ItemPrefab);
ItemManager.Instance.AddItem(val);
}
ItemConfig val2 = new ItemConfig();
val2.Name = "Mead Base: Trollberry";
val2.Description = "A thick, electric-blue syrup. Needs fermenting.";
val2.CraftingStation = "piece_MeadCauldron";
val2.Requirements = (RequirementConfig[])(object)new RequirementConfig[3]
{
new RequirementConfig
{
Item = "trollberry",
Amount = 3
},
new RequirementConfig
{
Item = "Dandelion",
Amount = 3
},
new RequirementConfig
{
Item = "Coal",
Amount = 10
}
};
CustomItem val3 = new CustomItem("MeadBaseTrollberry", "MeadBaseHealthMinor", val2);
if ((Object)(object)val3.ItemDrop != (Object)null)
{
SharedData shared2 = val3.ItemDrop.m_itemData.m_shared;
shared2.m_icons = (Sprite[])(object)new Sprite[1] { LoadEmbeddedSprite("meadbase_icon.png") };
shared2.m_consumeStatusEffect = null;
shared2.m_food = 0f;
shared2.m_foodStamina = 0f;
shared2.m_foodBurnTime = 0f;
ItemManager.Instance.AddItem(val3);
}
CustomItem val4 = new CustomItem("MeadTrollberry", "MeadStaminaMinor", new ItemConfig
{
Name = "Trollberry Mead",
Description = "Hardens skin (25% Damage Reduction) for 90s."
});
if ((Object)(object)val4.ItemDrop != (Object)null)
{
SharedData shared3 = val4.ItemDrop.m_itemData.m_shared;
shared3.m_icons = (Sprite[])(object)new Sprite[1] { LoadEmbeddedSprite("mead_icon.png") };
SE_Stats val5 = ScriptableObject.CreateInstance<SE_Stats>();
((Object)val5).name = "SE_TrollSkin";
((StatusEffect)val5).m_name = "Troll Skin";
((StatusEffect)val5).m_ttl = 90f;
val5.m_damageModifier = 0.75f;
shared3.m_consumeStatusEffect = (StatusEffect)(object)val5;
ItemManager.Instance.AddItem(val4);
RecolorTargets["MeadTrollberry"] = new Color(0f, 0.6f, 2f, 0f);
}
}
private void ApplyTrollBrown(GameObject obj)
{
//IL_004e: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)obj == (Object)null)
{
return;
}
Color color = default(Color);
((Color)(ref color))..ctor(0.25f, 0.15f, 0.05f);
Renderer[] componentsInChildren = obj.GetComponentsInChildren<Renderer>(true);
foreach (Renderer val in componentsInChildren)
{
Material[] materials = val.materials;
foreach (Material val2 in materials)
{
val2.color = color;
}
}
}
private void ApplyMeadBaseTexture()
{
if (!((Object)(object)MeadBaseTexture == (Object)null))
{
GameObject prefab = PrefabManager.Instance.GetPrefab("MeadBaseTrollberry");
if (!((Object)(object)prefab == (Object)null))
{
ApplyTextureToStew(prefab, MeadBaseTexture);
Logger.LogInfo((object)"[TrollberryMead] Applied meadbase_d2 texture to MeadBaseTrollberry prefab.");
}
}
}
private void ApplyMeadTexture()
{
if (!((Object)(object)MeadTexture == (Object)null))
{
GameObject prefab = PrefabManager.Instance.GetPrefab("MeadTrollberry");
if (!((Object)(object)prefab == (Object)null))
{
ApplyTextureToPotion(prefab, MeadTexture);
Logger.LogInfo((object)"[TrollberryMead] Applied staminapot_d2.png to MeadTrollberry prefab.");
}
}
}
public static void ApplyTextureToChild(GameObject go, string childName, Texture2D tex)
{
//IL_006c: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Expected O, but got Unknown
Transform[] componentsInChildren = go.GetComponentsInChildren<Transform>(true);
foreach (Transform val in componentsInChildren)
{
if (!string.Equals(((Object)val).name, childName, StringComparison.OrdinalIgnoreCase))
{
continue;
}
Renderer component = ((Component)val).GetComponent<Renderer>();
if ((Object)(object)component == (Object)null)
{
continue;
}
Material[] sharedMaterials = component.sharedMaterials;
Material[] array = (Material[])(object)new Material[sharedMaterials.Length];
for (int j = 0; j < sharedMaterials.Length; j++)
{
array[j] = new Material(sharedMaterials[j]);
((Object)array[j]).name = ((Object)sharedMaterials[j]).name + "_trollberry";
if (array[j].HasProperty("_MainTex"))
{
array[j].SetTexture("_MainTex", (Texture)(object)tex);
}
}
component.sharedMaterials = array;
component.SetPropertyBlock((MaterialPropertyBlock)null);
Logger.LogInfo((object)$"[TrollberryMead] _MainTex set on '{childName}' ({array.Length} slots).");
}
}
public static void ApplyTextureToPotion(GameObject go, Texture2D tex)
{
ApplyTextureToChild(go, "potion", tex);
}
public static void ApplyTextureToStew(GameObject go, Texture2D tex)
{
ApplyTextureToChild(go, "stew", tex);
}
private static Texture2D LoadEmbeddedTexture(string fileName)
{
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0089: Expected O, but got Unknown
try
{
Assembly executingAssembly = Assembly.GetExecutingAssembly();
string text = executingAssembly.GetManifestResourceNames().FirstOrDefault((string x) => x.EndsWith(fileName, StringComparison.OrdinalIgnoreCase));
if (string.IsNullOrEmpty(text))
{
Logger.LogWarning((object)("[TrollberryMead] Embedded resource not found: " + fileName));
return null;
}
using Stream stream = executingAssembly.GetManifestResourceStream(text);
byte[] array = new byte[stream.Length];
stream.Read(array, 0, array.Length);
Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
((Object)val).name = Path.GetFileNameWithoutExtension(fileName);
return ImageConversion.LoadImage(val, array) ? val : null;
}
catch (Exception ex)
{
Logger.LogWarning((object)("[TrollberryMead] LoadEmbeddedTexture error: " + ex.Message));
return null;
}
}
private Sprite LoadEmbeddedSprite(string fileName)
{
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Expected O, but got Unknown
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
Assembly executingAssembly = Assembly.GetExecutingAssembly();
string text = executingAssembly.GetManifestResourceNames().FirstOrDefault((string x) => x.EndsWith(fileName, StringComparison.OrdinalIgnoreCase));
if (string.IsNullOrEmpty(text))
{
return null;
}
using (Stream stream = executingAssembly.GetManifestResourceStream(text))
{
byte[] array = new byte[stream.Length];
stream.Read(array, 0, array.Length);
Texture2D val = new Texture2D(2, 2);
if (ImageConversion.LoadImage(val, array))
{
return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
}
}
return null;
}
}
[HarmonyPatch(typeof(ItemDrop), "Awake")]
public class ItemDropRecolorPatch
{
public static void Postfix(ItemDrop __instance)
{
//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
//IL_0172: Unknown result type (might be due to invalid IL or missing references)
try
{
if ((Object)(object)__instance == (Object)null)
{
return;
}
string text = ((Object)((Component)__instance).gameObject).name.Replace("(Clone)", "").Trim();
if (!TrollberryMeadPlugin.RecolorTargets.TryGetValue(text, out var _))
{
return;
}
Logger.LogInfo((object)("[TrollberryMead] Recoloring instance of '" + text + "'"));
if (text == "MeadBaseTrollberry")
{
if ((Object)(object)TrollberryMeadPlugin.MeadBaseTexture != (Object)null)
{
TrollberryMeadPlugin.ApplyTextureToStew(((Component)__instance).gameObject, TrollberryMeadPlugin.MeadBaseTexture);
}
return;
}
if (text == "MeadTrollberry" && (Object)(object)TrollberryMeadPlugin.MeadTexture != (Object)null)
{
TrollberryMeadPlugin.ApplyTextureToPotion(((Component)__instance).gameObject, TrollberryMeadPlugin.MeadTexture);
Logger.LogInfo((object)"[TrollberryMead] -> Applied staminapot_d2.png to potion mesh instance.");
}
Light[] componentsInChildren = ((Component)__instance).GetComponentsInChildren<Light>(true);
foreach (Light val in componentsInChildren)
{
val.color = TrollberryMeadPlugin.LightBlue;
val.intensity = 1.8f;
val.range = 2.5f;
Logger.LogInfo((object)("[TrollberryMead] -> Recolored light on '" + ((Object)((Component)val).gameObject).name + "'"));
}
if ((Object)(object)((Component)__instance).GetComponent<Light>() == (Object)null)
{
Light val2 = ((Component)__instance).gameObject.AddComponent<Light>();
val2.type = (LightType)2;
val2.color = TrollberryMeadPlugin.LightBlue;
val2.intensity = 1.8f;
val2.range = 2.5f;
val2.shadows = (LightShadows)0;
Logger.LogInfo((object)"[TrollberryMead] -> Added ground glow light on root.");
}
}
catch (Exception ex)
{
Logger.LogWarning((object)("[TrollberryMead] ItemDropRecolorPatch error: " + ex.Message));
}
}
}
[HarmonyPatch(typeof(ObjectDB), "Awake")]
public class ObjectDBPatch
{
public static void Postfix(ObjectDB __instance)
{
if ((Object)(object)TrollberryMeadPlugin.toxicityEffect == (Object)null)
{
return;
}
if (!__instance.m_StatusEffects.Contains((StatusEffect)(object)TrollberryMeadPlugin.toxicityEffect))
{
__instance.m_StatusEffects.Add((StatusEffect)(object)TrollberryMeadPlugin.toxicityEffect);
}
if (!((Object)(object)((StatusEffect)TrollberryMeadPlugin.toxicityEffect).m_icon == (Object)null))
{
return;
}
StatusEffect val = ((IEnumerable<StatusEffect>)__instance.m_StatusEffects).FirstOrDefault((Func<StatusEffect, bool>)((StatusEffect se) => (Object)(object)se != (Object)null && (((Object)se).name == "Poison" || ((Object)se).name == "SE_Poison")));
if ((Object)(object)val?.m_icon != (Object)null)
{
((StatusEffect)TrollberryMeadPlugin.toxicityEffect).m_icon = val.m_icon;
return;
}
StatusEffect val2 = ((IEnumerable<StatusEffect>)__instance.m_StatusEffects).FirstOrDefault((Func<StatusEffect, bool>)((StatusEffect se) => (Object)(object)se?.m_icon != (Object)null));
if ((Object)(object)val2 != (Object)null)
{
((StatusEffect)TrollberryMeadPlugin.toxicityEffect).m_icon = val2.m_icon;
}
}
}
[HarmonyPatch(typeof(StatusEffect), "UpdateStatusEffect")]
public class ToxicityDamagePatch
{
private static readonly Dictionary<Character, float> timers = new Dictionary<Character, float>();
public static void Postfix(StatusEffect __instance, float dt)
{
//IL_0094: Unknown result type (might be due to invalid IL or missing references)
//IL_009b: Expected O, but got Unknown
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
if (!(((Object)__instance).name != "SE_TrollBerryToxicity") && !((Object)(object)__instance.m_character == (Object)null))
{
Character character = __instance.m_character;
if (!timers.ContainsKey(character))
{
timers[character] = 0f;
}
timers[character] += dt;
if (timers[character] >= 1f)
{
HitData val = new HitData();
val.m_damage.m_damage = 1f;
val.m_point = character.GetCenterPoint();
character.Damage(val);
timers[character] = 0f;
}
}
}
}
[HarmonyPatch(typeof(Humanoid), "UseItem")]
public class TrollberryConsumePatch
{
public static bool Prefix(Humanoid __instance, Inventory inventory, ItemData item, bool fromInventoryGui)
{
//IL_0095: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
if (item == null)
{
return true;
}
if (item.m_shared.m_name != "Trollberry")
{
return true;
}
Player val = (Player)(object)((__instance is Player) ? __instance : null);
if (val == null)
{
return true;
}
if ((Object)(object)TrollberryMeadPlugin.toxicityEffect != (Object)null)
{
((Character)val).GetSEMan().AddStatusEffect((StatusEffect)(object)TrollberryMeadPlugin.toxicityEffect, true, 0, 0f);
}
(inventory ?? ((Humanoid)val).GetInventory()).RemoveOneItem(item);
EffectList consumeItemEffects = ((Humanoid)val).m_consumeItemEffects;
if (consumeItemEffects != null)
{
consumeItemEffects.Create(((Component)val).transform.position, Quaternion.identity, (Transform)null, 1f, -1);
}
return false;
}
}
[HarmonyPatch(typeof(Fermenter), "Awake")]
public class FermenterPatch
{
public static void Postfix(Fermenter __instance)
{
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Expected O, but got Unknown
ObjectDB instance = ObjectDB.instance;
if (!((Object)(object)instance == (Object)null))
{
GameObject itemPrefab = instance.GetItemPrefab("MeadBaseTrollberry");
ItemDrop from = ((itemPrefab != null) ? itemPrefab.GetComponent<ItemDrop>() : null);
GameObject itemPrefab2 = instance.GetItemPrefab("MeadTrollberry");
ItemDrop val = ((itemPrefab2 != null) ? itemPrefab2.GetComponent<ItemDrop>() : null);
if ((Object)(object)from != (Object)null && (Object)(object)val != (Object)null && !__instance.m_conversion.Any((ItemConversion x) => (Object)(object)x.m_from == (Object)(object)from))
{
__instance.m_conversion.Add(new ItemConversion
{
m_from = from,
m_to = val
});
}
}
}
}
[HarmonyPatch(typeof(Character), "OnDeath")]
public class TrollDropPatch
{
public static void Postfix(Character __instance)
{
//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)
string text = ((Object)((Component)__instance).gameObject).name.Replace("(Clone)", "").Trim();
if (!(text == "Troll") || !(Random.value <= 0.8f))
{
return;
}
GameObject prefab = PrefabManager.Instance.GetPrefab("trollberry");
if (!((Object)(object)prefab == (Object)null))
{
int num = Random.Range(3, 6);
for (int i = 0; i < num; i++)
{
Object.Instantiate<GameObject>(prefab, ((Component)__instance).transform.position + Vector3.up, Quaternion.identity);
}
}
}
}
}