Please disclose if your mod was created primarily 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 Hunter Legacy v1.0.7
plugins/Hunter_Legacy.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using System.Security; using System.Security.Cryptography; using System.Security.Permissions; using System.Text; using System.Text.RegularExpressions; using System.Threading; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using ItemManager; using JetBrains.Annotations; using LocalizationManager; using Microsoft.CodeAnalysis; using PieceManager; using ServerSync; using TMPro; using UnityEngine; using UnityEngine.UI; using YamlDotNet.Core; using YamlDotNet.Core.Events; using YamlDotNet.Core.Tokens; using YamlDotNet.Helpers; using YamlDotNet.Serialization; using YamlDotNet.Serialization.BufferedDeserialization; using YamlDotNet.Serialization.BufferedDeserialization.TypeDiscriminators; using YamlDotNet.Serialization.Converters; using YamlDotNet.Serialization.EventEmitters; using YamlDotNet.Serialization.NamingConventions; using YamlDotNet.Serialization.NodeDeserializers; using YamlDotNet.Serialization.NodeTypeResolvers; using YamlDotNet.Serialization.ObjectFactories; using YamlDotNet.Serialization.ObjectGraphTraversalStrategies; using YamlDotNet.Serialization.ObjectGraphVisitors; using YamlDotNet.Serialization.Schemas; using YamlDotNet.Serialization.TypeInspectors; using YamlDotNet.Serialization.TypeResolvers; using YamlDotNet.Serialization.Utilities; using YamlDotNet.Serialization.ValueDeserializers; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("Hunter_Legacy")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyProduct("Hunter_Legacy")] [assembly: AssemblyCopyright("Copyright © 2021")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("4358610B-F3F4-4843-B7AF-98B7BC60DCDE")] [assembly: AssemblyFileVersion("1.0.7")] [assembly: AssemblyCompany("Dreanegade")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.7.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<6204d626-5fba-49d4-9168-5aaa2607961e>Embedded] internal sealed class <6204d626-5fba-49d4-9168-5aaa2607961e>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<6204d626-5fba-49d4-9168-5aaa2607961e>Embedded] internal sealed class <7e6708aa-7554-4d90-a2a0-c39b8c1343b6>IsReadOnlyAttribute : Attribute { } [CompilerGenerated] [<6204d626-5fba-49d4-9168-5aaa2607961e>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <0989fef8-d62b-49fe-82ce-23a7b0fca8e5>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <0989fef8-d62b-49fe-82ce-23a7b0fca8e5>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <0989fef8-d62b-49fe-82ce-23a7b0fca8e5>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [<6204d626-5fba-49d4-9168-5aaa2607961e>Embedded] [CompilerGenerated] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContextAttribute : Attribute { public readonly byte Flag; public <a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContextAttribute(byte P_0) { Flag = P_0; } } } [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [HarmonyPatch(typeof(ArcheryTarget), "Start")] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] public static class ArcheryTargetCustomProjectile { [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] public class BoltPair { public string itemDropName; public string projectileName; public BoltPair(string item, string proj) { itemDropName = item; projectileName = proj; } } private static readonly List<BoltPair> CustomBolts = new List<BoltPair> { new BoltPair("BoltFlintDO", "projectile_bolt_flint_DO"), new BoltPair("BoltStoneDO", "projectile_bolt_stone_DO"), new BoltPair("BoltBoneDO", "projectile_bolt_bone_DO"), new BoltPair("BoltObsidianDO", "projectile_bolt_obsidian_DO"), new BoltPair("BoltCrystalDO", "projectile_bolt_crystal_DO"), new BoltPair("BoltMarbleDO", "projectile_bolt_marble_DO"), new BoltPair("PelletStoneDO", "projectile_pellet_stone_DO"), new BoltPair("PelletObsidianDO", "projectile_pellet_obsidian_DO"), new BoltPair("PelletMarbleDO", "projectile_pellet_marble_DO"), new BoltPair("PelletGraustenDO", "projectile_pellet_grausten_DO") }; private static void Postfix(ArcheryTarget __instance) { if ((Object)(object)ZNetScene.instance == (Object)null) { Debug.LogError((object)"ArcheryTargetCustomProjectile: ZNetScene is null! Cannot register custom bolts."); return; } foreach (BoltPair customBolt in CustomBolts) { string itemDropName = customBolt.itemDropName; string projectileName = customBolt.projectileName; GameObject prefab = ZNetScene.instance.GetPrefab(itemDropName); if ((Object)(object)prefab == (Object)null) { Debug.LogWarning((object)("ArcheryTargetCustomProjectile: ItemDrop '" + itemDropName + "' not found.")); continue; } ItemDrop component = prefab.GetComponent<ItemDrop>(); if ((Object)(object)component == (Object)null) { Debug.LogWarning((object)("ArcheryTargetCustomProjectile: '" + itemDropName + "' has no ItemDrop component.")); continue; } GameObject prefab2 = ZNetScene.instance.GetPrefab(projectileName); if ((Object)(object)prefab2 == (Object)null) { Debug.LogWarning((object)("ArcheryTargetCustomProjectile: Projectile '" + projectileName + "' not found.")); continue; } if ((Object)(object)component.m_itemData.m_shared.m_attack.m_attackProjectile == (Object)null || ((Object)component.m_itemData.m_shared.m_attack.m_attackProjectile).name != projectileName) { component.m_itemData.m_shared.m_attack.m_attackProjectile = prefab2; Debug.Log((object)("ArcheryTargetCustomProjectile: Assigned projectile '" + projectileName + "' to ItemDrop '" + itemDropName + "'.")); } if (!__instance.m_returnAmmo.Contains(component)) { __instance.m_returnAmmo.Add(component); Debug.Log((object)("ArcheryTargetCustomProjectile: Added '" + itemDropName + "' to ArcheryTarget return ammo.")); } } } } [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] internal static class SAP_Log { private static readonly ManualLogSource _log = Logger.CreateLogSource("SlingshotAmmoPatch"); public static void Info(string s) { _log.LogInfo((object)s); } public static void Err(string s) { _log.LogError((object)s); } } [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] internal static class SAP_Util { private static readonly BindingFlags InstAll = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private static readonly FieldInfo FI_weapon = typeof(Attack).GetField("m_weapon", InstAll); private static readonly FieldInfo FI_character = typeof(Attack).GetField("m_character", InstAll); private static readonly FieldInfo FI_ammoItem = typeof(Attack).GetField("m_ammoItem", InstAll); private static readonly FieldInfo FI_lastUsedAmmo = typeof(Attack).GetField("m_lastUsedAmmo", InstAll); public static ItemData GetWeapon(Attack atk) { if (atk == null || FI_weapon == null) { return null; } try { object? value = FI_weapon.GetValue(atk); return (ItemData)((value is ItemData) ? value : null); } catch { return null; } } public static Humanoid GetCharacter(Attack atk) { if (atk == null || FI_character == null) { return null; } try { object? value = FI_character.GetValue(atk); return (Humanoid)((value is Humanoid) ? value : null); } catch { return null; } } public static ItemData GetAmmoItem(Attack atk) { if (atk == null) { return null; } ItemData val = null; if (FI_ammoItem != null) { try { object? value = FI_ammoItem.GetValue(atk); val = (ItemData)((value is ItemData) ? value : null); } catch { } } if (val == null && FI_lastUsedAmmo != null) { try { object? value2 = FI_lastUsedAmmo.GetValue(atk); val = (ItemData)((value2 is ItemData) ? value2 : null); } catch { } } return val; } public static string GetPrefabName(ItemData item) { if (item == null) { return null; } if ((Object)(object)item.m_dropPrefab != (Object)null) { return ((Object)item.m_dropPrefab).name; } try { ObjectDB instance = ObjectDB.instance; if ((Object)(object)instance != (Object)null) { foreach (GameObject item2 in instance.m_items) { if (Object.op_Implicit((Object)(object)item2) && item2.GetComponent<ItemDrop>()?.m_itemData?.m_shared == item.m_shared) { return ((Object)item2).name; } } } } catch { } return null; } } [HarmonyPatch(typeof(Attack), "OnAttackTrigger")] internal static class SAP_Attack_OnAttackTrigger_Patch { [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] private static void Postfix(Attack __instance) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Invalid comparison between Unknown and I4 try { if (__instance == null || (int)__instance.m_attackType != 2) { return; } int projectiles = __instance.m_projectiles; if (projectiles <= 1) { return; } ItemData weapon = SAP_Util.GetWeapon(__instance); if (weapon == null || weapon.m_shared == null || string.IsNullOrEmpty(weapon.m_shared.m_ammoType) || !SSU_Whitelist.Match(SAP_Util.GetPrefabName(weapon))) { return; } Humanoid character = SAP_Util.GetCharacter(__instance); Player val = (Player)(object)((character is Player) ? character : null); if ((Object)(object)val == (Object)null) { return; } ItemData ammoItem = SAP_Util.GetAmmoItem(__instance); if (ammoItem == null) { return; } int num = projectiles - 1; if (num > 0) { Inventory inventory = ((Humanoid)val).GetInventory(); if (inventory != null) { inventory.RemoveItem(ammoItem, num); } } } catch (Exception ex) { SAP_Log.Err("SlingshotAmmoPatch.OnAttackTrigger error: " + ex.GetType().Name + ": " + ex.Message); } } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class SSU_Log { private static readonly ManualLogSource _log = Logger.CreateLogSource("SlingshotSecondaryUnlock"); public static void Info(string s) { _log.LogInfo((object)s); } public static void Err(string s) { _log.LogError((object)s); } } [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] internal static class SSU_Whitelist { private static readonly string[] _names; internal static readonly HashSet<string> Names; internal static readonly HashSet<int> NameHashes; static SSU_Whitelist() { _names = new string[7] { "SlingshotWoodDO", "SlingshotCorewoodDO", "SlingshotIronDO", "SlingshotSilverDO", "SlingshotBlackmetalDO", "SlingshotCompositeMistlandsDO", "SlingshotCompositeAshlandsDO" }; Names = new HashSet<string>(StringComparer.Ordinal); NameHashes = new HashSet<int>(); string[] names = _names; foreach (string text in names) { Names.Add(text); NameHashes.Add(StringExtensionMethods.GetStableHashCode(text)); } } public static bool Match(string prefabName) { if (string.IsNullOrEmpty(prefabName)) { return false; } if (Names.Contains(prefabName)) { return true; } return NameHashes.Contains(StringExtensionMethods.GetStableHashCode(prefabName)); } } [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] internal static class SSU_State { private static readonly Dictionary<int, bool> _secondaryDrawActive = new Dictionary<int, bool>(); private static int Key(Player p) { if (!Object.op_Implicit((Object)(object)p)) { return 0; } return ((Object)p).GetInstanceID(); } public static bool IsSecondaryDrawActive(Player p) { int key = Key(p); bool value; return _secondaryDrawActive.TryGetValue(key, out value) && value; } public static void SetSecondaryDrawActive(Player p, bool active) { int key = Key(p); if (active) { _secondaryDrawActive[key] = true; } else { _secondaryDrawActive.Remove(key); } } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class SSU_Util { private static readonly BindingFlags InstAll = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; private static readonly MethodInfo MI_UpdateWeaponLoading = typeof(Player).GetMethod("UpdateWeaponLoading", InstAll, null, new Type[2] { typeof(ItemData), typeof(float) }, null); private static readonly MethodInfo MI_UpdateAttackBowDraw = typeof(Player).GetMethod("UpdateAttackBowDraw", InstAll, null, new Type[2] { typeof(ItemData), typeof(float) }, null); private static readonly MethodInfo MI_InPlaceMode = typeof(Player).GetMethod("InPlaceMode", InstAll, null, Type.EmptyTypes, null); public static string GetPrefabName(ItemData item) { if (item == null) { return null; } if ((Object)(object)item.m_dropPrefab != (Object)null) { return ((Object)item.m_dropPrefab).name; } try { ObjectDB instance = ObjectDB.instance; if ((Object)(object)instance != (Object)null) { foreach (GameObject item2 in instance.m_items) { if (Object.op_Implicit((Object)(object)item2) && item2.GetComponent<ItemDrop>()?.m_itemData?.m_shared == item.m_shared) { return ((Object)item2).name; } } } } catch { } return null; } private static FieldInfo FindField(Type t, string name) { while (t != null) { FieldInfo field = t.GetField(name, InstAll); if (field != null) { return field; } t = t.BaseType; } return null; } public static T GetField<[<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(2)] T>(object obj, string name) { if (obj == null) { return default(T); } FieldInfo fieldInfo = FindField(obj.GetType(), name); if (fieldInfo == null) { return default(T); } object value = fieldInfo.GetValue(obj); if (value is T) { return (T)value; } try { return (T)Convert.ChangeType(value, typeof(T)); } catch { return default(T); } } public static void SetField(object obj, string name, object value) { if (obj != null) { FieldInfo fieldInfo = FindField(obj.GetType(), name); if (!(fieldInfo == null)) { fieldInfo.SetValue(obj, value); } } } private static bool CallBoolNoArgs(object obj, MethodInfo mi) { if (obj == null || mi == null) { return false; } try { object obj2 = mi.Invoke(obj, Array.Empty<object>()); bool flag = default(bool); int num; if (obj2 is bool) { flag = (bool)obj2; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } catch { return false; } } public static bool InPlaceMode(Player p) { return CallBoolNoArgs(p, MI_InPlaceMode); } public static void CallUpdateWeaponLoading(Player p, ItemData weapon, float dt) { if ((Object)(object)p == (Object)null || MI_UpdateWeaponLoading == null) { return; } try { MI_UpdateWeaponLoading.Invoke(p, new object[2] { weapon, dt }); } catch { } } public static void CallUpdateAttackBowDraw(Player p, ItemData weapon, float dt) { if ((Object)(object)p == (Object)null || MI_UpdateAttackBowDraw == null) { return; } try { MI_UpdateAttackBowDraw.Invoke(p, new object[2] { weapon, dt }); } catch { } } public static void HandleLoopingAbort(Player p) { object field = GetField<object>(p, "m_currentAttack"); if (field == null || !GetField<bool>(field, "m_loopingAttack")) { return; } bool field2 = GetField<bool>(p, "m_currentAttackIsSecondary"); bool field3 = GetField<bool>(p, "m_attackHold"); bool field4 = GetField<bool>(p, "m_secondaryAttackHold"); if (field2 ? field4 : field3) { return; } MethodInfo method = field.GetType().GetMethod("Abort", InstAll, null, Type.EmptyTypes, null); if (method == null) { return; } try { method.Invoke(field, Array.Empty<object>()); } catch { } } public static void HandleSlingshotAttackInput(Player p, float dt) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 if ((Object)(object)p == (Object)null) { return; } ItemData currentWeapon = ((Humanoid)p).GetCurrentWeapon(); if (currentWeapon == null || currentWeapon.m_shared == null || (int)currentWeapon.m_shared.m_itemType != 4 || !currentWeapon.m_shared.m_attack.m_bowDraw || !SSU_Whitelist.Match(GetPrefabName(currentWeapon)) || InPlaceMode(p)) { return; } CallUpdateWeaponLoading(p, currentWeapon, dt); bool field = GetField<bool>(p, "m_secondaryAttackHold"); bool field2 = GetField<bool>(p, "m_attackHold"); bool flag = currentWeapon.m_shared.m_secondaryAttack != null; bool flag2; if (SSU_State.IsSecondaryDrawActive(p)) { flag2 = true; } else { flag2 = flag && field && !field2; if (flag2) { SSU_State.SetSecondaryDrawActive(p, active: true); } } if (flag2) { SharedData shared = currentWeapon.m_shared; Attack attack = shared.m_attack; Attack secondaryAttack = shared.m_secondaryAttack; if (secondaryAttack == null) { CallUpdateAttackBowDraw(p, currentWeapon, dt); } else { bool field3 = GetField<bool>(p, "m_attackHold"); try { shared.m_attack = secondaryAttack; SetField(p, "m_attackHold", field); CallUpdateAttackBowDraw(p, currentWeapon, dt); } finally { shared.m_attack = attack; SetField(p, "m_attackHold", field3); } float field4 = GetField<float>(p, "m_attackDrawTime"); if (!field && field4 <= 0f) { SSU_State.SetSecondaryDrawActive(p, active: false); } } } else { CallUpdateAttackBowDraw(p, currentWeapon, dt); } HandleLoopingAbort(p); } } [HarmonyPatch(typeof(Player), "PlayerAttackInput")] internal static class SSU_PlayerAttackInput_Patch { [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] private static bool Prefix(Player __instance, float dt) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Invalid comparison between Unknown and I4 try { if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } ItemData currentWeapon = ((Humanoid)__instance).GetCurrentWeapon(); if (currentWeapon == null || currentWeapon.m_shared == null) { return true; } if ((int)currentWeapon.m_shared.m_itemType != 4) { return true; } if (!SSU_Whitelist.Match(SSU_Util.GetPrefabName(currentWeapon))) { return true; } SSU_Util.HandleSlingshotAttackInput(__instance, dt); return false; } catch (Exception ex) { SSU_Log.Err("SlingshotSecondaryUnlock.PlayerAttackInput error: " + ex.GetType().Name + ": " + ex.Message); return true; } } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class BSU_Log { private static readonly ManualLogSource _log = Logger.CreateLogSource("BowSecondaryUnlock"); public static void Info(string s) { _log.LogInfo((object)s); } public static void Err(string s) { _log.LogError((object)s); } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class BSU_Whitelist { private static readonly string[] _names; internal static readonly HashSet<string> Names; internal static readonly HashSet<int> NameHashes; static BSU_Whitelist() { _names = new string[3] { "BowEvoCoreAshlandsLightningDO", "BowEvoCoreAshlandsBloodDO", "BowEvoCoreAshlandsNatureDO" }; Names = new HashSet<string>(StringComparer.Ordinal); NameHashes = new HashSet<int>(); string[] names = _names; foreach (string text in names) { Names.Add(text); NameHashes.Add(StringExtensionMethods.GetStableHashCode(text)); } } public static bool Match(string prefabName) { if (string.IsNullOrEmpty(prefabName)) { return false; } if (Names.Contains(prefabName)) { return true; } return NameHashes.Contains(StringExtensionMethods.GetStableHashCode(prefabName)); } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class BSU_RateLimiter { private static readonly Dictionary<string, float> _lastStart = new Dictionary<string, float>(); private static readonly Dictionary<string, float> _lockUntil = new Dictionary<string, float>(); private static string Key(Humanoid h, string prefab) { return string.Format("{0}:{1}", Object.op_Implicit((Object)(object)h) ? ((Object)h).GetInstanceID() : 0, prefab ?? ""); } public static bool IsLocked(Humanoid h, string prefab) { string key = Key(h, prefab); if (_lockUntil.TryGetValue(key, out var value)) { return Time.time < value; } return false; } public static float GetLastStart(Humanoid h, string prefab) { string key = Key(h, prefab); if (!_lastStart.TryGetValue(key, out var value)) { return -999f; } return value; } public static void MarkStartedAndLock(Humanoid h, string prefab, float cooldown) { string key = Key(h, prefab); float time = Time.time; _lastStart[key] = time; _lockUntil[key] = time + Mathf.Max(0.1f, cooldown); } public static void ClearLock(Humanoid h, string prefab) { string key = Key(h, prefab); _lockUntil.Remove(key); } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class BSU_Util { public static ItemData GetEquippedBow(Humanoid h) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 ItemData val = ((h != null) ? h.GetCurrentWeapon() : null); if (val?.m_shared == null) { return null; } if ((int)val.m_shared.m_itemType != 4) { return null; } return val; } public static string GetPrefabName(ItemData item) { if (item == null) { return null; } if ((Object)(object)item.m_dropPrefab != (Object)null) { return ((Object)item.m_dropPrefab).name; } try { ObjectDB instance = ObjectDB.instance; if ((Object)(object)instance != (Object)null) { foreach (GameObject item2 in instance.m_items) { if (Object.op_Implicit((Object)(object)item2) && item2.GetComponent<ItemDrop>()?.m_itemData?.m_shared == item.m_shared) { return ((Object)item2).name; } } } } catch { } return null; } public static bool SecondaryPressedThisFrame() { try { if (ZInput.GetButtonDown("SecondaryAttack")) { return true; } } catch { } try { if (ZInput.GetButtonDown("Attack2")) { return true; } } catch { } try { if (ZInput.GetButtonDown("SecAttack")) { return true; } } catch { } try { if (Input.GetKeyDown((KeyCode)325)) { return true; } } catch { } return false; } private static bool CallBoolNoArgs(object obj, string methodName) { if (obj == null) { return false; } Type type = obj.GetType(); while (type != null) { MethodInfo method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); if (method != null && method.ReturnType == typeof(bool)) { try { return (bool)method.Invoke(obj, Array.Empty<object>()); } catch { return false; } } type = type.BaseType; } return false; } public static bool IsInAttackStrict(Humanoid h) { if (CallBoolNoArgs(h, "InAttack")) { return true; } if (CallBoolNoArgs(h, "IsAttacking")) { return true; } return false; } public static float GetAttackCooldown(object attackObj) { if (attackObj == null) { return 0.35f; } try { FieldInfo field = attackObj.GetType().GetField("m_attackCooldown", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null && field.FieldType == typeof(float)) { float num = (float)field.GetValue(attackObj); if (num > 0f) { return num; } } } catch { } return 0.5f; } public static void ClearStuckCurrentAttackIfSafe(Humanoid h, float lastStartTime, float cooldown) { if (IsInAttackStrict(h) || Time.time < lastStartTime + Mathf.Max(0.1f, cooldown) + 0.035f) { return; } try { if (GetField(h, "m_currentAttack") != null) { SetField(h, "m_currentAttack", null); } } catch { } } private static FieldInfo FindField(Type t, string name) { while (t != null) { FieldInfo field = t.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return field; } t = t.BaseType; } return null; } private static object GetField(object obj, string name) { if (obj == null) { return null; } return FindField(obj.GetType(), name)?.GetValue(obj); } private static void SetField(object obj, string name, object val) { if (obj != null) { FindField(obj.GetType(), name)?.SetValue(obj, val); } } private static object FindFieldByTypeName(object obj, string typeName) { if (obj == null) { return null; } Type type = obj.GetType(); while (type != null) { FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fields) { Type fieldType = fieldInfo.FieldType; if (!(fieldType == null) && (fieldType.Name == typeName || (fieldType.FullName != null && fieldType.FullName.EndsWith("." + typeName, StringComparison.Ordinal)))) { object value = fieldInfo.GetValue(obj); if (value != null) { return value; } } } type = type.BaseType; } return null; } private static Type FindTypeByName(string typeName) { Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { Type type = null; try { type = assembly.GetType(typeName); } catch { } if (type != null) { return type; } try { Type[] types = assembly.GetTypes(); foreach (Type type2 in types) { if (type2.Name == typeName) { return type2; } if (type2.FullName != null && type2.FullName.EndsWith("." + typeName, StringComparison.Ordinal)) { return type2; } } } catch { } } return null; } private static Component GetComponentByTypeName(Component c, string typeName) { if ((Object)(object)c == (Object)null) { return null; } Type type = FindTypeByName(typeName); if (type == null) { return null; } try { return c.GetComponent(type); } catch { return null; } } private static object FindZAnim(Humanoid h) { object field = GetField(h, "m_zanim"); if (field != null) { return field; } field = FindFieldByTypeName(h, "ZSyncAnimation"); if (field != null) { return field; } field = FindFieldByTypeName(h, "ZAnimator"); if (field != null) { return field; } return GetComponentByTypeName((Component)(object)h, "ZSyncAnimation") ?? GetComponentByTypeName((Component)(object)h, "ZAnimator"); } private static Rigidbody FindBody(Humanoid h) { object field = GetField(h, "m_body"); Rigidbody val = (Rigidbody)((field is Rigidbody) ? field : null); if ((Object)(object)val != (Object)null) { return val; } try { return ((Component)h).GetComponent<Rigidbody>(); } catch { return null; } } private static object FindAnimEvent(Humanoid h) { object field = GetField(h, "m_animEvent"); if (field != null) { return field; } field = FindFieldByTypeName(h, "CharacterAnimEvent"); if (field != null) { return field; } return GetComponentByTypeName((Component)(object)h, "CharacterAnimEvent"); } private static object FindVisEquipment(Humanoid h) { object field = GetField(h, "m_visEquipment"); if (field != null) { return field; } field = FindFieldByTypeName(h, "VisEquipment"); if (field != null) { return field; } return GetComponentByTypeName((Component)(object)h, "VisEquipment"); } private static IEnumerable<MethodInfo> EnumerateAttackStartMethods(object attackObj) { if (attackObj == null) { yield break; } IEnumerable<MethodInfo> enumerable = from m in attackObj.GetType().GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) where m.Name == "Start" select m; foreach (MethodInfo item in enumerable) { yield return item; } } public static bool TryStartSecondary(Humanoid h, ItemData item) { if ((Object)(object)h == (Object)null || item?.m_shared == null) { return false; } Attack secondaryAttack = item.m_shared.m_secondaryAttack; if (secondaryAttack == null) { return false; } try { SetField(h, "m_currentWeapon", item); SetField(h, "m_currentAttack", secondaryAttack); FieldInfo fieldInfo = FindField(((object)h).GetType(), "m_attackQueue"); if (fieldInfo != null) { fieldInfo.SetValue(h, false); } FieldInfo fieldInfo2 = FindField(((object)h).GetType(), "m_blocking"); if (fieldInfo2 != null) { fieldInfo2.SetValue(h, false); } FieldInfo fieldInfo3 = FindField(((object)h).GetType(), "m_wasAiming"); if (fieldInfo3 != null) { fieldInfo3.SetValue(h, false); } } catch { } Rigidbody body = FindBody(h); object zAnim = FindZAnim(h); object animEv = FindAnimEvent(h); object visEq = FindVisEquipment(h); List<MethodInfo> list = EnumerateAttackStartMethods(secondaryAttack).ToList(); if (list.Count == 0) { return false; } foreach (MethodInfo item2 in list) { ParameterInfo[] parameters = item2.GetParameters(); object[] args = new object[parameters.Length]; if (TryFillArgsAndInvoke(item2, parameters, args, h, body, zAnim, animEv, visEq, item, secondaryAttack, Time.time, 1f, prevAttackNull: false)) { return true; } if (TryFillArgsAndInvoke(item2, parameters, args, h, body, zAnim, animEv, visEq, item, secondaryAttack, Time.time, 1f, prevAttackNull: true)) { return true; } } return false; } private static bool TryFillArgsAndInvoke(MethodInfo mi, ParameterInfo[] pars, object[] args, Humanoid h, Rigidbody body, object zAnim, object animEv, object visEq, ItemData item, object secAttack, float timeNow, float drawPct, bool prevAttackNull) { //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) int num = 0; for (int i = 0; i < pars.Length; i++) { Type parameterType = pars[i].ParameterType; if (parameterType == typeof(Humanoid) || parameterType == typeof(Character) || parameterType == typeof(Player) || parameterType.IsInstanceOfType(h)) { args[i] = h; } else if (parameterType == typeof(Rigidbody)) { if ((Object)(object)body == (Object)null) { return false; } args[i] = body; } else if (zAnim != null && (parameterType.IsInstanceOfType(zAnim) || parameterType.Name.Contains("ZSyncAnimation") || parameterType.Name.Contains("ZAnimator"))) { args[i] = zAnim; } else if (parameterType.Name == "CharacterAnimEvent") { if (animEv == null) { return false; } args[i] = animEv; } else if (parameterType.Name == "VisEquipment") { if (visEq == null) { return false; } args[i] = visEq; } else if (parameterType == typeof(ItemData)) { args[i] = item; } else if (parameterType.Name == "Attack") { args[i] = (prevAttackNull ? null : secAttack); } else if (parameterType == typeof(float)) { args[i] = ((num++ == 0) ? timeNow : ((num == 2) ? drawPct : 0f)); } else if (parameterType == typeof(bool)) { args[i] = true; } else if (parameterType == typeof(int)) { args[i] = 0; } else if (parameterType == typeof(string)) { try { FieldInfo field = secAttack.GetType().GetField("m_attackAnimation", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); args[i] = ((field != null) ? ((string)field.GetValue(secAttack)) : ""); } catch { args[i] = ""; } } else if (parameterType == typeof(Vector3)) { args[i] = ((Component)h).transform.position; } else { if (!(parameterType == typeof(Quaternion))) { return false; } args[i] = ((Component)h).transform.rotation; } } try { return !(mi.Invoke(secAttack, args) is bool flag) || flag; } catch { return false; } } } [HarmonyPatch(typeof(Player), "Update")] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] internal static class BSU_PlayerUpdate_Postfix { private static float _lastTriggerTime; private static readonly HashSet<string> _notified = new HashSet<string>(StringComparer.Ordinal); private static void Postfix(Player __instance) { try { if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer || !BSU_Util.SecondaryPressedThisFrame()) { return; } ItemData equippedBow = BSU_Util.GetEquippedBow((Humanoid)(object)__instance); if (equippedBow == null) { return; } string prefabName = BSU_Util.GetPrefabName(equippedBow); if (!BSU_Whitelist.Match(prefabName)) { return; } if (!string.IsNullOrEmpty(prefabName) && !_notified.Contains(prefabName)) { _notified.Add(prefabName); BSU_Log.Info("Secondary unlocked for '" + prefabName + "'."); } if (Time.time - _lastTriggerTime < 0.1f) { return; } _lastTriggerTime = Time.time; float attackCooldown = BSU_Util.GetAttackCooldown(equippedBow.m_shared?.m_secondaryAttack); if (!BSU_Util.IsInAttackStrict((Humanoid)(object)__instance)) { if (BSU_RateLimiter.IsLocked((Humanoid)(object)__instance, prefabName)) { BSU_Util.ClearStuckCurrentAttackIfSafe((Humanoid)(object)__instance, BSU_RateLimiter.GetLastStart((Humanoid)(object)__instance, prefabName), attackCooldown); } else if (BSU_Util.TryStartSecondary((Humanoid)(object)__instance, equippedBow)) { BSU_RateLimiter.MarkStartedAndLock((Humanoid)(object)__instance, prefabName, attackCooldown); } } } catch (Exception ex) { BSU_Log.Err("BowSecondaryUnlock.Update error: " + ex.GetType().Name + ": " + ex.Message); } } } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class VES_Log { private static readonly ManualLogSource _log = Logger.CreateLogSource("VisEqSafeSetup"); public static void Info(string s) { _log.LogInfo((object)s); } public static void Warn(string s) { _log.LogWarning((object)s); } public static void Err(string s) { _log.LogError((object)s); } } [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] internal static class VES_Ref { public static FieldInfo FindField(Type t, string name) { while (t != null) { FieldInfo field = t.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return field; } t = t.BaseType; } return null; } public static object GetField(object obj, string name) { if (obj == null) { return null; } return FindField(obj.GetType(), name)?.GetValue(obj); } public static void SetField(object obj, string name, object val) { if (obj != null) { FindField(obj.GetType(), name)?.SetValue(obj, val); } } } [HarmonyPatch(typeof(Humanoid), "Awake")] internal static class Humanoid_Awake_VisEq_Autobind { [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] private static void Postfix(Humanoid __instance) { try { FieldInfo fieldInfo = VES_Ref.FindField(((object)__instance).GetType(), "m_visEquipment"); if (!(fieldInfo == null) && !((Object)/*isinst with value type is only supported in some contexts*/ != (Object)null)) { VisEquipment componentInChildren = ((Component)__instance).GetComponentInChildren<VisEquipment>(true); if ((Object)(object)componentInChildren != (Object)null) { fieldInfo.SetValue(__instance, componentInChildren); } } } catch (Exception ex) { VES_Log.Warn("[AutoBind] " + ((__instance != null) ? ((Object)__instance).name : null) + ": " + ex.GetType().Name + ": " + ex.Message); } } } [HarmonyPatch(typeof(Humanoid), "SetupVisEquipment")] [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] internal static class Humanoid_SetupVisEquipment_Safe { private static readonly HashSet<string> Notified = new HashSet<string>(StringComparer.Ordinal); private static bool Prefix(Humanoid __instance, VisEquipment visEq, bool isRagdoll) { if (__instance is Player) { return true; } if ((Object)(object)visEq == (Object)null) { NotifyOnce(__instance, "missing VisEquipment"); return false; } if ((Object)(object)visEq.m_bodyModel == (Object)null || ((Object)(object)visEq.m_leftHand == (Object)null && (Object)(object)visEq.m_rightHand == (Object)null)) { NotifyOnce(__instance, "incomplete VisEquipment"); return false; } return true; } private static Exception Finalizer(Humanoid __instance, VisEquipment visEq, bool isRagdoll, Exception __exception) { if (__exception != null && !(__instance is Player)) { NotifyOnce(__instance, "exception in SetupVisEquipment: " + __exception.GetType().Name); return null; } return __exception; } private static void NotifyOnce(Humanoid h, string reason) { try { string text = (Object.op_Implicit((Object)(object)h) ? (((Object)h).name ?? "Humanoid") : "Humanoid"); int num = text.IndexOf("(Clone)", StringComparison.Ordinal); if (num >= 0) { text = text.Substring(0, num).Trim(); } if (!Notified.Contains(text)) { Notified.Add(text); VES_Log.Info("Guarded SetupVisEquipment for '" + text + "' (" + reason + ")."); } } catch { } } } namespace Hunter_Legacy { [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(1)] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(0)] [BepInPlugin("Dreanegade.Hunter_Legacy", "Hunter_Legacy", "1.0.7")] public class Hunter_LegacyPlugin : BaseUnityPlugin { [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(0)] public enum Toggle { On = 1, Off = 0 } [<a55f9a56-9d47-49d2-a89b-b110901fa336>NullableContext(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(2)] [UsedImplicitly] public string Category; [UsedImplicitly] [<0989fef8-d62b-49fe-82ce-23a7b0fca8e5>Nullable(new byte[] { 2, 1 })] public Action<ConfigEntryBase> CustomDrawer; } internal const string ModName = "Hunter_Legacy"; internal const string ModVersion = "1.0.7"; internal const string Author = "Dreanegade"; private const string ModGUID = "Dreanegade.Hunter_Legacy"; private static string ConfigFileName = "Dreanegade.Hunter_Legacy.cfg"; private static string ConfigFileFullPath; internal static string ConnectionError; private readonly Harmony _harmony = new Harmony("Dreanegade.Hunter_Legacy"); public static readonly ManualLogSource Hunter_LegacyLogger; private static readonly ConfigSync ConfigSync; private static ConfigEntry<Toggle> _serverConfigLocked; private static ConfigEntry<Toggle> _recipeIsActiveConfig; public void Awake() { Localizer.Load(); _serverConfigLocked = config("1 - General", "Lock Configuration", Toggle.On, "If on, the configuration is locked and can be changed by server admins only."); ConfigSync.AddLockingConfigEntry<Toggle>(_serverConfigLocked); AssetBundle assets = PrefabManager.RegisterAssetBundle("hunter_legacy"); BuildPiece.ConfigurationEnabled = true; PrefabManager.RegisterPrefab(assets, "vfx_arrowhit_nocturne_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_flint_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_stone_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_bone_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_obsidian_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_crystal_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_marble_DO"); PrefabManager.RegisterPrefab(assets, "projectile_demon_hunter_crossbow_blood_DO"); PrefabManager.RegisterPrefab(assets, "vfx_demon_hunter_crossbow_blood_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_demon_hunter_crossbow_blood_fire_main_DO"); PrefabManager.RegisterPrefab(assets, "sfx_demon_hunter_crossbow_blood_fire_scream_DO"); PrefabManager.RegisterPrefab(assets, "vfx_demon_hunter_crossbow_blood_hit_DO"); PrefabManager.RegisterPrefab(assets, "spawn_demon_hunter_crossbow_blood_skeleton_DO"); PrefabManager.RegisterPrefab(assets, "creature_demon_hunter_crossbow_blood_skeleton_DO"); PrefabManager.RegisterPrefab(assets, "fx_demon_hunter_crossbow_blood_skeleton_summon_DO"); PrefabManager.RegisterPrefab(assets, "sfx_dread_crossbow_poison_fire_DO"); PrefabManager.RegisterPrefab(assets, "vfx_dread_crossbow_poison_fire_DO"); PrefabManager.RegisterPrefab(assets, "aoe_dread_crossbow_poison_hit_DO"); PrefabManager.RegisterPrefab(assets, "aoe_dread_crossbow_spirit_hit_DO"); PrefabManager.RegisterPrefab(assets, "vfx_dread_crossbow_spirit_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_dread_crossbow_spirit_fire_DO"); PrefabManager.RegisterPrefab(assets, "aoe_dread_crossbow_frost_hit_DO"); PrefabManager.RegisterPrefab(assets, "vfx_dread_crossbow_frost_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_dread_crossbow_frost_fire_DO"); PrefabManager.RegisterPrefab(assets, "projectile_demon_hunter_crossbow_lightning_DO"); PrefabManager.RegisterPrefab(assets, "chain_demon_hunter_crossbow_lightning_DO"); PrefabManager.RegisterPrefab(assets, "vfx_demon_hunter_crossbow_lightning_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_demon_hunter_crossbow_lightning_fire_DO"); PrefabManager.RegisterPrefab(assets, "fx_demon_hunter_crossbow_lightning_hit_DO"); PrefabManager.RegisterPrefab(assets, "fx_demon_hunter_crossbow_lightning_hit_secondary_DO"); PrefabManager.RegisterPrefab(assets, "vfx_demon_hunter_crossbow_nature_fire_DO"); PrefabManager.RegisterPrefab(assets, "fx_demon_hunter_crossbow_nature_shield_block_DO"); PrefabManager.RegisterPrefab(assets, "vfx_demon_hunter_crossbow_nature_hit_secondary_DO"); PrefabManager.RegisterPrefab(assets, "sfx_demon_hunter_crossbow_nature_hit_secondary_DO"); PrefabManager.RegisterPrefab(assets, "aoe_ashen_exile_bow_hit_DO"); PrefabManager.RegisterPrefab(assets, "vfx_ashen_exile_bow_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_ashen_exile_bow_fire_DO"); PrefabManager.RegisterPrefab(assets, "projectile_bolt_syringe_poison_DO"); PrefabManager.RegisterPrefab(assets, "vfx_evo_bow_blood_fire_DO"); PrefabManager.RegisterPrefab(assets, "vfx_evo_bow_lightning_fire_DO"); PrefabManager.RegisterPrefab(assets, "vfx_evo_bow_nature_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_bow_nocturne_fire_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_knife_bronze_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_knife_iron_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_knife_silver_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_knife_blackmetal_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_knife_flametal_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_whirlstar_bronze_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_whirlstar_iron_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_whirlstar_silver_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_whirlstar_blackmetal_DO"); PrefabManager.RegisterPrefab(assets, "projectile_throwing_whirlstar_flametal_DO"); PrefabManager.RegisterPrefab(assets, "vfx_bomb_smoke_escape_smoke_DO"); PrefabManager.RegisterPrefab(assets, "sfx_bomb_smoke_escape_glass_break_DO"); PrefabManager.RegisterPrefab(assets, "vfx_slingshot_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_slingshot_fire_DO"); PrefabManager.RegisterPrefab(assets, "sfx_slingshot_fire_whistle_DO"); PrefabManager.RegisterPrefab(assets, "sfx_slingshot_draw_DO"); PrefabManager.RegisterPrefab(assets, "projectile_pellet_stone_DO"); PrefabManager.RegisterPrefab(assets, "projectile_pellet_obsidian_DO"); PrefabManager.RegisterPrefab(assets, "projectile_pellet_marble_DO"); PrefabManager.RegisterPrefab(assets, "projectile_pellet_grausten_DO"); BuildPiece buildPiece = new BuildPiece("hunter_legacy", "HunterTableDO"); buildPiece.RequiredItems.Add("Bronze", 10, recover: true); buildPiece.RequiredItems.Add("RoundLog", 30, recover: true); buildPiece.RequiredItems.Add("BronzeNails", 40, recover: true); buildPiece.RequiredItems.Add("Resin", 15, recover: true); buildPiece.Category.Set("Distant Origins"); buildPiece.Crafting.Set(PieceManager.CraftingTable.Forge); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece2 = new BuildPiece("hunter_legacy", "MunitionsBenchDO"); buildPiece2.RequiredItems.Add("Bronze", 10, recover: true); buildPiece2.RequiredItems.Add("RoundLog", 20, recover: true); buildPiece2.RequiredItems.Add("BronzeNails", 20, recover: true); buildPiece2.RequiredItems.Add("Wood", 20, recover: true); buildPiece2.Category.Set("Distant Origins"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece2.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece3 = new BuildPiece("hunter_legacy", "HunterTableExt1DO"); buildPiece3.RequiredItems.Add("Wood", 15, recover: true); buildPiece3.RequiredItems.Add("Iron", 3, recover: true); buildPiece3.RequiredItems.Add("LeatherResinedDO", 6, recover: true); buildPiece3.Category.Set("Distant Origins"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece3.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece4 = new BuildPiece("hunter_legacy", "HunterTableExt2DO"); buildPiece4.RequiredItems.Add("RoundLog", 25, recover: true); buildPiece4.RequiredItems.Add("CoarseThreadDO", 8, recover: true); buildPiece4.RequiredItems.Add("Silver", 4, recover: true); buildPiece4.Category.Set("Distant Origins"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece4.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece5 = new BuildPiece("hunter_legacy", "HunterTableExt3DO"); buildPiece5.RequiredItems.Add("LeatherTarredDO", 16, recover: true); buildPiece5.RequiredItems.Add("FineWood", 16, recover: true); buildPiece5.RequiredItems.Add("LinenThread", 10, recover: true); buildPiece5.RequiredItems.Add("BlackMetal", 10, recover: true); buildPiece5.Category.Set("Distant Origins"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece6 = new BuildPiece("hunter_legacy", "HunterTableExt4DO"); buildPiece6.RequiredItems.Add("YggdrasilWood", 15, recover: true); buildPiece6.RequiredItems.Add("Silver", 10, recover: true); buildPiece6.RequiredItems.Add("BlackMetal", 15, recover: true); buildPiece6.RequiredItems.Add("LeatherSappedDO", 10, recover: true); buildPiece6.Category.Set("Distant Origins"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece6.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece7 = new BuildPiece("hunter_legacy", "HunterTableExt5DO"); buildPiece7.RequiredItems.Add("BlackMarble", 30, recover: true); buildPiece7.RequiredItems.Add("FlametalNew", 6, recover: true); buildPiece7.RequiredItems.Add("TrophyFallenValkyrie", 1, recover: true); buildPiece7.RequiredItems.Add("TrophyMorgen", 1, recover: true); buildPiece7.Category.Set("Distant Origins"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece7.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece8 = new BuildPiece("hunter_legacy", "ShowcaseHunterSmallV1DO"); buildPiece8.RequiredItems.Add("RoundLog", 6, recover: true); buildPiece8.RequiredItems.Add("Crystal", 3, recover: true); buildPiece8.RequiredItems.Add("IronNails", 5, recover: true); buildPiece8.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece8.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece9 = new BuildPiece("hunter_legacy", "ShowcaseHunterSmallV2DO"); buildPiece9.RequiredItems.Add("RoundLog", 5, recover: true); buildPiece9.RequiredItems.Add("Crystal", 4, recover: true); buildPiece9.RequiredItems.Add("IronNails", 5, recover: true); buildPiece9.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece9.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece10 = new BuildPiece("hunter_legacy", "ShowcaseHunterMediumV1DO"); buildPiece10.RequiredItems.Add("RoundLog", 10, recover: true); buildPiece10.RequiredItems.Add("Crystal", 6, recover: true); buildPiece10.RequiredItems.Add("IronNails", 10, recover: true); buildPiece10.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece10.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece11 = new BuildPiece("hunter_legacy", "ShowcaseHunterLargeV1DO"); buildPiece11.RequiredItems.Add("RoundLog", 15, recover: true); buildPiece11.RequiredItems.Add("Crystal", 8, recover: true); buildPiece11.RequiredItems.Add("IronNails", 15, recover: true); buildPiece11.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece11.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece12 = new BuildPiece("hunter_legacy", "ShowcaseHunterLargeV2DO"); buildPiece12.RequiredItems.Add("RoundLog", 20, recover: true); buildPiece12.RequiredItems.Add("Crystal", 6, recover: true); buildPiece12.RequiredItems.Add("IronNails", 15, recover: true); buildPiece12.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece12.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece13 = new BuildPiece("hunter_legacy", "ShowcaseHunterGiantV1DO"); buildPiece13.RequiredItems.Add("RoundLog", 25, recover: true); buildPiece13.RequiredItems.Add("Crystal", 10, recover: true); buildPiece13.RequiredItems.Add("IronNails", 20, recover: true); buildPiece13.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece13.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece14 = new BuildPiece("hunter_legacy", "ShowcaseHunterGiantV2DO"); buildPiece14.RequiredItems.Add("RoundLog", 25, recover: true); buildPiece14.RequiredItems.Add("Crystal", 8, recover: true); buildPiece14.RequiredItems.Add("IronNails", 20, recover: true); buildPiece14.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece14.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece15 = new BuildPiece("hunter_legacy", "ArmorStandWoodDO"); buildPiece15.RequiredItems.Add("Wood", 15, recover: true); buildPiece15.RequiredItems.Add("BronzeNails", 5, recover: true); buildPiece15.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece15.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece16 = new BuildPiece("hunter_legacy", "ArmorStandCorewoodDO"); buildPiece16.RequiredItems.Add("RoundLog", 10, recover: true); buildPiece16.RequiredItems.Add("BronzeNails", 5, recover: true); buildPiece16.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece16.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece17 = new BuildPiece("hunter_legacy", "ArmorStandCopperDO"); buildPiece17.RequiredItems.Add("Copper", 2, recover: true); buildPiece17.RequiredItems.Add("Resin", 4, recover: true); buildPiece17.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece17.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece18 = new BuildPiece("hunter_legacy", "ArmorStandTarDO"); buildPiece18.RequiredItems.Add("FineWood", 6, recover: true); buildPiece18.RequiredItems.Add("Tar", 2, recover: true); buildPiece18.RequiredItems.Add("IronNails", 5, recover: true); buildPiece18.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece18.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece19 = new BuildPiece("hunter_legacy", "ArmorStandMarbleDO"); buildPiece19.RequiredItems.Add("BlackMarble", 5, recover: true); buildPiece19.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece19.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece20 = new BuildPiece("hunter_legacy", "ItemStandWoodDO"); buildPiece20.RequiredItems.Add("Wood", 5, recover: true); buildPiece20.RequiredItems.Add("BronzeNails", 2, recover: true); buildPiece20.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece20.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece21 = new BuildPiece("hunter_legacy", "ItemStandCorewoodDO"); buildPiece21.RequiredItems.Add("RoundLog", 3, recover: true); buildPiece21.RequiredItems.Add("BronzeNails", 2, recover: true); buildPiece21.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece21.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece22 = new BuildPiece("hunter_legacy", "ItemStandCopperDO"); buildPiece22.RequiredItems.Add("Copper", 1, recover: true); buildPiece22.RequiredItems.Add("Resin", 2, recover: true); buildPiece22.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece22.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece23 = new BuildPiece("hunter_legacy", "ItemStandTarDO"); buildPiece23.RequiredItems.Add("FineWood", 2, recover: true); buildPiece23.RequiredItems.Add("Tar", 1, recover: true); buildPiece23.RequiredItems.Add("IronNails", 2, recover: true); buildPiece23.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece23.Prefab, MaterialReplacer.ShaderType.UseUnityShader); BuildPiece buildPiece24 = new BuildPiece("hunter_legacy", "ItemStandMarbleDO"); buildPiece24.RequiredItems.Add("BlackMarble", 2, recover: true); buildPiece24.Category.Set("Distant Origins Decor"); MaterialReplacer.RegisterGameObjectForShaderSwap(buildPiece24.Prefab, MaterialReplacer.ShaderType.UseUnityShader); Item item = new Item("hunter_legacy", "DrawLeverDO"); item.Crafting.Add("HunterTableDO", 1); item.RequiredItems.Add("Bronze", 4); item.RequiredItems.Add("BronzeNails", 10); item.RequiredItems.Add("LeatherResinedDO", 2); item.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Draw Lever", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item2 = new Item("hunter_legacy", "EternalBowstringDO"); item2.Crafting.Add("HunterTableDO", 1); item2.RequiredItems.Add("CoarseThreadDO", 10); item2.RequiredItems.Add("LeatherResinedDO", 3); item2.RequiredItems.Add("AncientSeed", 1); item2.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item2.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Eternal Bowstring", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item2.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item3 = new Item("hunter_legacy", "CoarseThreadDO"); item3.Crafting.Add("HunterTableDO", 1); item3.RequiredItems.Add("Thistle", 2); item3.RequiredItems.Add("Dandelion", 4); item3.RequiredItems.Add("Resin", 3); item3.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item3.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Coarse Thread", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item3.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item4 = new Item("hunter_legacy", "GemstoneCelestineDO"); MaterialReplacer.RegisterGameObjectForShaderSwap(item4.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Gemstone Celestine", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item4.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item5 = new Item("hunter_legacy", "GemstoneCryoliteDO"); MaterialReplacer.RegisterGameObjectForShaderSwap(item5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Gemstone Celestine", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item5.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item6 = new Item("hunter_legacy", "LeatherResinedDO"); item6.Crafting.Add("HunterTableDO", 1); item6.RequiredItems.Add("DeerHide", 1); item6.RequiredItems.Add("Resin", 3); item6.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item6.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Resined", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item6.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item7 = new Item("hunter_legacy", "LeatherGreasedDO"); item7.Crafting.Add("HunterTableDO", 1); item7.RequiredItems.Add("TrollHide", 1); item7.RequiredItems.Add("RawMeat", 2); item7.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item7.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Greased", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item7.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item8 = new Item("hunter_legacy", "LeatherFrostedDO"); item8.Crafting.Add("HunterTableDO", 1); item8.RequiredItems.Add("WolfPelt", 1); item8.RequiredItems.Add("FreezeGland", 1); item8.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item8.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Frosted", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item8.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item9 = new Item("hunter_legacy", "LeatherTarredDO"); item9.Crafting.Add("HunterTableDO", 1); item9.RequiredItems.Add("LoxPelt", 1); item9.RequiredItems.Add("Tar", 1); item9.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item9.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Tarred", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item9.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item10 = new Item("hunter_legacy", "LeatherSappedDO"); item10.Crafting.Add("HunterTableDO", 1); item10.RequiredItems.Add("ScaleHide", 1); item10.RequiredItems.Add("Sap", 2); item10.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item10.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Sapped", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item10.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item11 = new Item("hunter_legacy", "LeatherCharredDO"); item11.Crafting.Add("HunterTableDO", 1); item11.RequiredItems.Add("AskHide", 1); item11.RequiredItems.Add("CharcoalResin", 1); item11.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item11.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Charred", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item11.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item12 = new Item("hunter_legacy", "BoltFlintDO"); item12.Crafting.Add("MunitionsBenchDO", 1); item12.RequiredItems.Add("Flint", 2); item12.RequiredItems.Add("Wood", 8); item12.RequiredItems.Add("Feathers", 2); item12.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item12.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Flint", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item12.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item13 = new Item("hunter_legacy", "BoltStoneDO"); item13.Crafting.Add("MunitionsBenchDO", 1); item13.RequiredItems.Add("Stone", 4); item13.RequiredItems.Add("RoundLog", 8); item13.RequiredItems.Add("Feathers", 2); item13.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item13.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Stone", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item13.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item14 = new Item("hunter_legacy", "BoltBoneDO"); item14.Crafting.Add("MunitionsBenchDO", 1); item14.RequiredItems.Add("WitheredBone", 2); item14.RequiredItems.Add("ElderBark", 2); item14.RequiredItems.Add("Feathers", 2); item14.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item14.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Bone", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item14.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item15 = new Item("hunter_legacy", "BoltObsidianDO"); item15.Crafting.Add("MunitionsBenchDO", 1); item15.RequiredItems.Add("Obsidian", 4); item15.RequiredItems.Add("Wood", 8); item15.RequiredItems.Add("Feathers", 2); item15.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item15.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Obsidian", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item15.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item16 = new Item("hunter_legacy", "BoltCrystalDO"); item16.Crafting.Add("MunitionsBenchDO", 1); item16.RequiredItems.Add("Crystal", 2); item16.RequiredItems.Add("Wood", 8); item16.RequiredItems.Add("Feathers", 2); item16.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item16.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Crystal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item16.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item17 = new Item("hunter_legacy", "BoltMarbleDO"); item17.Crafting.Add("MunitionsBenchDO", 1); item17.RequiredItems.Add("BlackMarble", 2); item17.RequiredItems.Add("Wood", 8); item17.RequiredItems.Add("Feathers", 2); item17.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item17.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Marble", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item17.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item18 = new Item("hunter_legacy", "BoltSyringePoisonDO"); item18.Crafting.Add("MunitionsBenchDO", 1); item18.RequiredItems.Add("Ooze", 3); item18.RequiredItems.Add("BlackMetal", 1); item18.RequiredItems.Add("Feathers", 2); item18.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item18.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Syringe Poison", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item18.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item19 = new Item("hunter_legacy", "ThrowingKnifeCoreBronzeDO"); item19.Crafting.Add("MunitionsBenchDO", 1); item19.RequiredItems.Add("Bronze", 1); item19.RequiredItems.Add("LeatherResinedDO", 1); item19.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item19.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Bronze", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item19.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item20 = new Item("hunter_legacy", "ThrowingKnifeCoreIronDO"); item20.Crafting.Add("MunitionsBenchDO", 1); item20.RequiredItems.Add("Iron", 1); item20.RequiredItems.Add("LeatherGreasedDO", 1); item20.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item20.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Iron", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item20.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item21 = new Item("hunter_legacy", "ThrowingKnifeCoreSilverDO"); item21.Crafting.Add("MunitionsBenchDO", 1); item21.RequiredItems.Add("Silver", 1); item21.RequiredItems.Add("LeatherFrostedDO", 1); item21.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item21.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Silver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item21.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item22 = new Item("hunter_legacy", "ThrowingKnifeCoreBlackmetalDO"); item22.Crafting.Add("MunitionsBenchDO", 1); item22.RequiredItems.Add("BlackMetal", 1); item22.RequiredItems.Add("LeatherTarredDO", 1); item22.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item22.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Blackmetal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item22.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item23 = new Item("hunter_legacy", "ThrowingKnifeCoreFlametalDO"); item23.Crafting.Add("MunitionsBenchDO", 1); item23.RequiredItems.Add("FlametalNew", 1); item23.RequiredItems.Add("LeatherCharredDO", 1); item23.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item23.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Flametal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item23.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item24 = new Item("hunter_legacy", "ThrowingWhirlstarCoreBronzeDO"); item24.Crafting.Add("MunitionsBenchDO", 1); item24.RequiredItems.Add("Bronze", 1); item24.RequiredItems.Add("LeatherResinedDO", 1); item24.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item24.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Bronze", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item24.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item25 = new Item("hunter_legacy", "ThrowingWhirlstarCoreIronDO"); item25.Crafting.Add("MunitionsBenchDO", 1); item25.RequiredItems.Add("Iron", 1); item25.RequiredItems.Add("LeatherGreasedDO", 1); item25.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item25.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Iron", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item25.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item26 = new Item("hunter_legacy", "ThrowingWhirlstarCoreSilverDO"); item26.Crafting.Add("MunitionsBenchDO", 1); item26.RequiredItems.Add("Silver", 1); item26.RequiredItems.Add("LeatherFrostedDO", 1); item26.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item26.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Silver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item26.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item27 = new Item("hunter_legacy", "ThrowingWhirlstarCoreBlackmetalDO"); item27.Crafting.Add("MunitionsBenchDO", 1); item27.RequiredItems.Add("BlackMetal", 2); item27.RequiredItems.Add("LeatherTarredDO", 1); item27.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item27.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Black Metal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item27.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item28 = new Item("hunter_legacy", "ThrowingWhirlstarCoreFlametalDO"); item28.Crafting.Add("MunitionsBenchDO", 1); item28.RequiredItems.Add("FlametalNew", 1); item28.RequiredItems.Add("LeatherCharredDO", 1); item28.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item28.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Flametal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item28.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item29 = new Item("hunter_legacy", "BombSmokeEscapeDO"); item29.Crafting.Add("MunitionsBenchDO", 1); item29.RequiredItems.Add("Crystal", 1); item29.RequiredItems.Add("Obsidian", 2); item29.RequiredItems.Add("Coal", 5); item29.RequiredItems.Add("BoneFragments", 5); item29.CraftAmount = 5; MaterialReplacer.RegisterGameObjectForShaderSwap(item29.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bomb Smoke Escape", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item29.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item30 = new Item("hunter_legacy", "SlingshotWoodDO"); item30.Crafting.Add(ItemManager.CraftingTable.Workbench, 1); item30.Crafting.Add("HunterTableDO", 1); item30.RequiredItems.Add("Wood", 8); item30.RequiredItems.Add("LeatherScraps", 6); item30.RequiredUpgradeItems.Add("Wood", 4); item30.RequiredUpgradeItems.Add("LeatherScraps", 3); item30.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item30.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Wood", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item30.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item31 = new Item("hunter_legacy", "SlingshotCorewoodDO"); item31.Crafting.Add("HunterTableDO", 1); item31.RequiredItems.Add("RoundLog", 8); item31.RequiredItems.Add("LeatherResinedDO", 4); item31.RequiredUpgradeItems.Add("RoundLog", 4); item31.RequiredUpgradeItems.Add("LeatherResinedDO", 2); item31.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item31.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Corewood", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item31.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item32 = new Item("hunter_legacy", "SlingshotIronDO"); item32.Crafting.Add("HunterTableDO", 1); item32.RequiredItems.Add("Iron", 10); item32.RequiredItems.Add("LeatherGreasedDO", 6); item32.RequiredUpgradeItems.Add("Iron", 5); item32.RequiredUpgradeItems.Add("LeatherGreasedDO", 3); item32.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item32.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Iron", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item32.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item33 = new Item("hunter_legacy", "SlingshotSilverDO"); item33.Crafting.Add("HunterTableDO", 2); item33.RequiredItems.Add("Silver", 12); item33.RequiredItems.Add("LeatherFrostedDO", 6); item33.RequiredUpgradeItems.Add("Silver", 6); item33.RequiredUpgradeItems.Add("LeatherFrostedDO", 3); item33.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item33.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Silver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item33.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item34 = new Item("hunter_legacy", "SlingshotBlackmetalDO"); item34.Crafting.Add("HunterTableDO", 3); item34.RequiredItems.Add("BlackMetal", 16); item34.RequiredItems.Add("LeatherTarredDO", 6); item34.RequiredUpgradeItems.Add("BlackMetal", 8); item34.RequiredUpgradeItems.Add("LeatherTarredDO", 3); item34.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item34.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Blackmetal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item34.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item35 = new Item("hunter_legacy", "SlingshotCompositeMistlandsDO"); item35.Crafting.Add("HunterTableDO", 4); item35.RequiredItems.Add("Iron", 12); item35.RequiredItems.Add("Bronze", 12); item35.RequiredItems.Add("LeatherSappedDO", 8); item35.RequiredUpgradeItems.Add("Iron", 6); item35.RequiredUpgradeItems.Add("Bronze", 6); item35.RequiredUpgradeItems.Add("LeatherSappedDO", 4); item35.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item35.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Composite Mistlands", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item35.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item36 = new Item("hunter_legacy", "SlingshotCompositeAshlandsDO"); item36.Crafting.Add("HunterTableDO", 4); item36.RequiredItems.Add("FlametalNew", 10); item36.RequiredItems.Add("Silver", 14); item36.RequiredItems.Add("LeatherCharredDO", 8); item36.RequiredUpgradeItems.Add("FlametalNew", 5); item36.RequiredUpgradeItems.Add("Silver", 7); item36.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item36.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item36.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Composite Ashlands", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item36.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item37 = new Item("hunter_legacy", "PelletStoneDO"); item37.Crafting.Add(ItemManager.CraftingTable.Workbench, 1); item37.Crafting.Add("MunitionsBenchDO", 1); item37.RequiredItems.Add("Stone", 4); item37.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item37.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Stone", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item37.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item38 = new Item("hunter_legacy", "PelletObsidianDO"); item38.Crafting.Add("MunitionsBenchDO", 1); item38.RequiredItems.Add("Obsidian", 2); item38.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item38.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Obsidian", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item38.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item39 = new Item("hunter_legacy", "PelletMarbleDO"); item39.Crafting.Add("MunitionsBenchDO", 1); item39.RequiredItems.Add("BlackMarble", 2); item39.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item39.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Marble", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item39.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item40 = new Item("hunter_legacy", "PelletGraustenDO"); item40.Crafting.Add("MunitionsBenchDO", 1); item40.RequiredItems.Add("Grausten", 4); item40.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item40.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Grausten", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item40.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item41 = new Item("hunter_legacy", "ArmorForestSentinelChestDO"); item41.Crafting.Add("HunterTableDO", 1); item41.RequiredItems.Add("Bronze", 2); item41.RequiredItems.Add("LeatherResinedDO", 6); item41.RequiredItems.Add("CoarseThreadDO", 4); item41.RequiredUpgradeItems.Add("Bronze", 2); item41.RequiredUpgradeItems.Add("LeatherResinedDO", 4); item41.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item41.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item41.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item42 = new Item("hunter_legacy", "ArmorForestSentinelLegsDO"); item42.Crafting.Add("HunterTableDO", 1); item42.RequiredItems.Add("Bronze", 2); item42.RequiredItems.Add("LeatherResinedDO", 6); item42.RequiredItems.Add("CoarseThreadDO", 4); item42.RequiredUpgradeItems.Add("Bronze", 2); item42.RequiredUpgradeItems.Add("LeatherResinedDO", 4); item42.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item42.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item42.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item43 = new Item("hunter_legacy", "ArmorForestSentinelHelmetDO"); item43.Crafting.Add("HunterTableDO", 1); item43.RequiredItems.Add("Bronze", 2); item43.RequiredItems.Add("LeatherResinedDO", 6); item43.RequiredItems.Add("CoarseThreadDO", 4); item43.RequiredUpgradeItems.Add("Bronze", 2); item43.RequiredUpgradeItems.Add("LeatherResinedDO", 4); item43.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item43.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item43.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item44 = new Item("hunter_legacy", "ArmorForestSentinelCapeDO"); item44.Crafting.Add("HunterTableDO", 1); item44.RequiredItems.Add("Bronze", 1); item44.RequiredItems.Add("LeatherResinedDO", 4); item44.RequiredItems.Add("CoarseThreadDO", 3); item44.RequiredUpgradeItems.Add("LeatherResinedDO", 1); item44.RequiredUpgradeItems.Add("CoarseThreadDO", 2); item44.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item44.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Cape", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item44.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item45 = new Item("hunter_legacy", "ArmorForestSentinelBeltDO"); item45.Crafting.Add("HunterTableDO", 1); item45.RequiredItems.Add("LeatherResinedDO", 10); item45.RequiredItems.Add("LeatherGreasedDO", 8); item45.RequiredItems.Add("TrophyGreydwarfShaman", 1); item45.RequiredItems.Add("Coins", 100); item45.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item45.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Belt", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item45.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item46 = new Item("hunter_legacy", "ArmorFrostpeakHarrierChestDO"); item46.Crafting.Add("HunterTableDO", 2); item46.RequiredItems.Add("Silver", 4); item46.RequiredItems.Add("LeatherFrostedDO", 12); item46.RequiredItems.Add("CoarseThreadDO", 8); item46.RequiredUpgradeItems.Add("Silver", 2); item46.RequiredUpgradeItems.Add("LeatherFrostedDO", 4); item46.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item46.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item46.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item47 = new Item("hunter_legacy", "ArmorFrostpeakHarrierLegsDO"); item47.Crafting.Add("HunterTableDO", 2); item47.RequiredItems.Add("Silver", 4); item47.RequiredItems.Add("LeatherFrostedDO", 12); item47.RequiredItems.Add("CoarseThreadDO", 8); item47.RequiredUpgradeItems.Add("Silver", 2); item47.RequiredUpgradeItems.Add("LeatherFrostedDO", 4); item47.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item47.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item47.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item48 = new Item("hunter_legacy", "ArmorFrostpeakHarrierHelmetDO"); item48.Crafting.Add("HunterTableDO", 2); item48.RequiredItems.Add("Silver", 4); item48.RequiredItems.Add("LeatherFrostedDO", 12); item48.RequiredItems.Add("CoarseThreadDO", 8); item48.RequiredUpgradeItems.Add("Silver", 2); item48.RequiredUpgradeItems.Add("LeatherFrostedDO", 4); item48.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item48.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item48.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item49 = new Item("hunter_legacy", "ArmorFrostpeakHarrierCapeDO"); item49.Crafting.Add("HunterTableDO", 2); item49.RequiredItems.Add("Silver", 1); item49.RequiredItems.Add("LeatherFrostedDO", 4); item49.RequiredItems.Add("CoarseThreadDO", 3); item49.RequiredItems.Add("Wood", 4); item49.RequiredUpgradeItems.Add("LeatherFrostedDO", 1); item49.RequiredUpgradeItems.Add("CoarseThreadDO", 2); item49.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item49.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item49.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item50 = new Item("hunter_legacy", "ArmorFrostpeakHarrierTrinketDO"); item50.Crafting.Add("HunterTableDO", 2); item50.RequiredItems.Add("CoarseThreadDO", 10); item50.RequiredItems.Add("WolfFang", 9); item50.RequiredItems.Add("WolfClaw", 3); item50.RequiredItems.Add("TrophyWolf", 1); item50.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item50.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Trinket", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item50.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item51 = new Item("hunter_legacy", "ArmorGoldenStriderChestDO"); item51.Crafting.Add("HunterTableDO", 3); item51.RequiredItems.Add("BlackMetal", 5); item51.RequiredItems.Add("LeatherTarredDO", 15); item51.RequiredItems.Add("LinenThread", 10); item51.RequiredUpgradeItems.Add("BlackMetal", 3); item51.RequiredUpgradeItems.Add("LeatherTarredDO", 6); item51.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item51.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item51.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item52 = new Item("hunter_legacy", "ArmorGoldenStriderLegsDO"); item52.Crafting.Add("HunterTableDO", 3); item52.RequiredItems.Add("BlackMetal", 5); item52.RequiredItems.Add("LeatherTarredDO", 15); item52.RequiredItems.Add("LinenThread", 10); item52.RequiredUpgradeItems.Add("BlackMetal", 3); item52.RequiredUpgradeItems.Add("LeatherTarredDO", 6); item52.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item52.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item52.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item53 = new Item("hunter_legacy", "ArmorGoldenStriderHelmetDO"); item53.Crafting.Add("HunterTableDO", 3); item53.RequiredItems.Add("BlackMetal", 5); item53.RequiredItems.Add("LeatherTarredDO", 15); item53.RequiredItems.Add("LinenThread", 10); item53.RequiredUpgradeItems.Add("BlackMetal", 3); item53.RequiredUpgradeItems.Add("LeatherTarredDO", 6); item53.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item53.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item53.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item54 = new Item("hunter_legacy", "ArmorGoldenStriderCapeDO"); item54.Crafting.Add("HunterTableDO", 3); item54.RequiredItems.Add("BlackMetal", 1); item54.RequiredItems.Add("LeatherTarredDO", 4); item54.RequiredItems.Add("LinenThread", 3); item54.RequiredItems.Add("FineWood", 6); item54.RequiredUpgradeItems.Add("LeatherTarredDO", 1); item54.RequiredUpgradeItems.Add("LinenThread", 2); item54.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item54.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item54.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item55 = new Item("hunter_legacy", "ArmorGoldenStriderBeltDO"); item55.Crafting.Add("HunterTableDO", 3); item55.RequiredItems.Add("LeatherTarredDO", 15); item55.RequiredItems.Add("Bronze", 12); item55.RequiredItems.Add("TrophyGoblinShaman", 1); item55.RequiredItems.Add("TrophyDeathsquito", 1); item55.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item55.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Belt", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item55.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item56 = new Item("hunter_legacy", "ArmorSapphireFalconChestDO"); item56.Crafting.Add("HunterTableDO", 4); item56.RequiredItems.Add("Carapace", 8); item56.RequiredItems.Add("LeatherSappedDO", 10); item56.RequiredItems.Add("LinenThread", 12); item56.RequiredUpgradeItems.Add("Carapace", 4); item56.RequiredUpgradeItems.Add("LeatherSappedDO", 5); item56.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item56.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item56.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item57 = new Item("hunter_legacy", "ArmorSapphireFalconLegsDO"); item57.Crafting.Add("HunterTableDO", 4); item57.RequiredItems.Add("Carapace", 8); item57.RequiredItems.Add("LeatherSappedDO", 10); item57.RequiredItems.Add("LinenThread", 12); item57.RequiredUpgradeItems.Add("Carapace", 4); item57.RequiredUpgradeItems.Add("LeatherSappedDO", 5); item57.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item57.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item57.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item58 = new Item("hunter_legacy", "ArmorSapphireFalconHelmetDO"); item58.Crafting.Add("HunterTableDO", 4); item58.RequiredItems.Add("Carapace", 8); item58.RequiredItems.Add("LeatherSappedDO", 10); item58.RequiredItems.Add("LinenThread", 10); item58.RequiredUpgradeItems.Add("Carapace", 4); item58.RequiredUpgradeItems.Add("LeatherSappedDO", 5); item58.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item58.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item58.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item59 = new Item("hunter_legacy", "ArmorSapphireFalconCapeDO"); item59.Crafting.Add("HunterTableDO", 4); item59.RequiredItems.Add("Carapace", 2); item59.RequiredItems.Add("LeatherSappedDO", 6); item59.RequiredItems.Add("LinenThread", 3); item59.RequiredItems.Add("YggdrasilWood", 6); item59.RequiredUpgradeItems.Add("Carapace", 2); item59.RequiredUpgradeItems.Add("LeatherSappedDO", 3); item59.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item59.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item59.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item60 = new Item("hunter_legacy", "ArmorSapphireFalconTrinketDO"); item60.Crafting.Add("HunterTableDO", 4); item60.RequiredItems.Add("LeatherSappedDO", 10); item60.RequiredItems.Add("Eitr", 12); item60.RequiredItems.Add("Bilebag", 3); item60.RequiredItems.Add("TrophyDvergr", 1); item60.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item60.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Trinket", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item60.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item61 = new Item("hunter_legacy", "ArmorNocturneArrowChestDO"); item61.Crafting.Add("HunterTableDO", 4); item61.RequiredItems.Add("Carapace", 4); item61.RequiredItems.Add("LeatherSappedDO", 14); item61.RequiredItems.Add("LinenThread", 12); item61.RequiredUpgradeItems.Add("Carapace", 2); item61.RequiredUpgradeItems.Add("LeatherSappedDO", 7); item61.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item61.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item61.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item62 = new Item("hunter_legacy", "ArmorNocturneArrowLegsDO"); item62.Crafting.Add("HunterTableDO", 4); item62.RequiredItems.Add("Carapace", 4); item62.RequiredItems.Add("LeatherSappedDO", 14); item62.RequiredItems.Add("LinenThread", 12); item62.RequiredUpgradeItems.Add("Carapace", 2); item62.RequiredUpgradeItems.Add("LeatherSappedDO", 7); item62.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item62.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item62.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item63 = new Item("hunter_legacy", "ArmorNocturneArrowHelmetDO"); item63.Crafting.Add("HunterTableDO", 4); item63.RequiredItems.Add("Carapace", 4); item63.RequiredItems.Add("LeatherSappedDO", 14); item63.RequiredItems.Add("LinenThread", 12); item63.RequiredUpgradeItems.Add("Carapace", 2); item63.RequiredUpgradeItems.Add("LeatherSappedDO", 7); item63.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item63.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item63.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item64 = new Item("hunter_legacy", "ArmorNocturneArrowCapeDO"); item64.Crafting.Add("HunterTableDO", 4); item64.RequiredItems.Add("Carapace", 4); item64.RequiredItems.Add("LeatherSappedDO", 12); item64.RequiredItems.Add("LinenThread", 18); item64.RequiredItems.Add("YggdrasilWood", 12); item64.RequiredUpgradeItems.Add("Carapace", 2); item64.RequiredUpgradeItems.Add("LeatherSappedDO", 6); item64.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item64.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Cape", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item64.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item65 = new Item("hunter_legacy", "ArmorAshenExileChestDO"); item65.Crafting.Add("HunterTableDO", 4); item65.RequiredItems.Add("FlametalNew", 6); item65.RequiredItems.Add("Eitr", 6); item65.RequiredItems.Add("LeatherCharredDO", 14); item65.RequiredItems.Add("LinenThread", 12); item65.RequiredUpgradeItems.Add("FlametalNew", 2); item65.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item65.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item65.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item65.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item66 = new Item("hunter_legacy", "ArmorAshenExileLegsDO"); item66.Crafting.Add("HunterTableDO", 4); item66.RequiredItems.Add("FlametalNew", 6); item66.RequiredItems.Add("Eitr", 6); item66.RequiredItems.Add("LeatherCharredDO", 14); item66.RequiredItems.Add("LinenThread", 12); item66.RequiredUpgradeItems.Add("FlametalNew", 2); item66.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item66.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item66.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item66.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item67 = new Item("hunter_legacy", "ArmorAshenExileHelmetDO"); item67.Crafting.Add("HunterTableDO", 4); item67.RequiredItems.Add("FlametalNew", 6); item67.RequiredItems.Add("Eitr", 6); item67.RequiredItems.Add("LeatherCharredDO", 14); item67.RequiredItems.Add("LinenThread", 12); item67.RequiredUpgradeItems.Add("FlametalNew", 2); item67.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item67.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item67.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item67.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item68 = new Item("hunter_legacy", "ArmorAshenExileCapeDO"); item68.Crafting.Add("HunterTableDO", 4); item68.RequiredItems.Add("FlametalNew", 2); item68.RequiredItems.Add("LeatherCharredDO", 6); item68.RequiredItems.Add("LinenThread", 4); item68.RequiredItems.Add("Blackwood", 4); item68.RequiredUpgradeItems.Add("FlametalNew", 1); item68.RequiredUpgradeItems.Add("LeatherCharredDO", 3); item68.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item68.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item68.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item69 = new Item("hunter_legacy", "ArmorAshenExileTrinketDO"); item69.Crafting.Add("HunterTableDO", 4); item69.RequiredItems.Add("GemstoneRed", 1); item69.RequiredItems.Add("ProustitePowder", 20); item69.RequiredItems.Add("TrophyFallenValkyrie", 1); item69.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item69.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Trinket", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item69.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item70 = new Item("hunter_legacy", "ArmorGraveMercenaryChestDO"); item70.Crafting.Add("HunterTableDO", 1); item70.RequiredItems.Add("Iron", 6); item70.RequiredItems.Add("LeatherGreasedDO", 12); item70.RequiredItems.