Actions.Manual.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. using CommonAI.RTS; using CommonLang.Vector;
  2. using CommonAI.Zone.Attributes;
  3. using CommonAI.Zone.Instance;
  4. using CommonLang.Property;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using CommonAI.Zone.EventTrigger;
  10. namespace CommonAI.Zone.ZoneEditor.EventTrigger
  11. {
  12. [DescAttribute("手动控制", "单位 - 手动控制")]
  13. public abstract class ManualUnitAction : AbstractAction
  14. {
  15. public abstract string ToActionString();
  16. }
  17. [DescAttribute("单位待机", "单位 - 手动控制")]
  18. public class ManualUnitIdleAction : ManualUnitAction
  19. {
  20. [DescAttribute("单位")]
  21. public UnitValue Unit = new UnitValue.Editor();
  22. [DescAttribute("待机时间")]
  23. public RealValue TimeSEC = new RealValue.VALUE();
  24. public override string ToString()
  25. {
  26. return string.Format("手动控制({0})待机{1}秒", Unit, TimeSEC);
  27. }
  28. public override string ToActionString()
  29. {
  30. return string.Format("待机{0}秒", TimeSEC);
  31. }
  32. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  33. {
  34. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  35. if (unit != null)
  36. {
  37. unit.queueIdle(TimeSEC.GetValue(api, args));
  38. }
  39. }
  40. }
  41. [DescAttribute("单位做动作", "单位 - 手动控制")]
  42. public class ManualUnitDoClientAction : ManualUnitAction
  43. {
  44. [DescAttribute("单位")]
  45. public UnitValue Unit = new UnitValue.Editor();
  46. [DescAttribute("动作名字")]
  47. public string ActionName;
  48. [DescAttribute("动作持续时间(秒)")]
  49. public RealValue TimeSEC = new RealValue.VALUE();
  50. public override string ToString()
  51. {
  52. return string.Format("手动控制({0})做动作{1}", Unit, ActionName);
  53. }
  54. public override string ToActionString()
  55. {
  56. return string.Format("做动作{0}", ActionName);
  57. }
  58. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  59. {
  60. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  61. if (unit != null)
  62. {
  63. unit.queueDoAction(TimeSEC.GetValue(api, args), ActionName);
  64. }
  65. }
  66. }
  67. [DescAttribute("单位移动", "单位 - 手动控制")]
  68. public class ManualUnitMoveAction : ManualUnitAction
  69. {
  70. [DescAttribute("单位")]
  71. public UnitValue Unit = new UnitValue.Editor();
  72. [DescAttribute("位置")]
  73. public PositionValue Pos = new PositionValue.VALUE();
  74. public override string ToString()
  75. {
  76. return string.Format("手动控制({0})移动到{1}", Unit, Pos);
  77. }
  78. public override string ToActionString()
  79. {
  80. return string.Format("移动到{0}", Pos);
  81. }
  82. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  83. {
  84. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  85. Vector2 pos = Pos.GetValue(api, args);
  86. if (unit != null && pos != null)
  87. {
  88. unit.startMoveTo(pos.X, pos.Y);
  89. }
  90. }
  91. }
  92. [DescAttribute("单位改变朝向", "单位 - 手动控制")]
  93. public class ManualUnitFaceToAction : ManualUnitAction
  94. {
  95. [DescAttribute("单位")]
  96. public UnitValue Unit = new UnitValue.Editor();
  97. [DescAttribute("方向")]
  98. public RealValue Direction = new RealValue.VALUE();
  99. public override string ToString()
  100. {
  101. return string.Format("手动控制({0})转向到{1}", Unit, Direction);
  102. }
  103. public override string ToActionString()
  104. {
  105. return string.Format("转向到{0}", Direction);
  106. }
  107. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  108. {
  109. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  110. if (unit != null)
  111. {
  112. unit.faceTo(Direction.GetValue(api, args));
  113. }
  114. }
  115. }
  116. [DescAttribute("单位释放技能", "单位 - 手动控制")]
  117. public class ManualUnitLaunchSkillAction : ManualUnitAction
  118. {
  119. [DescAttribute("单位")]
  120. public UnitValue Unit = new UnitValue.Editor();
  121. [DescAttribute("随机技能,如果为True,则SkillTemplateID无效")]
  122. public BooleanValue RandomSkill = new BooleanValue.VALUE();
  123. [TemplateIDAttribute(typeof(SkillTemplate))]
  124. [DescAttribute("技能模板ID")]
  125. public int SkillTemplateID;
  126. public override string ToString()
  127. {
  128. return string.Format("手动控制({0})释放技能{1}", Unit, SkillTemplateID);
  129. }
  130. public override string ToActionString()
  131. {
  132. return string.Format("释放技能{0}", SkillTemplateID);
  133. }
  134. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  135. {
  136. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  137. if (unit != null)
  138. {
  139. unit.launchSkill(SkillTemplateID, new InstanceUnit.LaunchSkillParam());
  140. }
  141. }
  142. }
  143. [DescAttribute("开始攻击单位", "单位 - 手动控制")]
  144. public class ManualUnitFocuseAttackAction : ManualUnitAction
  145. {
  146. [DescAttribute("单位")]
  147. public UnitValue Unit = new UnitValue.Editor();
  148. [DescAttribute("目标")]
  149. public UnitValue Target = new UnitValue.Editor();
  150. public override string ToString()
  151. {
  152. return string.Format("手动控制({0})开始攻击单位{1}", Unit, Target);
  153. }
  154. public override string ToActionString()
  155. {
  156. return string.Format("开始攻击单位{0}", Target);
  157. }
  158. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  159. {
  160. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  161. InstanceUnit target = Target.GetValue(api, args);
  162. if (unit != null && target != null)
  163. {
  164. unit.focuseAttack(target);
  165. }
  166. }
  167. }
  168. [DescAttribute("等待下一条指令(仅队列中有效)", "单位 - 手动控制")]
  169. public class ManualUnitWaitCommandAction : ManualUnitAction
  170. {
  171. [DescAttribute("等待时间")]
  172. public RealValue WaitTimeSEC = new RealValue.VALUE();
  173. public override string ToString()
  174. {
  175. return string.Format("等待{0}秒", WaitTimeSEC);
  176. }
  177. public override string ToActionString()
  178. {
  179. return string.Format("等待{0}秒", WaitTimeSEC);
  180. }
  181. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  182. {
  183. }
  184. }
  185. [DescAttribute("一系列动作", "单位 - 手动控制")]
  186. public class ManualUnitControlQueue : AbstractAction
  187. {
  188. [DescAttribute("单位")]
  189. public UnitValue Unit = new UnitValue.Editor();
  190. [DescAttribute("动作序列")]
  191. [ListAttribute(typeof(ManualUnitAction))]
  192. public List<ManualUnitAction> Actions = new List<ManualUnitAction>();
  193. public override string ToString()
  194. {
  195. StringBuilder sb = new StringBuilder();
  196. foreach (ManualUnitAction act in Actions)
  197. {
  198. sb.Append(act.ToActionString() + " -> ");
  199. }
  200. sb.Append("END");
  201. return string.Format("({0})执行序列: {1}", Unit, sb);
  202. }
  203. override public void DoAction(EventTriggerAdapter api, EventArguments args)
  204. {
  205. InstanceManual unit = Unit.GetValue(api, args) as InstanceManual;
  206. if (unit != null && Actions.Count > 0)
  207. {
  208. new ActionQueueExecuter(api, args, unit, Actions).doNextAction();
  209. }
  210. }
  211. class ActionQueueExecuter
  212. {
  213. private EventTriggerAdapter api;
  214. private EventArguments args;
  215. private InstanceManual unit;
  216. private Queue<ManualUnitAction> actions;
  217. public ActionQueueExecuter(EventTriggerAdapter api, EventArguments args, InstanceManual manual, List<ManualUnitAction> actions)
  218. {
  219. this.api = api;
  220. this.args = args;
  221. this.unit = manual;
  222. this.actions = new Queue<ManualUnitAction>(actions);
  223. }
  224. public void doNextAction()
  225. {
  226. if (actions.Count > 0)
  227. {
  228. ManualUnitAction act = actions.Dequeue();
  229. if (act is ManualUnitIdleAction)
  230. {
  231. doIdle(act as ManualUnitIdleAction);
  232. }
  233. else if (act is ManualUnitMoveAction)
  234. {
  235. doMove(act as ManualUnitMoveAction);
  236. }
  237. else if (act is ManualUnitFaceToAction)
  238. {
  239. doFaceTo(act as ManualUnitFaceToAction);
  240. }
  241. else if (act is ManualUnitLaunchSkillAction)
  242. {
  243. doLaunchSkill(act as ManualUnitLaunchSkillAction);
  244. }
  245. else if (act is ManualUnitDoClientAction)
  246. {
  247. doClientAction(act as ManualUnitDoClientAction);
  248. }
  249. else if (act is ManualUnitFocuseAttackAction)
  250. {
  251. doAttackAction(act as ManualUnitFocuseAttackAction);
  252. }
  253. else if (act is ManualUnitWaitCommandAction)
  254. {
  255. doWaitCommand(act as ManualUnitWaitCommandAction);
  256. }
  257. }
  258. }
  259. private void doIdle(ManualUnitIdleAction idle)
  260. {
  261. unit.queueIdle(idle.TimeSEC.GetValue(api, args), (InstanceUnit u, InstanceUnit.State os) =>
  262. {
  263. doNextAction();
  264. });
  265. }
  266. private void doMove(ManualUnitMoveAction move)
  267. {
  268. Vector2 pos = move.Pos.GetValue(api, args);
  269. if (pos != null)
  270. {
  271. unit.queueMoveTo(pos.X, pos.Y, (InstanceUnit u, InstanceUnit.State os) =>
  272. {
  273. doNextAction();
  274. });
  275. }
  276. else
  277. {
  278. doNextAction();
  279. }
  280. }
  281. private void doFaceTo(ManualUnitFaceToAction faceTo)
  282. {
  283. unit.faceTo(faceTo.Direction.GetValue(api, args));
  284. doNextAction();
  285. }
  286. private void doLaunchSkill(ManualUnitLaunchSkillAction skill)
  287. {
  288. unit.queueLaunchSkill(skill.SkillTemplateID, skill.RandomSkill.GetValue(api, args), (InstanceUnit u, InstanceUnit.State os) =>
  289. {
  290. doNextAction();
  291. });
  292. }
  293. private void doClientAction(ManualUnitDoClientAction skill)
  294. {
  295. unit.queueDoAction(skill.TimeSEC.GetValue(api, args), skill.ActionName, (InstanceUnit u, InstanceUnit.State os) =>
  296. {
  297. doNextAction();
  298. });
  299. }
  300. private void doAttackAction(ManualUnitFocuseAttackAction act)
  301. {
  302. InstanceUnit targget = act.Target.GetValue(api, args);
  303. if (targget != null)
  304. {
  305. unit.focuseAttack(targget);
  306. }
  307. doNextAction();
  308. }
  309. private void doWaitCommand(ManualUnitWaitCommandAction act)
  310. {
  311. unit.wait(act.WaitTimeSEC.GetValue(api, args), () => { doNextAction(); });
  312. }
  313. }
  314. }
  315. }