using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Bifrost.ConstEnum; using Bifrost.Cooked; using Bifrost.ItemMiscellany; using Bifrost.LocalizationData; using HarmonyLib; using ItemsAPI; using ItemsAPI.Builders; using ItemsAPI.Descriptors; using ItemsAPI.Enums; using ItemsAPI.Helpers; using MelonLoader; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(global::ItemsAPI.ItemsAPI), "ItemsAPI", "0.1.0", "Shlygly", null)] [assembly: MelonGame("ReLUGames", "MIMESIS")] [assembly: MelonColor(255, 0, 128, 0)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Shlygly")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("ItemsAPI")] [assembly: AssemblyTitle("ItemsAPI")] [assembly: NeutralResourcesLanguage("en-US")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace ItemsAPI { public class ItemsAPI : MelonMod { public static ItemsAPI Instance { get; private set; } public override void OnInitializeMelon() { Instance = this; ((MelonBase)this).LoggerInstance.Msg("API Ready to use !"); } public static void Log(object msg) { if (msg is Exception) { ((MelonBase)Instance).LoggerInstance.Error(msg); } else { ((MelonBase)Instance).LoggerInstance.Msg(msg); } } } } namespace ItemsAPI.Patches { [HarmonyPatch(typeof(Hub), "Start")] internal static class Hub_Start { private static void Postfix() { try { ItemsAPI.Log("Initializing loot item builder..."); LootItemBuilder.Initialize(); int num = LootItemBuilder.Items.Length; ItemsAPI.Log($"Adding {num} item(s)..."); int num2 = LootItemBuilder.BuildAllItems().Length; ItemsAPI.Log($"{num2} of {num} loot item(s) added to the game !"); } catch (Exception msg) { ItemsAPI.Log(msg); } } } } namespace ItemsAPI.Descriptors { public class LootItemDescriptor { public int MasterId { get; set; } public string LootingObjectId { get; set; } public string PrefabAssetName { get; set; } public string IconSpriteAssetId { get; set; } public string PosterIconSpriteId { get; set; } public string DefaultItemName { get; set; } public Dictionary LocalizedItemNames { get; } public int MinPrice { get; set; } public int MaxPrice { get; set; } public int Weight { get; set; } public KeyGroup KeyGroup { get; set; } public string AttachSocketName { get; set; } public PuppetHandheldState PuppetHandheldState { get; set; } public bool IsHideWhenEmote { get; set; } public bool ForbidChange { get; set; } public bool IsExchangeableOnVendingMachine { get; set; } public bool IsPreservedOnWipe { get; set; } public bool IsHidingCamera { get; set; } public int DefaultSpawnRate { get; set; } public Dictionary SpawnRateByMap { get; set; } public LootItemDescriptor(string lootingObjectId, string prefabAssetName, string defaultItemName) { //IL_0060: Unknown result type (might be due to invalid IL or missing references) LootingObjectId = lootingObjectId; PrefabAssetName = prefabAssetName; IconSpriteAssetId = string.Empty; PosterIconSpriteId = string.Empty; DefaultItemName = defaultItemName; LocalizedItemNames = new Dictionary(); MinPrice = 5; MaxPrice = 10; Weight = 4; KeyGroup = KeyGroup.None; AttachSocketName = string.Empty; PuppetHandheldState = (PuppetHandheldState)0; IsHideWhenEmote = false; ForbidChange = false; IsExchangeableOnVendingMachine = true; IsPreservedOnWipe = false; IsHidingCamera = false; DefaultSpawnRate = 105; SpawnRateByMap = new Dictionary { { 999, 0 } }; base..ctor(); } public LootItemDescriptor AddLocalizedItemName(string lang, string name) { if (!LocalizationTools.GetAvailableLocalizationKeys().Contains(lang)) { throw new ArgumentException("Invalid lang key : \"" + lang + "\" is not accepted by the game."); } LocalizedItemNames.Add(lang, name); return this; } public LootItemDescriptor AddLocalizedItemName(IDictionary names) { foreach (KeyValuePair name in names) { AddLocalizedItemName(name.Key, name.Value); } return this; } public LocalizationData_MasterData GetLocalizationItemName() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown LocalizationData_MasterData val = new LocalizationData_MasterData { key = $"STRING_ITEM_NAME_{MasterId}" }; string[] availableLocalizationKeys = LocalizationTools.GetAvailableLocalizationKeys(); foreach (string text in availableLocalizationKeys) { FieldInfo field = ((object)val).GetType().GetField(text); if (LocalizedItemNames.ContainsKey(text)) { field.SetValue(val, LocalizedItemNames[text]); } else { field.SetValue(val, DefaultItemName); } } return val; } public LootItemDescriptor SetMapSpawnRate(int mapId, int spawnRate) { if (SpawnRateByMap.ContainsKey(mapId)) { SpawnRateByMap[mapId] = spawnRate; } else { SpawnRateByMap.Add(mapId, spawnRate); } return this; } public int GetMapSpawnRate(int mapId) { int value; return SpawnRateByMap.TryGetValue(mapId, out value) ? value : DefaultSpawnRate; } public ItemMiscellany_MasterData GetItemMiscellany() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Expected I4, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0163: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0178: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0193: Expected O, but got Unknown return new ItemMiscellany_MasterData { id = MasterId, name = $"STRING_ITEM_NAME_{MasterId}", tool_tip_string = new List(1) { $"STRING_ITEM_NAME_{MasterId}" }, looting_object_id = LootingObjectId, price_for_sell_min = MinPrice, price_for_sell_max = MaxPrice, weight = Weight, key_group = KeyGroup.ToGameString(), item_drop_id = 0, attach_socket_name = AttachSocketName, puppet_handheld_state = (int)PuppetHandheldState, forbid_change = ForbidChange, use_vending_machine_exchange = IsExchangeableOnVendingMachine, is_preserved_on_wipe = IsPreservedOnWipe, accessory_group = 0, is_hide_my_camera = IsHidingCamera, handheld_auraskill_id = 0, handheld_abnormal_id = 0, spawn_fieldskill_id = 0, spawn_fieldskill_env_condition = 0, spawn_fieldskill_enclosure_condition = 0, spawn_fieldskill_time_min = 0, spawn_fieldskill_time_max = 0, spawn_fieldskill_wait_time = 0, fieldskill_spawn_rate = 0, spawn_fieldskill_wait_effect = new List(), scrap_animation_state_name = string.Empty, is_moving_scrap_animation = false, scrap_animation_loop = false, use_bonus_item = (PosterIconSpriteId.Length > 0), sound_aggro_per_use = 0, sound_aggro_in_hand_per_tick = 0, sound_aggro_in_hand_toggle_on_per_tick = 0, hide_item_by_emote = IsHideWhenEmote, is_promotion_item = false, is_promotion_item_hidden = false }; } } } namespace ItemsAPI.Helpers { public static class AssetTools { private static Material cachedMeshSlicerCrossMat; private static GameObject cachedMeshSlicerCrashEffect; private static GameObject cachedMeshSlicerSpawningEffect; private static GameObject cachedMeshSlicerVanishingEffect; private static GameObject cachedMeshSlicerFragmentSpawningEffect; private static GameObject cachedMeshSlicerFragmentVanishingEffect; public static void FixPrefabShaders(GameObject prefab) { Renderer[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (Renderer val in componentsInChildren) { Material[] materials = val.materials; Material[] array = materials; foreach (Material val2 in array) { if (!((Object)(object)((val2 != null) ? val2.shader : null) == (Object)null)) { Shader val3 = Shader.Find(((Object)val2.shader).name); if ((Object)(object)val3 != (Object)null) { val2.shader = val3; } } } val.materials = materials; } } public static void FixMeshSlicers(MMLootingObjectTable sourceTable, GameObject prefab) { if ((Object)(object)cachedMeshSlicerCrossMat == (Object)null || (Object)(object)cachedMeshSlicerCrashEffect == (Object)null || (Object)(object)cachedMeshSlicerSpawningEffect == (Object)null || (Object)(object)cachedMeshSlicerVanishingEffect == (Object)null) { MeshSlicer instance = sourceTable.rows.Where((Row row) => row != null && (Object)(object)row.prefab != (Object)null).SelectMany((Row row) => row.prefab.GetComponentsInChildren(true)).FirstOrDefault((Func)((MeshSlicer meshSlicer) => (Object)(object)meshSlicer != (Object)null && (Object)(object)((Component)meshSlicer).gameObject != (Object)null && !((Component)meshSlicer).transform.IsChildOf(prefab.transform) && ReflectionTools.GetFieldOrProperty(meshSlicer, "crossMat") != null && ReflectionTools.GetFieldOrProperty(meshSlicer, "crashEffect") != null && ReflectionTools.GetFieldOrProperty(meshSlicer, "fragmentSpawningEffect") != null && ReflectionTools.GetFieldOrProperty(meshSlicer, "fragmentVanishingEffect") != null)) ?? throw new Exception("Could not find any MeshSlicer."); cachedMeshSlicerCrossMat = ReflectionTools.GetFieldOrProperty(instance, "crossMat"); cachedMeshSlicerCrashEffect = ReflectionTools.GetFieldOrProperty(instance, "crashEffect"); cachedMeshSlicerSpawningEffect = ReflectionTools.GetFieldOrProperty(instance, "fragmentSpawningEffect"); cachedMeshSlicerVanishingEffect = ReflectionTools.GetFieldOrProperty(instance, "fragmentVanishingEffect"); } if ((Object)(object)cachedMeshSlicerFragmentSpawningEffect != (Object)null && (Object)(object)cachedMeshSlicerFragmentVanishingEffect != (Object)null) { MeshSlicerFragmentScript val = sourceTable.rows.Where((Row row) => row != null && (Object)(object)row.prefab != (Object)null).SelectMany((Row row) => row.prefab.GetComponentsInChildren(true)).FirstOrDefault((Func)((MeshSlicerFragmentScript meshSlicer) => (Object)(object)meshSlicer != (Object)null && (Object)(object)((Component)meshSlicer).gameObject != (Object)null && !((Component)meshSlicer).transform.IsChildOf(prefab.transform) && (Object)(object)meshSlicer.spawningEffect != (Object)null && (Object)(object)meshSlicer.vanishingEffect != (Object)null)) ?? throw new Exception("Could not find any MeshSlicerFragmentScript."); cachedMeshSlicerFragmentSpawningEffect = val.spawningEffect; cachedMeshSlicerFragmentVanishingEffect = val.vanishingEffect; } MeshSlicer[] componentsInChildren = prefab.GetComponentsInChildren(true); foreach (MeshSlicer instance2 in componentsInChildren) { ReflectionTools.SetFieldOrProperty(instance2, "crossMat", cachedMeshSlicerCrossMat); ReflectionTools.SetFieldOrProperty(instance2, "crashEffect", cachedMeshSlicerCrashEffect); ReflectionTools.SetFieldOrProperty(instance2, "fragmentSpawningEffect", cachedMeshSlicerSpawningEffect); ReflectionTools.SetFieldOrProperty(instance2, "fragmentVanishingEffect", cachedMeshSlicerVanishingEffect); } MeshSlicerFragmentScript[] componentsInChildren2 = prefab.GetComponentsInChildren(true); foreach (MeshSlicerFragmentScript val2 in componentsInChildren2) { val2.spawningEffect = cachedMeshSlicerFragmentSpawningEffect; val2.vanishingEffect = cachedMeshSlicerFragmentVanishingEffect; } } } public static class ReflectionTools { public static object GetFieldOrProperty(object instance, string name) { Type type = instance.GetType(); FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { return field.GetValue(instance); } PropertyInfo property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { return property.GetValue(instance); } throw new Exception("Field/property '" + name + "' not found on " + type.FullName); } public static T GetFieldOrProperty(object instance, string name) { return (T)GetFieldOrProperty(instance, name); } public static void SetFieldOrProperty(object instance, string name, object value) { Type type = instance.GetType(); FieldInfo field = type.GetField(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (field != null) { field.SetValue(instance, value); return; } PropertyInfo property = type.GetProperty(name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (property != null) { property.SetValue(instance, value); return; } throw new Exception("Field/property '" + name + "' not found on " + type.FullName); } } public static class LocalizationTools { public static string[] GetAvailableLocalizationKeys() { return Enum.GetNames(typeof(Language)); } } } namespace ItemsAPI.Enums { public enum KeyGroup { None, Small, Medium, Large } public static class KeyGroupExtensions { public static string ToGameString(this KeyGroup keyGroup) { if (1 == 0) { } string result = keyGroup switch { KeyGroup.None => "", KeyGroup.Small => "small", KeyGroup.Medium => "medium", KeyGroup.Large => "large", _ => "", }; if (1 == 0) { } return result; } } } namespace ItemsAPI.Builders { public static class LootItemBuilder { private static MMSpriteTable iconSpriteTable; private static MMLootingObjectTable lootingObjectTable; private static DataManager dataManager; private static readonly Dictionary assets = new Dictionary(); private static readonly List items = new List(); public static LootItemDescriptor[] Items => items.ToArray(); private static int GetNewItemMasterId() { if ((Object)(object)dataManager == (Object)null || dataManager.ExcelDataManager == null) { throw new NullReferenceException("DataManager / ExcelDataManager not ready."); } return dataManager.ExcelDataManager.ItemInfoDict.Keys.Max() + 1; } public static void Initialize() { object instance = ReflectionTools.GetFieldOrProperty(Hub.s, "k__BackingField") ?? throw new NullReferenceException("TableManager not ready."); iconSpriteTable = ReflectionTools.GetFieldOrProperty(instance, "iconSprite") ?? throw new NullReferenceException("Icon Sprite Table not ready."); lootingObjectTable = ReflectionTools.GetFieldOrProperty(instance, "lootingObject") ?? throw new NullReferenceException("Looting Object Table not ready."); dataManager = ReflectionTools.GetFieldOrProperty(Hub.s, "k__BackingField") ?? throw new NullReferenceException("DataManager not ready."); if (dataManager.ExcelDataManager == null) { throw new NullReferenceException("ExcelDataManager not ready."); } } public static void RegisterAssetBundle(AssetBundle bundle) { string[] allAssetNames = bundle.GetAllAssetNames(); foreach (string key in allAssetNames) { assets.Add(key, bundle); } } public static LootItemDescriptor RegisterItem(LootItemDescriptor itemDescriptor) { items.Add(itemDescriptor); return itemDescriptor; } public static int[] BuildAllItems() { //IL_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_0101: Expected O, but got Unknown //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Expected O, but got Unknown //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_02b9: Unknown result type (might be due to invalid IL or missing references) //IL_02c0: Expected O, but got Unknown List list = new List(); foreach (LootItemDescriptor itemDescriptor in items.OrderBy((LootItemDescriptor item) => item.LootingObjectId)) { int newItemMasterId = GetNewItemMasterId(); itemDescriptor.MasterId = newItemMasterId; Texture2D val = assets[itemDescriptor.IconSpriteAssetId].LoadAsset(itemDescriptor.IconSpriteAssetId) ?? throw new KeyNotFoundException("Could not load icon from bundle"); Sprite sprite = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); Row iconRow = new Row { id = $"icon_miscellnary_custom_{newItemMasterId}", sprite = sprite }; List list2 = ReflectionTools.GetFieldOrProperty(iconSpriteTable, "rows").ToList(); list2.RemoveAll((Row row) => row != null && row.id == iconRow.id); list2.Add(iconRow); ReflectionTools.SetFieldOrProperty(iconSpriteTable, "rows", list2.ToArray()); GameObject val2 = assets[itemDescriptor.PrefabAssetName].LoadAsset(itemDescriptor.PrefabAssetName) ?? throw new KeyNotFoundException("Could not load prefab from bundle."); LootingLevelObject val3 = val2.GetComponent() ?? throw new MissingComponentException("Could not find LootingLevelObject component in prefab."); val3.itemMasterID = newItemMasterId; AssetTools.FixPrefabShaders(val2); AssetTools.FixMeshSlicers(lootingObjectTable, val2); Row item2 = new Row { id = itemDescriptor.LootingObjectId, prefab = val2, iconSpriteId = iconRow.id, posterIconSpriteId = itemDescriptor.PosterIconSpriteId }; lootingObjectTable.rows.RemoveAll((Row row) => row != null && row.id == itemDescriptor.LootingObjectId); lootingObjectTable.rows.Add(item2); lootingObjectTable.ClearSkinnedItemInfos(); LocalizationData_MasterData localizationItemName = itemDescriptor.GetLocalizationItemName(); ImmutableDictionary value = dataManager.ExcelDataManager.LocalizationDict.Remove(localizationItemName.key).Add(localizationItemName.key, localizationItemName); PropertyInfo propertyInfo = typeof(ExcelDataManager).GetProperty("LocalizationDict", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("Could not find ExcelDataManager.LocalizationDict property."); propertyInfo.SetValue(dataManager.ExcelDataManager, value); ItemMiscellany_MasterData itemMiscellany = itemDescriptor.GetItemMiscellany(); ItemMiscellanyInfo value2 = new ItemMiscellanyInfo(itemMiscellany); ImmutableDictionary value3 = dataManager.ExcelDataManager.ItemInfoDict.Remove(newItemMasterId).Add(newItemMasterId, (ItemMasterInfo)(object)value2); PropertyInfo propertyInfo2 = typeof(ExcelDataManager).GetProperty("ItemInfoDict", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) ?? throw new Exception("Could not find ExcelDataManager.ItemInfoDict property."); propertyInfo2.SetValue(dataManager.ExcelDataManager, value3); if (dataManager.ExcelDataManager.GetItemInfo(newItemMasterId) == null) { throw new Exception("Injected item could not be read back from ExcelDataManager."); } list.Add(newItemMasterId); foreach (int key in dataManager.ExcelDataManager.SpawnableItemDict.Keys) { SpawnableItemInfo val4 = dataManager.ExcelDataManager.SpawnableItemDict[key]; int mapSpawnRate = itemDescriptor.GetMapSpawnRate(key); val4.MiscRateDict = val4.MiscRateDict.Add(newItemMasterId, mapSpawnRate); } } return list.ToArray(); } } }