using RichCreator.Utility.InputControl; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RichCreator.Jobs.StateMachines { /// /// 技能释放队列 /// public class SkillQueue { private List callTimes = new List();//可调用的技能列表 private SkillInfo lastSkill = null;//最后一个调用的技能 private DateTime lastSkillCallTime = DateTime.MinValue;//最后一个技能的调用时间 public SkillQueue() { } public SkillQueue(HIDCode[] skillCodes) { for (int i = 0; i < skillCodes.Length; i++) { EnQueue(false, skillCodes[i]); } } /// /// 向可队列添加技能 /// /// /// public void EnQueue(bool isOnce, HIDCode skillCode) { SkillInfo skill = SkillInfo.GetSkillInfo(skillCode); SKillCallTime time = new SKillCallTime(skill,isOnce); this.callTimes.Add(time); } private SkillInfo nextSkill; /// /// 阻塞查看队列,但不从队列中删除 /// /// public SkillInfo SyncPeek() { if (nextSkill == null) { nextSkill = FindOk(); } return nextSkill; } /// /// 阻塞出队列 /// /// public SkillInfo SyncDeQueue() { SkillInfo result = null; if (nextSkill != null) { result = nextSkill; nextSkill = null; } else { result = FindOk(); } for (int i = 0; i < this.callTimes.Count; i++) { if (this.callTimes[i].Skill == result) { this.callTimes[i].CallCount++; this.callTimes[i].LastCallTime = DateTime.Now; break; } } return result; } /// /// 查找可以调用的技能 /// /// private SkillInfo FindOk() { SKillCallTime callTime = null; while (true) { for (int i = 0; i < callTimes.Count; i++) { callTime = callTimes[i]; double dimMS = (DateTime.Now - callTime.LastCallTime).TotalMilliseconds; if (dimMS > (callTime.Skill.WaitTime * 1000)) { //已经过了技能等待时间 if (!callTime.IsOnce || callTime.CallCount <= 0) { //不是限制只调用一次,或一次也没调用过 return callTime.Skill; } } } //Thread.Sleep(100); } } /// /// 技能调用时间 /// private class SKillCallTime { public SKillCallTime( SkillInfo skill,bool isOnce) { this.Skill = skill; this.IsOnce = isOnce; this.LastCallTime = DateTime.MinValue; this.CallCount = 0; } /// /// 技能 /// public SkillInfo Skill; /// /// 上次调用时间 /// public DateTime LastCallTime; /// /// 是否只能调用一次 /// public bool IsOnce; /// /// 调用次数 /// public Int32 CallCount; } } }