ModuleTask.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. using CommonAI.Zone;
  2. using CommonAI.Zone.Helper;
  3. using CommonAI.Zone.ZoneEditor;
  4. using CommonAI.ZoneClient;
  5. using CommonAI.ZoneClient.Agent;
  6. using CommonLang;
  7. using CommonLang.Concurrent;
  8. using CommonLang.Log;
  9. using CommonLang.Reflection;
  10. using CommonLang.Vector;
  11. using pomelo.area;
  12. using pomelo.connector;
  13. using Pomelo.DotNetClient;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading;
  19. using ZeusBattleClient.Client;
  20. using ZeusBattleClientBot.Bot;
  21. namespace ZeusBotTest.Runner
  22. {
  23. public class ModuleTask : BotRunner.RunnerModule
  24. {
  25. private BotClient.QuestData.SeekInfo CurrentQuestSeeking;
  26. private int InProgressQuestTicking = 0;
  27. public ModuleTask(BotRunner r) : base(r)
  28. {
  29. bot.Client.GameSocket.listen<TaskUpdatePush>(on_task_update_push);
  30. }
  31. protected override void OnEnableChanged(bool enable)
  32. {
  33. if (!enable)
  34. do_clear_current_seeking();
  35. }
  36. protected internal override void OnGateBindPlayer(BindPlayerResponse e)
  37. {
  38. runner.do_gm_add_exp(999999999);
  39. }
  40. protected internal override void OnBattleActorDead(ZoneActor actor, UnitDeadEvent e)
  41. {
  42. do_clear_current_seeking();
  43. }
  44. protected internal override void OnGameEnterScene(EnterSceneResponse response)
  45. {
  46. do_clear_current_seeking();
  47. }
  48. protected internal override void OnBattleActorReady(CommonAI.ZoneClient.ZoneLayer layer, CommonAI.ZoneClient.ZoneActor actor)
  49. {
  50. layer.AddTimeDelayMS(bot.Random.Next(Config.CheckIntervalMS, Config.CheckIntervalMS * 2), (t) =>
  51. {
  52. if (Enable) runner.do_seek_random_task(on_seek_action);
  53. });
  54. layer.AddTimePeriodicMS(Config.CheckIntervalMS, (t) =>
  55. {
  56. if (bot.CurrentZoneActor.CurrentState == UnitActionStatus.Dead)
  57. {
  58. runner.do_relive(1);
  59. }
  60. if (Enable)
  61. do_test_quest_seeking_1000();
  62. else
  63. do_clear_current_seeking();
  64. });
  65. }
  66. private void on_task_update_push(TaskUpdatePush e)
  67. {
  68. if (Enable)
  69. {
  70. log.Log("on_task_update_push");
  71. if (CurrentQuestSeeking != null)
  72. {
  73. if (CurrentQuestSeeking.quest.State != BotClient.QuestData.QuestStatus.DONE)
  74. {
  75. log.Log("continue do_seek_task : " + CurrentQuestSeeking.quest);
  76. runner.do_seek_task(CurrentQuestSeeking.quest.TemplateID, on_seek_action);
  77. }
  78. }
  79. else
  80. {
  81. do_clear_current_seeking();
  82. var q = runner.do_seek_random_task(on_seek_action);
  83. if (q == null)
  84. {
  85. log.Log("no more task!!!");
  86. }
  87. }
  88. }
  89. }
  90. private void do_test_quest_seeking_1000()
  91. {
  92. if (CurrentQuestSeeking != null)
  93. {
  94. if (CurrentQuestSeeking.quest.State == BotClient.QuestData.QuestStatus.DONE)
  95. {
  96. do_clear_current_seeking();
  97. return;
  98. }
  99. else
  100. {
  101. if (CurrentQuestSeeking.quest.Kind != BotClient.QuestData.QuestType.TRUNK)
  102. {
  103. var q = runner.do_seek_random_task((quest, info) => { });
  104. if (q != null && q.Kind == BotClient.QuestData.QuestType.TRUNK)
  105. {
  106. do_clear_current_seeking();
  107. return;
  108. }
  109. }
  110. if (CurrentQuestSeeking.MoveTo != null)
  111. {
  112. var obj = bot.CurrentZoneActor;
  113. if (MathVector.getDistance(CurrentQuestSeeking.MoveTo.x, CurrentQuestSeeking.MoveTo.y, obj.X, obj.Y) < Config.MinSeekRange)
  114. {
  115. on_seek_quest_move_done(CurrentQuestSeeking);
  116. }
  117. else if (bot.CurrentZoneLayer.FindPath(bot.CurrentZoneActor.X, bot.CurrentZoneActor.Y, CurrentQuestSeeking.MoveTo.X, CurrentQuestSeeking.MoveTo.Y) != null)
  118. {
  119. if (bot.CurrentSceneType == ZeusCommon.EditorData.ZeusConstConfig.SceneType.Dungeon)
  120. {
  121. bot.CurrentZoneActor.SendUnitGuard(true);
  122. runner.do_bs_actor_random_move_region(true, Config.MinSeekRange);
  123. }
  124. else
  125. {
  126. var agent = runner.do_start_move_agent(CurrentQuestSeeking.MoveTo.X, CurrentQuestSeeking.MoveTo.Y, Config.MinSeekRange);
  127. if (agent.TryStep() == false)
  128. {
  129. bot.CurrentZoneActor.SendUnitGuard(true);
  130. runner.do_bs_actor_random_move_region(true, Config.MinSeekRange);
  131. }
  132. }
  133. }
  134. else
  135. {
  136. runner.do_bs_actor_random_move_region(true, Config.MinSeekRange);
  137. }
  138. }
  139. else if (CurrentQuestSeeking.NoWay)
  140. {
  141. if (bot.CurrentSceneType == ZeusCommon.EditorData.ZeusConstConfig.SceneType.Dungeon)
  142. {
  143. runner.do_bs_actor_random_move_transport(true, Config.MinSeekRange);
  144. var quest = runner.do_seek_random_task(on_seek_action, true);
  145. if (quest != null && quest.TemplateID == 1015)
  146. {
  147. runner.do_gm_finish_task(quest.TemplateID);
  148. bot.CurrentRegionManager.CheckTrans(1, true);
  149. }
  150. }
  151. else
  152. {
  153. runner.do_bs_actor_random_move_transport(false, Config.MinSeekRange);
  154. }
  155. }
  156. else
  157. {
  158. runner.do_bs_actor_random_move_region(true, Config.MinSeekRange);
  159. }
  160. }
  161. }
  162. else
  163. {
  164. var q = runner.do_seek_random_task(on_seek_action, true);
  165. if (q == null)
  166. {
  167. runner.do_bs_actor_random_move_transport(true, Config.MinSeekRange);
  168. if (runner.CurrentRandomMoveTarget != null && bot.CurrentZoneLayer.IsLoaded)
  169. {
  170. SetStatus(runner.CurrentRandomMoveTarget.Name + "@" + bot.CurrentZoneLayer.Data);
  171. }
  172. }
  173. }
  174. }
  175. private void do_clear_current_seeking()
  176. {
  177. if (runner.CurrentMoveAgent != null)
  178. {
  179. runner.CurrentMoveAgent.Stop();
  180. }
  181. InProgressQuestTicking = 0;
  182. CurrentQuestSeeking = null;
  183. }
  184. private void on_seek_action(BotClient.QuestData quest, BotClient.QuestData.SeekInfo seek)
  185. {
  186. SetStatus(quest.Name + "(" + quest.State + ")");
  187. log.Log("on_seek_action : " + quest);
  188. if (quest != null && quest.TemplateID == 1015)
  189. {
  190. runner.do_gm_finish_task(quest.TemplateID);
  191. bot.CurrentRegionManager.CheckTrans(1, true);
  192. }
  193. if (CurrentQuestSeeking == null || CurrentQuestSeeking.quest.TemplateID != quest.TemplateID)
  194. {
  195. InProgressQuestTicking = 0;
  196. }
  197. CurrentQuestSeeking = seek;
  198. if (seek.MoveTo != null)
  199. {
  200. var agent = runner.do_start_move_agent(CurrentQuestSeeking.MoveTo.X, CurrentQuestSeeking.MoveTo.Y, Config.MinSeekRange);
  201. if (agent.IsEnd || agent.Result == CommonAI.RTS.Manhattan.AstarManhattan.FindPathResult.Destination)
  202. {
  203. bot.CurrentZoneActor.SendUnitGuard(true);
  204. if (CurrentQuestSeeking.areaId != bot.CurrentZoneLayer.Data.TemplateID)
  205. {
  206. bot.CurrentRegionManager.CheckTrans(1, false);
  207. }
  208. }
  209. else
  210. {
  211. bot.CurrentZoneActor.SendUnitGuard(false);
  212. }
  213. }
  214. else if (seek.NoWay)
  215. {
  216. runner.do_bs_actor_random_move_transport(true, Config.MinSeekRange);
  217. }
  218. else
  219. {
  220. switch (seek.quest.State)
  221. {
  222. case BotClient.QuestData.QuestStatus.IN_PROGRESS:
  223. runner.do_gm_finish_task(quest.TemplateID);
  224. break;
  225. case BotClient.QuestData.QuestStatus.CAN_FINISH:
  226. runner.do_submit_task(quest, (err) => { do_clear_current_seeking(); });
  227. break;
  228. case BotClient.QuestData.QuestStatus.NEW:
  229. runner.do_accept_quest(quest, (err) => { do_clear_current_seeking(); });
  230. break;
  231. }
  232. bot.CurrentZoneLayer.AddTimeDelayMS(bot.Random.Next(Config.CheckIntervalMS, Config.CheckIntervalMS * 2), (t) =>
  233. {
  234. runner.do_seek_random_task(on_seek_action, true);
  235. });
  236. }
  237. }
  238. private void on_seek_quest_move_done(BotClient.QuestData.SeekInfo seek_info)
  239. {
  240. if (runner.CurrentMoveAgent != null)
  241. {
  242. runner.CurrentMoveAgent.Stop();
  243. }
  244. log.Log("on_seek_quest_move_done : " + seek_info.quest);
  245. if (seek_info.areaId == bot.CurrentZoneLayer.SceneID)
  246. {
  247. switch (seek_info.quest.State)
  248. {
  249. case BotClient.QuestData.QuestStatus.NEW:
  250. bot.CurrentZoneActor.SendUnitGuard(false);
  251. runner.do_accept_quest(seek_info.quest, (err) => { do_clear_current_seeking(); });
  252. break;
  253. case BotClient.QuestData.QuestStatus.IN_PROGRESS:
  254. log.Error(seek_info.quest.SubType + " : " + seek_info.quest + " : " + seek_info.quest.State + " T=" + InProgressQuestTicking);
  255. switch (seek_info.quest.SubType)
  256. {
  257. case BotClient.QuestData.EventType.InterActiveItem:
  258. bot.CurrentZoneActor.SendUnitGuard(false);
  259. Vector2 move_to;
  260. var item = runner.do_try_pick_nearest_item(out move_to);
  261. if (item == null && move_to != null)
  262. {
  263. CurrentQuestSeeking.MoveTo = move_to;
  264. }
  265. break;
  266. case BotClient.QuestData.EventType.KillCollect:
  267. bot.CurrentZoneActor.SendUnitGuard(true);
  268. runner.do_start_pick_any_item();
  269. break;
  270. case BotClient.QuestData.EventType.FuckFB:
  271. case BotClient.QuestData.EventType.KillMonster:
  272. bot.CurrentZoneActor.SendUnitGuard(true);
  273. break;
  274. case BotClient.QuestData.EventType.InterActiveNpc:
  275. runner.do_update_quest_status(seek_info.quest);
  276. break;
  277. }
  278. break;
  279. case BotClient.QuestData.QuestStatus.CAN_FINISH:
  280. runner.do_submit_task(seek_info.quest, (err) =>
  281. {
  282. do_clear_current_seeking();
  283. runner.do_gm_finish_task(seek_info.quest.TemplateID);
  284. runner.do_seek_random_task(on_seek_action, true);
  285. });
  286. break;
  287. case BotClient.QuestData.QuestStatus.DONE:
  288. log.Log("DONE : " + seek_info.quest + " : " + seek_info.quest.State);
  289. CurrentQuestSeeking = null;
  290. bot.CurrentZoneActor.SendUnitGuard(false);
  291. runner.do_seek_random_task(on_seek_action);
  292. break;
  293. }
  294. }
  295. else
  296. {
  297. if (bot.CurrentRegionManager.CheckTrans(1, false) == false)
  298. {
  299. bot.CurrentZoneActor.SendUnitGuard(true);
  300. }
  301. log.Log("continue do_seek_task : " + seek_info.quest);
  302. runner.do_seek_task(seek_info.quest.TemplateID, on_seek_action);
  303. }
  304. if (seek_info.quest.State == BotClient.QuestData.QuestStatus.IN_PROGRESS)
  305. {
  306. InProgressQuestTicking++;
  307. if (InProgressQuestTicking >= Config.QuestTickingMaxTime)
  308. {
  309. InProgressQuestTicking = 0;
  310. runner.do_gm_finish_task(CurrentQuestSeeking.quest.TemplateID);
  311. bot.CurrentZoneLayer.AddTimeDelayMS(bot.Random.Next(Config.CheckIntervalMS, Config.CheckIntervalMS * 2), (t) =>
  312. {
  313. runner.do_seek_random_task(on_seek_action, true);
  314. });
  315. }
  316. }
  317. }
  318. [Desc("任务配置")]
  319. [Expandable]
  320. public class Config
  321. {
  322. [Desc("任务检测间隔")]
  323. public static int CheckIntervalMS = 5000;
  324. [Desc("任务进度最大尝试次数")]
  325. public static int QuestTickingMaxTime = 20;
  326. [Desc("寻路到达目的地距离")]
  327. public static float MinSeekRange = 0.01f;
  328. public override string ToString()
  329. {
  330. return "任务配置";
  331. }
  332. }
  333. }
  334. }