protected static void AddItems <T>(LootEntryType t, List <T> all) where T : LootItemEntry { foreach (ResolvedLootItemList entry in LootMgr.GetEntries(t)) { if (entry != null) { foreach (LootEntity lootEntity in (List <LootEntity>)entry) { all.Add((T)lootEntity); } } } }
protected static void AddItems <T>(LootEntryType t, List <T> all) where T : LootItemEntry { var entries = LootMgr.GetEntries(t); foreach (var list in entries) { if (list != null) { foreach (var entry in list) { all.Add((T)entry); } } } }
private static void LookupRef(ResolvedLootItemList list, LootItemEntry entry) { ResolvedLootItemList entries = LootMgr.GetEntries(LootEntryType.Reference, entry.ReferencedEntryId); if (entries == null) { return; } if (entries.ResolveStatus < (byte)1) { entries.ResolveStatus = (byte)1; foreach (LootEntity ent in (List <LootEntity>)entries) { if (ent is LootItemEntry) { LootItemEntry entry1 = (LootItemEntry)ent; if (entry1.ReferencedEntryId > 0U) { LootMgr.LookupRef(list, entry1); continue; } } LootMgr.AddRef(list, ent); } entries.ResolveStatus = (byte)2; } else if (list.ResolveStatus == (byte)1) { LogManager.GetCurrentClassLogger() .Warn("Infinite loop in Loot references detected in: " + (object)entry); } else { foreach (LootEntity ent in (List <LootEntity>)entries) { LootMgr.AddRef(list, ent); } } }
/// <summary> /// Returns all Items that can be looted off the given lootable /// </summary> public static LootItem[] CreateLootItems(uint lootId, LootEntryType type, bool heroic, IList <LooterEntry> looters) { ResolvedLootItemList entries = LootMgr.GetEntries(type, lootId); if (entries == null) { return(LootItem.EmptyArray); } LootItem[] array = new LootItem[Math.Min(15, entries.Count)]; int newSize = 0; foreach (LootEntity lootEntity in (List <LootEntity>)entries) { if (100.0 * (double)Utility.RandomFloat() < (double)lootEntity.DropChance) { ItemTemplate template = lootEntity.ItemTemplate; if (template != null && looters.Any <LooterEntry>((Func <LooterEntry, bool>)(looter => template.CheckLootConstraints(looter.Owner)))) { array[newSize] = new LootItem(template, Utility.Random(lootEntity.MinAmount, lootEntity.MaxAmount), (uint)newSize, template.RandomPropertiesId); ++newSize; if (newSize == 15) { break; } } } } if (newSize == 0) { return(LootItem.EmptyArray); } Array.Resize <LootItem>(ref array, newSize); return(array); }