ModuleTask.cs 15 KB

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