| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 | using System;using System.Collections.Generic;using UnityEngine;namespace HQFPSWeapons{	[Serializable]	public class ProbabilityList<T> where T : UnityEngine.Object	{		public int Count { get { return m_Items.Count; } }		[SerializeField]		private List<T> m_Items = null;		[SerializeField]		private List<int> m_Probabilities = null;		public T GetRandomItem()		{			if(m_Items.Count > 0)				return m_Items[ProbabilityUtils.RandomChoiceFollowingDistribution(m_Probabilities.ConvertAll((int p)=> { return (float)p; }))];			else				return default(T);		}		public bool GetRandomItems(int iterations, out T[] items)		{			iterations = Mathf.Clamp(iterations, 0, m_Items.Count / 2);			if(iterations > 0)			{				items = new T[iterations];				var clonedElements = new List<ProbabilityElement>();				for(int e = 0;e < m_Items.Count;e ++)					clonedElements.Add(new ProbabilityElement() { Item = m_Items[e], Probability = ((float)m_Probabilities[e]) / 100f });				for(int i = 0;i < iterations;i ++)				{					int chosenElement = GetRandomItem(clonedElements);					items[i] = m_Items[chosenElement];					clonedElements.RemoveAt(chosenElement);				}				return true;			}			else			{				items = default(T[]);				return false;			}		}		private int GetRandomItem(List<ProbabilityElement> elements)		{			var probabilities = new List<float>();			for(int i = 0;i < elements.Count;i ++)				probabilities.Add(elements[i].Probability);			return ProbabilityUtils.RandomChoiceFollowingDistribution(probabilities);		}        #region Internal        [Serializable]		public struct ProbabilityElement		{			public T Item;			public float Probability;		}        #endregion    }    [Serializable]	public class ItemPickupRandomList : ProbabilityList<ItemPickup> {  }}
 |