using CommonAI.Zone.Instance; using System; using System.Collections.Generic; using System.Text; namespace CommonAI.Zone.Helper { public class DropItemGenerator { class DropList { private readonly float AllPct; private readonly DropItem[] Items; public DropList(List items) { this.Items = new DropItem[items.Count]; float total = 0; for (int i = 0; i < items.Count; i++) { Items[i] = items[i]; total += items[i].DropPercent; } this.AllPct = total; } public DropItem DropOnce(Random random) { for (int i = 0; i < Items.Length; i++) { int r = random.Next(0, Items.Length); Items[i] = Items[r]; } float seed = (float)(random.NextDouble() * 100f); float begin = 0; for (int i = 0; i < Items.Length; i++) { float end = begin + Items[i].DropPercent; if (begin <= seed && seed <= end) { return Items[i]; } begin = end; } return null; } } private DropList[] Drops; private List> ret; public DropItemGenerator(List drops) { if (drops != null) { this.Drops = new DropList[drops.Count]; for (int i = 0; i < drops.Count; i++) { Drops[i] = new DropList(drops[i].DropItems); } this.ret = new List>(drops.Count); } else { this.Drops = new DropList[0]; this.ret = new List>(0); } } public IEnumerable> Drop(InstanceZone zone, Random random) { ret.Clear(); for (int i = 0; i < Drops.Length; i++) { DropItem drop = Drops[i].DropOnce(random); if (drop != null) { ItemTemplate template = zone.Templates.getItem(drop.ItemTemplateID); if (template != null) { for (int c = 0; c < drop.DropCount; c++) { KeyValuePair e = new KeyValuePair(template, drop); ret.Add(e); } } } } return ret; } } }