Decompiled source of Hunter Legacy v1.0.4
plugins/Hunter_Legacy.dll
Decompiled 4 days 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.4")] [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.4.0")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [<be006173-3ddd-49e7-a8b7-c10975726bfb>Embedded] internal sealed class <be006173-3ddd-49e7-a8b7-c10975726bfb>EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [<be006173-3ddd-49e7-a8b7-c10975726bfb>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class <1be475c1-8b94-4f1c-9b50-a483fc45b70d>NullableAttribute : Attribute { public readonly byte[] NullableFlags; public <1be475c1-8b94-4f1c-9b50-a483fc45b70d>NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public <1be475c1-8b94-4f1c-9b50-a483fc45b70d>NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [<be006173-3ddd-49e7-a8b7-c10975726bfb>Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class <48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContextAttribute : Attribute { public readonly byte Flag; public <48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContextAttribute(byte P_0) { Flag = P_0; } } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [HarmonyPatch(typeof(ArcheryTarget), "Start")] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] public static class ArcheryTargetCustomProjectile { [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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.")); } } } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] 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); } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] 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 { [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>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); } } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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); } } [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>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)); } } [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>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); } } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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<[<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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 { [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>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; } } } [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] 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); } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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)); } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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); } } [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] 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")] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] 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); } } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>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); } } [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>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 { [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>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); } } } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [HarmonyPatch(typeof(Humanoid), "SetupVisEquipment")] 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 { [BepInPlugin("Dreanegade.Hunter_Legacy", "Hunter_Legacy", "1.0.4")] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(0)] [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(1)] public class Hunter_LegacyPlugin : BaseUnityPlugin { [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(0)] public enum Toggle { On = 1, Off = 0 } [<48d30504-8d1c-4900-bf90-c5820a5bd3a4>NullableContext(0)] private class ConfigurationManagerAttributes { [UsedImplicitly] public int? Order; [UsedImplicitly] public bool? Browsable; [UsedImplicitly] [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(2)] public string Category; [<1be475c1-8b94-4f1c-9b50-a483fc45b70d>Nullable(new byte[] { 2, 1 })] [UsedImplicitly] public Action<ConfigEntryBase> CustomDrawer; } internal const string ModName = "Hunter_Legacy"; internal const string ModVersion = "1.0.4"; 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, "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, "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", "LeatherResinedDO"); item4.Crafting.Add("HunterTableDO", 1); item4.RequiredItems.Add("DeerHide", 1); item4.RequiredItems.Add("Resin", 3); item4.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item4.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Resined", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item4.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item5 = new Item("hunter_legacy", "LeatherGreasedDO"); item5.Crafting.Add("HunterTableDO", 1); item5.RequiredItems.Add("TrollHide", 1); item5.RequiredItems.Add("RawMeat", 2); item5.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item5.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Greased", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item5.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item6 = new Item("hunter_legacy", "LeatherFrostedDO"); item6.Crafting.Add("HunterTableDO", 1); item6.RequiredItems.Add("WolfPelt", 1); item6.RequiredItems.Add("FreezeGland", 1); item6.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item6.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Frosted", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item6.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item7 = new Item("hunter_legacy", "LeatherTarredDO"); item7.Crafting.Add("HunterTableDO", 1); item7.RequiredItems.Add("LoxPelt", 1); item7.RequiredItems.Add("Tar", 1); item7.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item7.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Tarred", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item7.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item8 = new Item("hunter_legacy", "LeatherSappedDO"); item8.Crafting.Add("HunterTableDO", 1); item8.RequiredItems.Add("ScaleHide", 1); item8.RequiredItems.Add("Sap", 2); item8.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item8.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Sapped", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item8.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item9 = new Item("hunter_legacy", "LeatherCharredDO"); item9.Crafting.Add("HunterTableDO", 1); item9.RequiredItems.Add("AskHide", 1); item9.RequiredItems.Add("CharcoalResin", 1); item9.CraftAmount = 2; MaterialReplacer.RegisterGameObjectForShaderSwap(item9.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Leather Charred", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item9.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item10 = new Item("hunter_legacy", "BoltFlintDO"); item10.Crafting.Add("MunitionsBenchDO", 1); item10.RequiredItems.Add("Flint", 2); item10.RequiredItems.Add("Wood", 8); item10.RequiredItems.Add("Feathers", 2); item10.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item10.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Flint", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item10.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item11 = new Item("hunter_legacy", "BoltStoneDO"); item11.Crafting.Add("MunitionsBenchDO", 1); item11.RequiredItems.Add("Stone", 4); item11.RequiredItems.Add("RoundLog", 8); item11.RequiredItems.Add("Feathers", 2); item11.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item11.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Stone", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item11.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item12 = new Item("hunter_legacy", "BoltBoneDO"); item12.Crafting.Add("MunitionsBenchDO", 1); item12.RequiredItems.Add("WitheredBone", 2); item12.RequiredItems.Add("ElderBark", 2); item12.RequiredItems.Add("Feathers", 2); item12.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item12.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Bone", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item12.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item13 = new Item("hunter_legacy", "BoltObsidianDO"); item13.Crafting.Add("MunitionsBenchDO", 1); item13.RequiredItems.Add("Obsidian", 4); item13.RequiredItems.Add("Wood", 8); item13.RequiredItems.Add("Feathers", 2); item13.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item13.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Obsidian", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item13.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item14 = new Item("hunter_legacy", "BoltCrystalDO"); item14.Crafting.Add("MunitionsBenchDO", 1); item14.RequiredItems.Add("Crystal", 2); item14.RequiredItems.Add("Wood", 8); item14.RequiredItems.Add("Feathers", 2); item14.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item14.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Crystal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item14.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item15 = new Item("hunter_legacy", "BoltMarbleDO"); item15.Crafting.Add("MunitionsBenchDO", 1); item15.RequiredItems.Add("BlackMarble", 2); item15.RequiredItems.Add("Wood", 8); item15.RequiredItems.Add("Feathers", 2); item15.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item15.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Marble", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item15.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item16 = new Item("hunter_legacy", "BoltSyringePoisonDO"); item16.Crafting.Add("MunitionsBenchDO", 1); item16.RequiredItems.Add("Ooze", 3); item16.RequiredItems.Add("BlackMetal", 1); item16.RequiredItems.Add("Feathers", 2); item16.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item16.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bolt Syringe Poison", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item16.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item17 = new Item("hunter_legacy", "ThrowingKnifeCoreBronzeDO"); item17.Crafting.Add("MunitionsBenchDO", 1); item17.RequiredItems.Add("Bronze", 1); item17.RequiredItems.Add("LeatherResinedDO", 1); item17.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item17.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Bronze", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item17.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item18 = new Item("hunter_legacy", "ThrowingKnifeCoreIronDO"); item18.Crafting.Add("MunitionsBenchDO", 1); item18.RequiredItems.Add("Iron", 1); item18.RequiredItems.Add("LeatherGreasedDO", 1); item18.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item18.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Iron", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item18.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item19 = new Item("hunter_legacy", "ThrowingKnifeCoreSilverDO"); item19.Crafting.Add("MunitionsBenchDO", 1); item19.RequiredItems.Add("Silver", 1); item19.RequiredItems.Add("LeatherFrostedDO", 1); item19.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item19.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Silver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item19.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item20 = new Item("hunter_legacy", "ThrowingKnifeCoreBlackmetalDO"); item20.Crafting.Add("MunitionsBenchDO", 1); item20.RequiredItems.Add("BlackMetal", 1); item20.RequiredItems.Add("LeatherTarredDO", 1); item20.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item20.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Blackmetal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item20.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item21 = new Item("hunter_legacy", "ThrowingKnifeCoreFlametalDO"); item21.Crafting.Add("MunitionsBenchDO", 1); item21.RequiredItems.Add("FlametalNew", 1); item21.RequiredItems.Add("LeatherCharredDO", 1); item21.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item21.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Knife Core Flametal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item21.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item22 = new Item("hunter_legacy", "ThrowingWhirlstarCoreBronzeDO"); item22.Crafting.Add("MunitionsBenchDO", 1); item22.RequiredItems.Add("Bronze", 1); item22.RequiredItems.Add("LeatherResinedDO", 1); item22.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item22.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Bronze", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item22.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item23 = new Item("hunter_legacy", "ThrowingWhirlstarCoreIronDO"); item23.Crafting.Add("MunitionsBenchDO", 1); item23.RequiredItems.Add("Iron", 1); item23.RequiredItems.Add("LeatherGreasedDO", 1); item23.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item23.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Iron", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item23.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item24 = new Item("hunter_legacy", "ThrowingWhirlstarCoreSilverDO"); item24.Crafting.Add("MunitionsBenchDO", 1); item24.RequiredItems.Add("Silver", 1); item24.RequiredItems.Add("LeatherFrostedDO", 1); item24.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item24.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Silver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item24.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item25 = new Item("hunter_legacy", "ThrowingWhirlstarCoreBlackmetalDO"); item25.Crafting.Add("MunitionsBenchDO", 1); item25.RequiredItems.Add("BlackMetal", 2); item25.RequiredItems.Add("LeatherTarredDO", 1); item25.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item25.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Black Metal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item25.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item26 = new Item("hunter_legacy", "ThrowingWhirlstarCoreFlametalDO"); item26.Crafting.Add("MunitionsBenchDO", 1); item26.RequiredItems.Add("FlametalNew", 1); item26.RequiredItems.Add("LeatherCharredDO", 1); item26.CraftAmount = 100; MaterialReplacer.RegisterGameObjectForShaderSwap(item26.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Throwing Whirlstar Core Flametal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item26.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item27 = new Item("hunter_legacy", "BombSmokeEscapeDO"); item27.Crafting.Add("MunitionsBenchDO", 1); item27.RequiredItems.Add("Crystal", 1); item27.RequiredItems.Add("Obsidian", 2); item27.RequiredItems.Add("Coal", 5); item27.RequiredItems.Add("BoneFragments", 5); item27.CraftAmount = 5; MaterialReplacer.RegisterGameObjectForShaderSwap(item27.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Bomb Smoke Escape", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item27.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item28 = new Item("hunter_legacy", "SlingshotWoodDO"); item28.Crafting.Add(ItemManager.CraftingTable.Workbench, 1); item28.Crafting.Add("HunterTableDO", 1); item28.RequiredItems.Add("Wood", 8); item28.RequiredItems.Add("LeatherScraps", 6); item28.RequiredUpgradeItems.Add("Wood", 4); item28.RequiredUpgradeItems.Add("LeatherScraps", 3); item28.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item28.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Wood", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item28.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item29 = new Item("hunter_legacy", "SlingshotCorewoodDO"); item29.Crafting.Add("HunterTableDO", 1); item29.RequiredItems.Add("RoundLog", 8); item29.RequiredItems.Add("LeatherResinedDO", 4); item29.RequiredUpgradeItems.Add("RoundLog", 4); item29.RequiredUpgradeItems.Add("LeatherResinedDO", 2); item29.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item29.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Corewood", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item29.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item30 = new Item("hunter_legacy", "SlingshotIronDO"); item30.Crafting.Add("HunterTableDO", 1); item30.RequiredItems.Add("Iron", 10); item30.RequiredItems.Add("LeatherGreasedDO", 6); item30.RequiredUpgradeItems.Add("Iron", 5); item30.RequiredUpgradeItems.Add("LeatherGreasedDO", 3); item30.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item30.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Iron", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item30.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item31 = new Item("hunter_legacy", "SlingshotSilverDO"); item31.Crafting.Add("HunterTableDO", 2); item31.RequiredItems.Add("Silver", 12); item31.RequiredItems.Add("LeatherFrostedDO", 6); item31.RequiredUpgradeItems.Add("Silver", 6); item31.RequiredUpgradeItems.Add("LeatherFrostedDO", 3); item31.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item31.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Silver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item31.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item32 = new Item("hunter_legacy", "SlingshotBlackmetalDO"); item32.Crafting.Add("HunterTableDO", 3); item32.RequiredItems.Add("BlackMetal", 16); item32.RequiredItems.Add("LeatherTarredDO", 6); item32.RequiredUpgradeItems.Add("BlackMetal", 8); item32.RequiredUpgradeItems.Add("LeatherTarredDO", 3); item32.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item32.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Blackmetal", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item32.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item33 = new Item("hunter_legacy", "SlingshotCompositeMistlandsDO"); item33.Crafting.Add("HunterTableDO", 4); item33.RequiredItems.Add("Iron", 12); item33.RequiredItems.Add("Bronze", 12); item33.RequiredItems.Add("LeatherSappedDO", 8); item33.RequiredUpgradeItems.Add("Iron", 6); item33.RequiredUpgradeItems.Add("Bronze", 6); item33.RequiredUpgradeItems.Add("LeatherSappedDO", 4); item33.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item33.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Composite Mistlands", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item33.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item34 = new Item("hunter_legacy", "SlingshotCompositeAshlandsDO"); item34.Crafting.Add("HunterTableDO", 4); item34.RequiredItems.Add("FlametalNew", 10); item34.RequiredItems.Add("Silver", 14); item34.RequiredItems.Add("LeatherCharredDO", 8); item34.RequiredUpgradeItems.Add("FlametalNew", 5); item34.RequiredUpgradeItems.Add("Silver", 7); item34.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item34.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item34.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Slingshot Composite Ashlands", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item34.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item35 = new Item("hunter_legacy", "PelletStoneDO"); item35.Crafting.Add(ItemManager.CraftingTable.Workbench, 1); item35.Crafting.Add("MunitionsBenchDO", 1); item35.RequiredItems.Add("Stone", 4); item35.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item35.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Stone", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item35.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item36 = new Item("hunter_legacy", "PelletObsidianDO"); item36.Crafting.Add("MunitionsBenchDO", 1); item36.RequiredItems.Add("Obsidian", 2); item36.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item36.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Obsidian", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item36.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item37 = new Item("hunter_legacy", "PelletMarbleDO"); item37.Crafting.Add("MunitionsBenchDO", 1); item37.RequiredItems.Add("BlackMarble", 2); item37.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item37.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Marble", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item37.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item38 = new Item("hunter_legacy", "PelletGraustenDO"); item38.Crafting.Add("MunitionsBenchDO", 1); item38.RequiredItems.Add("Grausten", 4); item38.CraftAmount = 20; MaterialReplacer.RegisterGameObjectForShaderSwap(item38.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Pellet Grausten", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item38.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item39 = new Item("hunter_legacy", "ArmorForestSentinelChestDO"); item39.Crafting.Add("HunterTableDO", 1); item39.RequiredItems.Add("Bronze", 2); item39.RequiredItems.Add("LeatherResinedDO", 6); item39.RequiredItems.Add("CoarseThreadDO", 4); item39.RequiredUpgradeItems.Add("Bronze", 2); item39.RequiredUpgradeItems.Add("LeatherResinedDO", 4); item39.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item39.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item39.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item40 = new Item("hunter_legacy", "ArmorForestSentinelLegsDO"); item40.Crafting.Add("HunterTableDO", 1); item40.RequiredItems.Add("Bronze", 2); item40.RequiredItems.Add("LeatherResinedDO", 6); item40.RequiredItems.Add("CoarseThreadDO", 4); item40.RequiredUpgradeItems.Add("Bronze", 2); item40.RequiredUpgradeItems.Add("LeatherResinedDO", 4); item40.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item40.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item40.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item41 = new Item("hunter_legacy", "ArmorForestSentinelHelmetDO"); 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 Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item41.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item42 = new Item("hunter_legacy", "ArmorForestSentinelCapeDO"); item42.Crafting.Add("HunterTableDO", 1); item42.RequiredItems.Add("Bronze", 1); item42.RequiredItems.Add("LeatherResinedDO", 4); item42.RequiredItems.Add("CoarseThreadDO", 3); item42.RequiredUpgradeItems.Add("LeatherResinedDO", 1); item42.RequiredUpgradeItems.Add("CoarseThreadDO", 2); item42.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item42.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Cape", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item42.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item43 = new Item("hunter_legacy", "ArmorForestSentinelBeltDO"); item43.Crafting.Add("HunterTableDO", 1); item43.RequiredItems.Add("LeatherResinedDO", 10); item43.RequiredItems.Add("LeatherGreasedDO", 8); item43.RequiredItems.Add("TrophyGreydwarfShaman", 1); item43.RequiredItems.Add("Coins", 100); item43.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item43.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Forest Sentinel Belt", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item43.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item44 = new Item("hunter_legacy", "ArmorFrostpeakHarrierChestDO"); item44.Crafting.Add("HunterTableDO", 2); item44.RequiredItems.Add("Silver", 4); item44.RequiredItems.Add("LeatherFrostedDO", 12); item44.RequiredItems.Add("CoarseThreadDO", 8); item44.RequiredUpgradeItems.Add("Silver", 2); item44.RequiredUpgradeItems.Add("LeatherFrostedDO", 4); item44.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item44.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item44.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item45 = new Item("hunter_legacy", "ArmorFrostpeakHarrierLegsDO"); item45.Crafting.Add("HunterTableDO", 2); item45.RequiredItems.Add("Silver", 4); item45.RequiredItems.Add("LeatherFrostedDO", 12); item45.RequiredItems.Add("CoarseThreadDO", 8); item45.RequiredUpgradeItems.Add("Silver", 2); item45.RequiredUpgradeItems.Add("LeatherFrostedDO", 4); item45.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item45.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item45.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item46 = new Item("hunter_legacy", "ArmorFrostpeakHarrierHelmetDO"); 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 Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item46.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item47 = new Item("hunter_legacy", "ArmorFrostpeakHarrierCapeDO"); item47.Crafting.Add("HunterTableDO", 2); item47.RequiredItems.Add("Silver", 1); item47.RequiredItems.Add("LeatherFrostedDO", 4); item47.RequiredItems.Add("CoarseThreadDO", 3); item47.RequiredItems.Add("Wood", 4); item47.RequiredUpgradeItems.Add("LeatherFrostedDO", 1); item47.RequiredUpgradeItems.Add("CoarseThreadDO", 2); item47.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item47.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item47.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item48 = new Item("hunter_legacy", "ArmorFrostpeakHarrierTrinketDO"); item48.Crafting.Add("HunterTableDO", 2); item48.RequiredItems.Add("CoarseThreadDO", 10); item48.RequiredItems.Add("WolfFang", 9); item48.RequiredItems.Add("WolfClaw", 3); item48.RequiredItems.Add("TrophyWolf", 1); item48.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item48.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Frostpeak Harrier Trinket", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item48.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item49 = new Item("hunter_legacy", "ArmorGoldenStriderChestDO"); item49.Crafting.Add("HunterTableDO", 3); item49.RequiredItems.Add("BlackMetal", 5); item49.RequiredItems.Add("LeatherTarredDO", 15); item49.RequiredItems.Add("LinenThread", 10); item49.RequiredUpgradeItems.Add("BlackMetal", 3); item49.RequiredUpgradeItems.Add("LeatherTarredDO", 6); item49.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item49.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item49.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item50 = new Item("hunter_legacy", "ArmorGoldenStriderLegsDO"); item50.Crafting.Add("HunterTableDO", 3); item50.RequiredItems.Add("BlackMetal", 5); item50.RequiredItems.Add("LeatherTarredDO", 15); item50.RequiredItems.Add("LinenThread", 10); item50.RequiredUpgradeItems.Add("BlackMetal", 3); item50.RequiredUpgradeItems.Add("LeatherTarredDO", 6); item50.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item50.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item50.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item51 = new Item("hunter_legacy", "ArmorGoldenStriderHelmetDO"); 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 Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item51.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item52 = new Item("hunter_legacy", "ArmorGoldenStriderCapeDO"); item52.Crafting.Add("HunterTableDO", 3); item52.RequiredItems.Add("BlackMetal", 1); item52.RequiredItems.Add("LeatherTarredDO", 4); item52.RequiredItems.Add("LinenThread", 3); item52.RequiredItems.Add("FineWood", 6); item52.RequiredUpgradeItems.Add("LeatherTarredDO", 1); item52.RequiredUpgradeItems.Add("LinenThread", 2); item52.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item52.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item52.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item53 = new Item("hunter_legacy", "ArmorGoldenStriderBeltDO"); item53.Crafting.Add("HunterTableDO", 3); item53.RequiredItems.Add("LeatherTarredDO", 15); item53.RequiredItems.Add("Bronze", 12); item53.RequiredItems.Add("TrophyGoblinShaman", 1); item53.RequiredItems.Add("TrophyDeathsquito", 1); item53.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item53.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Golden Strider Belt", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item53.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item54 = new Item("hunter_legacy", "ArmorSapphireFalconChestDO"); item54.Crafting.Add("HunterTableDO", 4); item54.RequiredItems.Add("Carapace", 8); item54.RequiredItems.Add("LeatherSappedDO", 12); item54.RequiredItems.Add("LinenThread", 12); item54.RequiredUpgradeItems.Add("Carapace", 4); item54.RequiredUpgradeItems.Add("LeatherSappedDO", 6); item54.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item54.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item54.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item55 = new Item("hunter_legacy", "ArmorSapphireFalconLegsDO"); item55.Crafting.Add("HunterTableDO", 4); item55.RequiredItems.Add("Carapace", 8); item55.RequiredItems.Add("LeatherSappedDO", 12); item55.RequiredItems.Add("LinenThread", 12); item55.RequiredUpgradeItems.Add("Carapace", 4); item55.RequiredUpgradeItems.Add("LeatherSappedDO", 6); item55.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item55.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item55.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item56 = new Item("hunter_legacy", "ArmorSapphireFalconHelmetDO"); item56.Crafting.Add("HunterTableDO", 4); item56.RequiredItems.Add("Carapace", 8); item56.RequiredItems.Add("LeatherSappedDO", 12); item56.RequiredItems.Add("LinenThread", 10); item56.RequiredUpgradeItems.Add("Carapace", 4); item56.RequiredUpgradeItems.Add("LeatherSappedDO", 6); item56.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item56.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item56.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item57 = new Item("hunter_legacy", "ArmorSapphireFalconCapeDO"); item57.Crafting.Add("HunterTableDO", 4); item57.RequiredItems.Add("Carapace", 2); item57.RequiredItems.Add("LeatherSappedDO", 6); item57.RequiredItems.Add("LinenThread", 3); item57.RequiredItems.Add("YggdrasilWood", 6); item57.RequiredUpgradeItems.Add("Carapace", 2); item57.RequiredUpgradeItems.Add("LeatherSappedDO", 3); item57.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item57.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item57.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item58 = new Item("hunter_legacy", "ArmorSapphireFalconTrinketDO"); item58.Crafting.Add("HunterTableDO", 4); item58.RequiredItems.Add("LeatherSappedDO", 10); item58.RequiredItems.Add("Eitr", 12); item58.RequiredItems.Add("Bilebag", 3); item58.RequiredItems.Add("TrophyDvergr", 1); item58.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item58.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Sapphire Falcon Trinket", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item58.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item59 = new Item("hunter_legacy", "ArmorNocturneArrowChestDO"); item59.Crafting.Add("HunterTableDO", 4); item59.RequiredItems.Add("Carapace", 4); item59.RequiredItems.Add("LeatherSappedDO", 18); item59.RequiredItems.Add("LinenThread", 12); item59.RequiredUpgradeItems.Add("Carapace", 2); item59.RequiredUpgradeItems.Add("LeatherSappedDO", 8); item59.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item59.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item59.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item60 = new Item("hunter_legacy", "ArmorNocturneArrowLegsDO"); item60.Crafting.Add("HunterTableDO", 4); item60.RequiredItems.Add("Carapace", 4); item60.RequiredItems.Add("LeatherSappedDO", 18); item60.RequiredItems.Add("LinenThread", 12); item60.RequiredUpgradeItems.Add("Carapace", 2); item60.RequiredUpgradeItems.Add("LeatherSappedDO", 8); item60.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item60.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item60.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item61 = new Item("hunter_legacy", "ArmorNocturneArrowHelmetDO"); item61.Crafting.Add("HunterTableDO", 4); item61.RequiredItems.Add("Carapace", 4); item61.RequiredItems.Add("LeatherSappedDO", 18); item61.RequiredItems.Add("LinenThread", 12); item61.RequiredUpgradeItems.Add("Carapace", 2); item61.RequiredUpgradeItems.Add("LeatherSappedDO", 8); item61.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item61.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item61.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item62 = new Item("hunter_legacy", "ArmorNocturneArrowCapeDO"); item62.Crafting.Add("HunterTableDO", 4); item62.RequiredItems.Add("Carapace", 4); item62.RequiredItems.Add("LeatherSappedDO", 12); item62.RequiredItems.Add("LinenThread", 18); item62.RequiredItems.Add("YggdrasilWood", 12); item62.RequiredUpgradeItems.Add("Carapace", 2); item62.RequiredUpgradeItems.Add("LeatherSappedDO", 6); item62.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item62.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Nocturne Arrow Cape", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item62.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item63 = new Item("hunter_legacy", "ArmorAshenExileChestDO"); item63.Crafting.Add("HunterTableDO", 4); item63.RequiredItems.Add("FlametalNew", 6); item63.RequiredItems.Add("Eitr", 6); item63.RequiredItems.Add("LeatherCharredDO", 14); item63.RequiredItems.Add("LinenThread", 12); item63.RequiredUpgradeItems.Add("FlametalNew", 2); item63.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item63.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item63.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item63.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item64 = new Item("hunter_legacy", "ArmorAshenExileLegsDO"); item64.Crafting.Add("HunterTableDO", 4); item64.RequiredItems.Add("FlametalNew", 6); item64.RequiredItems.Add("Eitr", 6); item64.RequiredItems.Add("LeatherCharredDO", 14); item64.RequiredItems.Add("LinenThread", 12); item64.RequiredUpgradeItems.Add("FlametalNew", 2); item64.RequiredUpgradeItems.Add("LeatherCharredDO", 4); item64.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item64.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item64.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item65 = new Item("hunter_legacy", "ArmorAshenExileHelmetDO"); 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 Helmet", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item65.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item66 = new Item("hunter_legacy", "ArmorAshenExileCapeDO"); item66.Crafting.Add("HunterTableDO", 4); item66.RequiredItems.Add("FlametalNew", 2); item66.RequiredItems.Add("LeatherCharredDO", 6); item66.RequiredItems.Add("LinenThread", 4); item66.RequiredItems.Add("Blackwood", 4); item66.RequiredUpgradeItems.Add("FlametalNew", 1); item66.RequiredUpgradeItems.Add("LeatherCharredDO", 3); item66.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item66.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Quiver", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item66.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item67 = new Item("hunter_legacy", "ArmorAshenExileTrinketDO"); item67.Crafting.Add("HunterTableDO", 4); item67.RequiredItems.Add("GemstoneRed", 1); item67.RequiredItems.Add("ProustitePowder", 20); item67.RequiredItems.Add("TrophyFallenValkyrie", 1); item67.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item67.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Ashen Exile Trinket", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item67.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item68 = new Item("hunter_legacy", "ArmorGraveMercenaryChestDO"); item68.Crafting.Add("HunterTableDO", 1); item68.RequiredItems.Add("Iron", 6); item68.RequiredItems.Add("LeatherGreasedDO", 12); item68.RequiredItems.Add("CoarseThreadDO", 4); item68.RequiredUpgradeItems.Add("Iron", 3); item68.RequiredUpgradeItems.Add("LeatherGreasedDO", 3); item68.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item68.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Grave Mercenary Chest", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item68.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item69 = new Item("hunter_legacy", "ArmorGraveMercenaryLegsDO"); item69.Crafting.Add("HunterTableDO", 1); item69.RequiredItems.Add("Iron", 6); item69.RequiredItems.Add("LeatherGreasedDO", 12); item69.RequiredItems.Add("CoarseThreadDO", 4); item69.RequiredUpgradeItems.Add("Iron", 3); item69.RequiredUpgradeItems.Add("LeatherGreasedDO", 3); item69.CraftAmount = 1; MaterialReplacer.RegisterGameObjectForShaderSwap(item69.Prefab, MaterialReplacer.ShaderType.UseUnityShader); _recipeIsActiveConfig = config("Grave Mercenary Legs", "IsRecipeEnabled", Toggle.On, "Determines if the recipe is enabled for this prefab"); item69.RecipeIsActive = (ConfigEntryBase)(object)_recipeIsActiveConfig; Item item70 = new Item("hunter_legacy", "ArmorGraveMercenaryHelmetDO"); item70.Crafting.Add("HunterTableDO", 1); item70.RequiredItems.Add("Iron", 6); item70.RequiredItems.Add("LeatherGreasedDO", 12); item70.RequiredItems.Add("CoarseThreadDO", 4); item70.RequiredUpgrad