DropItem.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using CommonAI.Zone.Instance;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. namespace CommonAI.Zone.Helper
  6. {
  7. public class DropItemGenerator
  8. {
  9. class DropList
  10. {
  11. private readonly float AllPct;
  12. private readonly DropItem[] Items;
  13. public DropList(List<DropItem> items)
  14. {
  15. this.Items = new DropItem[items.Count];
  16. float total = 0;
  17. for (int i = 0; i < items.Count; i++)
  18. {
  19. Items[i] = items[i];
  20. total += items[i].DropPercent;
  21. }
  22. this.AllPct = total;
  23. }
  24. public DropItem DropOnce(Random random)
  25. {
  26. for (int i = 0; i < Items.Length; i++)
  27. {
  28. int r = random.Next(0, Items.Length);
  29. Items[i] = Items[r];
  30. }
  31. float seed = (float)(random.NextDouble() * 100f);
  32. float begin = 0;
  33. for (int i = 0; i < Items.Length; i++)
  34. {
  35. float end = begin + Items[i].DropPercent;
  36. if (begin <= seed && seed <= end)
  37. {
  38. return Items[i];
  39. }
  40. begin = end;
  41. }
  42. return null;
  43. }
  44. }
  45. private DropList[] Drops;
  46. private List<KeyValuePair<ItemTemplate, DropItem>> ret;
  47. public DropItemGenerator(List<DropItemList> drops)
  48. {
  49. if (drops != null)
  50. {
  51. this.Drops = new DropList[drops.Count];
  52. for (int i = 0; i < drops.Count; i++)
  53. {
  54. Drops[i] = new DropList(drops[i].DropItems);
  55. }
  56. this.ret = new List<KeyValuePair<ItemTemplate, DropItem>>(drops.Count);
  57. }
  58. else
  59. {
  60. this.Drops = new DropList[0];
  61. this.ret = new List<KeyValuePair<ItemTemplate, DropItem>>(0);
  62. }
  63. }
  64. public IEnumerable<KeyValuePair<ItemTemplate, DropItem>> Drop(InstanceZone zone, Random random)
  65. {
  66. ret.Clear();
  67. for (int i = 0; i < Drops.Length; i++)
  68. {
  69. DropItem drop = Drops[i].DropOnce(random);
  70. if (drop != null)
  71. {
  72. ItemTemplate template = zone.Templates.getItem(drop.ItemTemplateID);
  73. if (template != null)
  74. {
  75. for (int c = 0; c < drop.DropCount; c++)
  76. {
  77. KeyValuePair<ItemTemplate, DropItem> e = new KeyValuePair<ItemTemplate, DropItem>(template, drop);
  78. ret.Add(e);
  79. }
  80. }
  81. }
  82. }
  83. return ret;
  84. }
  85. }
  86. }