asmrobot
2019-10-14 730fe7ea65bcadbe235e40bb54b2410d14495267
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
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
{
    /// <summary>
    /// 技能释放队列
    /// </summary>
    public class SkillQueue
    {
        private List<SKillCallTime> callTimes = new List<SKillCallTime>();//可调用的技能列表
        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]);
            }
        }
 
        /// <summary>
        /// 向可队列添加技能
        /// </summary>
        /// <param name="isOnce"></param>
        /// <param name="skillCode"></param>
        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;
 
        /// <summary>
        /// 阻塞查看队列,但不从队列中删除
        /// </summary>
        /// <returns></returns>
        public SkillInfo SyncPeek()
        {
            if (nextSkill == null)
            {
                nextSkill = FindOk();
            }
            
            return nextSkill;
        }
 
        /// <summary>
        /// 阻塞出队列
        /// </summary>
        /// <returns></returns>
        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;
        }
 
 
        /// <summary>
        /// 查找可以调用的技能
        /// </summary>
        /// <returns></returns>
        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);
            }
        }
 
 
        
 
        /// <summary>
        /// 技能调用时间
        /// </summary>
        private class SKillCallTime
        {
            public SKillCallTime( SkillInfo skill,bool isOnce)
            {
                this.Skill = skill;
                this.IsOnce = isOnce;
                this.LastCallTime = DateTime.MinValue;
                this.CallCount = 0;
            }
            /// <summary>
            /// 技能
            /// </summary>
            public SkillInfo Skill;
 
            /// <summary>
            /// 上次调用时间
            /// </summary>
            public DateTime LastCallTime;
 
            /// <summary>
            /// 是否只能调用一次
            /// </summary>
            public bool IsOnce;
 
            /// <summary>
            /// 调用次数
            /// </summary>
            public Int32 CallCount;
        }
    }
}