BotRunner.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using CommonAI.Zone;
  2. using CommonAI.Zone.Instance;
  3. using CommonAI.Zone.ZoneEditor;
  4. using CommonAIServer.Connector.Client;
  5. using CommonLang;
  6. using CommonLang.Concurrent;
  7. using CommonLang.Log;
  8. using CommonLang.Property;
  9. using CommonLang.Protocol;
  10. using CommonNetwork.Sockets;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.IO;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Threading.Tasks;
  17. namespace CommonAIServer.Connector.Bot
  18. {
  19. public class BotRunner
  20. {
  21. public static BotRunner Instance { get; private set; }
  22. public static InstanceZoneFactory ZoneFactory { get; private set; }
  23. public static MessageFactoryGenerator MessageFactory { get; private set; }
  24. public static EditorTemplates Templates { get; private set; }
  25. public static string ConnectString { get; private set; }
  26. private Logger log = LoggerFactory.GetLogger("BotRunner");
  27. public bool IsRunning { get; private set; }
  28. public BotRunner(string factoryClass, string dataRoot, string connectString)
  29. {
  30. log.Info("********************************************************");
  31. log.Info("# 初始化");
  32. log.Info("********************************************************");
  33. ZoneFactory = ReflectionUtil.CreateInterface<InstanceZoneFactory>(factoryClass);
  34. TemplateManager.setFactory(ZoneFactory);
  35. log.Info(" 战斗编辑器插件 --> " + ZoneFactory);
  36. MessageFactory = TemplateManager.MessageCodec;
  37. log.Info("\r\n" + MessageFactory.ListAll(" "));
  38. Templates = new EditorTemplates(dataRoot, MessageFactory);
  39. EditorTemplates.DEFAULT_LOAD_FROM_BIN = true;
  40. Templates.LoadAllTemplates();
  41. ConnectString = connectString; ;
  42. Instance = this;
  43. }
  44. public void Start()
  45. {
  46. this.IsRunning = true;
  47. }
  48. public void Shutdown()
  49. {
  50. this.IsRunning = false;
  51. }
  52. //-------------------------------------------------------------------------------------------------
  53. private AtomicInteger test_player_indexer = new AtomicInteger(0);
  54. private HashMap<string, BotPlayer> Bots = new HashMap<string, BotPlayer>();
  55. private Random random = new Random();
  56. public List<BotPlayer> BotsList { get { lock (Bots) { return new List<BotPlayer>(Bots.Values); } } }
  57. public int BotsCount { get { lock (Bots) { return Bots.Count; } } }
  58. public string BotsStatus
  59. {
  60. get
  61. {
  62. StringBuilder sb = new StringBuilder();
  63. foreach (BotPlayer bot in BotsList)
  64. {
  65. sb.AppendLine(string.Format("Bot[{0}] IsRunning={1}", bot.Name, bot.IsRunning));
  66. }
  67. return sb.ToString();
  68. }
  69. }
  70. public BotPlayer AddBot(int force, List<int> templates)
  71. {
  72. int templateID = CUtils.GetRandomInArray(templates, random);
  73. UnitInfo unit = Templates.Templates.getUnit(templateID);
  74. if (unit == null)
  75. {
  76. log.Error("没有测试单位!");
  77. return null;
  78. }
  79. string name = unit.Name + "_" + test_player_indexer.IncrementAndGet();
  80. BotPlayer ret = null;
  81. lock (Bots)
  82. {
  83. if (Bots.ContainsKey(name))
  84. {
  85. log.ErrorFormat("已包含单位[{0}]!", name);
  86. return null;
  87. }
  88. ret = new BotPlayer(name, "", unit, force, Templates, ConnectString);
  89. Bots.Add(name, ret);
  90. log.InfoFormat("已添加单位: {0}", name);
  91. }
  92. ret.Start();
  93. return ret;
  94. }
  95. public void AddBots(int count, int force, List<int> templates = null)
  96. {
  97. for (int i = 0; i < count; i++)
  98. {
  99. AddBot(force, templates);
  100. }
  101. }
  102. public void CleanupBots()
  103. {
  104. foreach (BotPlayer bot in BotsList)
  105. {
  106. if (!bot.IsRunning)
  107. {
  108. lock (Bots)
  109. {
  110. Bots.Remove(bot.Name);
  111. }
  112. bot.Dispose();
  113. }
  114. }
  115. }
  116. public void StopAllBots()
  117. {
  118. foreach (BotPlayer bot in BotsList)
  119. {
  120. bot.SendLeaveRoom();
  121. }
  122. CleanupBots();
  123. }
  124. public void StopBot(BotPlayer bot)
  125. {
  126. bot.SendLeaveRoom();
  127. CleanupBots();
  128. }
  129. }
  130. }