123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- 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<DropItem> 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<KeyValuePair<ItemTemplate, DropItem>> ret;
- public DropItemGenerator(List<DropItemList> 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<KeyValuePair<ItemTemplate, DropItem>>(drops.Count);
- }
- else
- {
- this.Drops = new DropList[0];
- this.ret = new List<KeyValuePair<ItemTemplate, DropItem>>(0);
- }
- }
- public IEnumerable<KeyValuePair<ItemTemplate, DropItem>> 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<ItemTemplate, DropItem> e = new KeyValuePair<ItemTemplate, DropItem>(template, drop);
- ret.Add(e);
- }
- }
- }
- }
- return ret;
- }
- }
- }
|