FormTest.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. using CommonAI.RTS;
  2. using CommonAI.Zone;
  3. using CommonAI.Zone.Instance;
  4. using CommonAI.Zone.ZoneEditor;
  5. using CommonAIClient.Client;
  6. using CommonFroms;
  7. using CommonFroms.G2D;
  8. using CommonFroms.Utils;
  9. using CommonLang;
  10. using CommonLang.Concurrent;
  11. using CommonLang.Vector;
  12. using GameEditorPlugin;
  13. using GameEditorPlugin.Win32.BattleClient;
  14. using GameEditorPlugin.Win32.Runtime;
  15. using System;
  16. using System.Collections.Generic;
  17. using System.ComponentModel;
  18. using System.Data;
  19. using System.Drawing;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Text;
  23. using System.Threading;
  24. using System.Windows.Forms;
  25. using XmdsServerNode.Node;
  26. using XmdsServerTest.Server;
  27. using XmdsServerTestBots.Bot;
  28. namespace XmdsServerTest
  29. {
  30. public partial class FormTest : Form
  31. {
  32. private NodeTestServer server;
  33. private Random random = new Random();
  34. private List<UnitInfo> bot_templates = new List<UnitInfo>();
  35. private AtomicInteger bot_indexer = new AtomicInteger(1);
  36. public FormTest(NodeTestServer server)
  37. {
  38. InitializeComponent();
  39. this.pictureBoxRoomLayer.MouseWheel += new MouseEventHandler(pictureBoxRoomLayer_MouseWheel);
  40. this.listView_Nodes.ContextMenuStrip = menu_Node;
  41. this.server = server;
  42. this.bot_templates.AddRange(server.ListTestPlayerTemplates());
  43. }
  44. private void FormTest_FormClosing(object sender, FormClosingEventArgs e)
  45. {
  46. this.server.Shutdown();
  47. }
  48. private void timer1_Tick(object sender, EventArgs e)
  49. {
  50. if (server.Running)
  51. {
  52. RefreshZoneNodes();
  53. }
  54. }
  55. private void timer2_Tick(object sender, EventArgs e)
  56. {
  57. if (server.Running)
  58. {
  59. UpdateZoneNodes();
  60. pictureBoxRoomLayer.Refresh();
  61. }
  62. }
  63. private void timer3_Tick(object sender, EventArgs e)
  64. {
  65. if (server.Running)
  66. {
  67. ServerZoneNode node = SelectedZoneNode();
  68. if (node != null)
  69. {
  70. this.RemoveAllPlayer(node);
  71. UnitInfo unit1 = ZoneNodeManager.Templates.Templates.getUnit(100861);
  72. UnitInfo unit2 = ZoneNodeManager.Templates.Templates.getUnit(100862);
  73. UnitInfo unit3 = ZoneNodeManager.Templates.Templates.getUnit(100863);
  74. UnitInfo unit4 = ZoneNodeManager.Templates.Templates.getUnit(100864);
  75. UnitInfo unit5 = ZoneNodeManager.Templates.Templates.getUnit(100865);
  76. this.AddBots(node, unit1, 10, 20);
  77. this.AddBots(node, unit2, 11, 20);
  78. this.AddBots(node, unit3, 12, 20);
  79. this.AddBots(node, unit4, 13, 20);
  80. this.AddBots(node, unit5, 14, 20);
  81. }
  82. }
  83. }
  84. //----------------------------------------------------------------------------------------------------------------------
  85. #region _ZoneNodes列表刷新以及显示_
  86. private class ListViewTagComparer : System.Collections.IComparer
  87. {
  88. public int Compare(object x, object y)
  89. {
  90. ServerZoneNode stag = x as ServerZoneNode;
  91. BattleView dtag = y as BattleView;
  92. return (dtag.Node == stag) ? 0 : -1;
  93. }
  94. }
  95. private void RefreshZoneNodes()
  96. {
  97. this.lbl_Status.Text = server.Status;
  98. if (server.Running)
  99. {
  100. IList<ServerZoneNode> nodes = server.ListZoneNodes();
  101. if (!FormUtils.ListViewItemTagEquals(listView_Nodes, (System.Collections.IList)nodes, new ListViewTagComparer()))
  102. {
  103. listView_Nodes.SuspendLayout();
  104. listView_Nodes.Items.Clear();
  105. foreach (ServerZoneNode node in nodes)
  106. {
  107. ListViewItem nodeItem = new ListViewItem(node.UUID.ToString());
  108. nodeItem.SubItems.Add(node.ToString());
  109. nodeItem.SubItems.Add(node.PlayerCount.ToString());
  110. nodeItem.Tag = new BattleView(node);
  111. listView_Nodes.Items.Add(nodeItem);
  112. }
  113. listView_Nodes.ResumeLayout();
  114. }
  115. else
  116. {
  117. foreach (ListViewItem nodeItem in listView_Nodes.Items)
  118. {
  119. ServerZoneNode node = (nodeItem.Tag as BattleView).Node;
  120. nodeItem.SubItems[1].Text = (node.ToString());
  121. nodeItem.SubItems[2].Text = (node.PlayerCount.ToString());
  122. }
  123. }
  124. }
  125. else
  126. {
  127. listView_Nodes.Items.Clear();
  128. }
  129. }
  130. private void UpdateZoneNodes()
  131. {
  132. this.lbl_Status.Text = server.Status;
  133. if (server.Running)
  134. {
  135. foreach (ListViewItem nodeItem in listView_Nodes.Items)
  136. {
  137. BattleView view = (nodeItem.Tag as BattleView);
  138. view.update();
  139. }
  140. }
  141. }
  142. public ServerZoneNode SelectedZoneNode()
  143. {
  144. if (listView_Nodes.SelectedItems.Count > 0)
  145. {
  146. return (listView_Nodes.SelectedItems[0].Tag as BattleView).Node;
  147. }
  148. return null;
  149. }
  150. public BattleView SelectedBattleView()
  151. {
  152. if (listView_Nodes.SelectedItems.Count > 0)
  153. {
  154. return listView_Nodes.SelectedItems[0].Tag as BattleView;
  155. }
  156. return null;
  157. }
  158. //----------------------------------------------------------------------------------------------------------------------
  159. private void listView_Nodes_SelectedIndexChanged(object sender, EventArgs e)
  160. {
  161. BattleView bv = SelectedBattleView();
  162. if (bv != null)
  163. {
  164. float scale = Math.Max(
  165. ((float)pictureBoxRoomLayer.Width) / bv.Width,
  166. ((float)pictureBoxRoomLayer.Height) / bv.Height);
  167. bv.setCamera(bv.Width / 2, bv.Height / 2);
  168. bv.setCameraScale(scale, scale);
  169. }
  170. }
  171. #endregion
  172. //----------------------------------------------------------------------------------------------------------------------
  173. #region __BattleView__
  174. public class BattleLocalView : BattleLocal
  175. {
  176. private EditorScene mZone;
  177. public BattleLocalView(EditorScene zone)
  178. : base(ZoneNodeManager.Templates)
  179. {
  180. this.mZone = zone;
  181. this.Layer.ProcessMessage(new CommonAI.ZoneClient.ClientEnterScene(mZone.Data.ID, mZone.SpaceDivSize, ZoneNodeManager.Templates.Templates.ResourceVersion));
  182. }
  183. public override EditorScene Zone
  184. {
  185. get { return mZone; }
  186. }
  187. }
  188. public class BattleView : DisplayBattleLocal<BattleLocalView>
  189. {
  190. public ServerZoneNode Node { get { return room; } }
  191. private ServerZoneNode room;
  192. private long mLastUpdateTime;
  193. public BattleView(ServerZoneNode room)
  194. {
  195. base.ShowGuardRange = false;
  196. base.ShowAttackRange = false;
  197. base.ShowDamageRange = false;
  198. base.ShowName = true;
  199. base.ShowHP = true;
  200. this.room = room;
  201. base.InitClient(new BattleLocalView(room.Zone));
  202. this.room.Zone.OnPostEvent += zone_OnPostEvent;
  203. this.room.Zone.OnUpdate += zone_OnUpdate;
  204. }
  205. private void zone_OnPostEvent(InstanceZone zone, Event e)
  206. {
  207. Battle.onEventHandler(e);
  208. }
  209. private void zone_OnUpdate(CommonAI.Zone.Instance.InstanceZone zone)
  210. {
  211. SyncPosEvent.UnitPos pos = new SyncPosEvent.UnitPos();
  212. foreach (CommonAI.Zone.Instance.InstanceZoneObject so in room.Zone.AllObjects)
  213. {
  214. CommonAI.ZoneClient.ZoneObject co = Client.Layer.GetObject(so.ID);
  215. if (co != null)
  216. {
  217. pos = so.GetSyncPos();
  218. co.SyncPos(ref pos);
  219. }
  220. }
  221. }
  222. protected override void clientUpdate(int intervalMS)
  223. {
  224. Battle.BeginUpdate(intervalMS);
  225. Battle.Update();
  226. }
  227. public void update()
  228. {
  229. long curTime = CommonLang.CUtils.CurrentTimeMS;
  230. if (mLastUpdateTime == 0)
  231. {
  232. mLastUpdateTime = curTime;
  233. }
  234. int intervalMS = (int)(curTime - mLastUpdateTime);
  235. this.mLastUpdateTime = curTime;
  236. base.update(intervalMS);
  237. }
  238. }
  239. private Vector2 pic_lastMouesDown;
  240. private Vector2 pic_lastCameraPos;
  241. private void pictureBoxRoomLayer_MouseWheel(object sender, MouseEventArgs e)
  242. {
  243. try
  244. {
  245. BattleView bv = SelectedBattleView();
  246. if (bv != null)
  247. {
  248. int d = CMath.getDirect(e.Delta);
  249. if (d > 0)
  250. {
  251. float newD = bv.getCameraScale() * 1.1f;
  252. bv.setCameraScale(newD, newD);
  253. }
  254. else if (d < 0)
  255. {
  256. float newD = bv.getCameraScale() / 1.1f;
  257. bv.setCameraScale(newD, newD);
  258. }
  259. }
  260. }
  261. catch (Exception err)
  262. {
  263. Console.WriteLine(err.Message);
  264. }
  265. }
  266. private void pictureBoxRoomLayer_MouseDown(object sender, MouseEventArgs e)
  267. {
  268. pictureBoxRoomLayer.Focus();
  269. BattleView bv = SelectedBattleView();
  270. if (bv != null)
  271. {
  272. if (e.Button == System.Windows.Forms.MouseButtons.Right)
  273. {
  274. pic_lastMouesDown = new Vector2(e.Location.X, e.Location.Y);
  275. pic_lastCameraPos = new Vector2(bv.CameraX, bv.CameraY);
  276. }
  277. }
  278. }
  279. private void pictureBoxRoomLayer_MouseUp(object sender, MouseEventArgs e)
  280. {
  281. pic_lastMouesDown = null;
  282. pic_lastCameraPos = null;
  283. }
  284. private void pictureBoxRoomLayer_MouseMove(object sender, MouseEventArgs e)
  285. {
  286. BattleView bv = SelectedBattleView();
  287. if (bv != null)
  288. {
  289. if (e.Button == System.Windows.Forms.MouseButtons.Right)
  290. {
  291. if (pic_lastMouesDown != null)
  292. {
  293. float x = pic_lastCameraPos.X + bv.screenToWorldSizeX(pic_lastMouesDown.X - e.X);
  294. float y = pic_lastCameraPos.Y + bv.screenToWorldSizeY(pic_lastMouesDown.Y - e.Y);
  295. bv.setCamera(x, y);
  296. }
  297. }
  298. }
  299. }
  300. private void pictureBoxRoomLayer_Paint(object sender, PaintEventArgs e)
  301. {
  302. try
  303. {
  304. BattleView bv = SelectedBattleView();
  305. if (bv != null)
  306. {
  307. bv.setWindow(new RectangleF(0, 0, pictureBoxRoomLayer.Width, pictureBoxRoomLayer.Height));
  308. bv.render(e.Graphics);
  309. }
  310. }
  311. catch (Exception err)
  312. {
  313. Console.WriteLine(err.Message);
  314. }
  315. }
  316. #endregion
  317. //----------------------------------------------------------------------------------------------------------------------
  318. #region __测试客户端__
  319. private void btn_AddScene_Click(object sender, EventArgs e)
  320. {
  321. var list = ZoneNodeManager.Templates.LoadAllScenes();
  322. var dialog = new G2DListSelectEditor<SceneData>(list);
  323. if (dialog.ShowDialog() == DialogResult.OK)
  324. {
  325. var temp = dialog.SelectedObject;
  326. if (temp != null)
  327. {
  328. try
  329. {
  330. var node = NodeTestServer.Instance.AddTestScene(temp.ID);
  331. }
  332. catch (Exception err)
  333. {
  334. MessageBox.Show(err.Message);
  335. }
  336. }
  337. }
  338. }
  339. private void btn_AddAllScene_Click(object sender, EventArgs e)
  340. {
  341. foreach (var sceneID in ZoneNodeManager.Templates.ListScenes())
  342. {
  343. try
  344. {
  345. var node = NodeTestServer.Instance.AddTestScene(sceneID);
  346. }
  347. catch (Exception err)
  348. {
  349. MessageBox.Show(err.Message);
  350. }
  351. }
  352. }
  353. private void btn_AddBatchBots_Click(object sender, EventArgs e)
  354. {
  355. string _count = G2DTextDialog.Show(server.ZoneNodesCount.ToString(), "输入数量");
  356. int count;
  357. if (_count != null && int.TryParse(_count, out count))
  358. {
  359. AddBots(count);
  360. }
  361. }
  362. private void menuBtn_AddPlayer_Click(object sender, EventArgs e)
  363. {
  364. ServerZoneNode node = SelectedZoneNode();
  365. if (node != null)
  366. {
  367. AddTestClient(node);
  368. }
  369. }
  370. private void addBatchBotsToolStripMenuItem_Click(object sender, EventArgs e)
  371. {
  372. string _count = G2DTextDialog.Show(server.ZoneNodesCount.ToString(), "输入数量");
  373. int count;
  374. if (_count != null && int.TryParse(_count, out count))
  375. {
  376. ServerZoneNode node = SelectedZoneNode();
  377. if (node != null)
  378. {
  379. AddBots(node, count);
  380. }
  381. }
  382. }
  383. private void removeAllPlayerToolStripMenuItem_Click(object sender, EventArgs e)
  384. {
  385. ServerZoneNode node = SelectedZoneNode();
  386. if (node != null)
  387. {
  388. RemoveAllPlayer(node);
  389. }
  390. }
  391. //-------------------------------------------------------------------------------------------------------------------------
  392. #region PlayerAPI
  393. private void AddTestClient(ServerZoneNode node)
  394. {
  395. string tempID = G2DTextDialog.Show(3.ToString(), "输入单位模板ID");
  396. int unit_template_id;
  397. if (tempID != null && int.TryParse(tempID, out unit_template_id))
  398. {
  399. try
  400. {
  401. var client = FormTestClient.StartWinForm(unit_template_id, 2, node.UUID, node.SceneID);
  402. }
  403. catch (Exception err)
  404. {
  405. MessageBox.Show(err.Message);
  406. }
  407. }
  408. }
  409. public void AddBot()
  410. {
  411. UnitInfo unit = CUtils.GetRandomInArray<UnitInfo>(bot_templates, random);
  412. if (unit != null)
  413. {
  414. string name = unit.Name + "_" + bot_indexer.IncrementAndGet();
  415. BotPlayer ret = new BotPlayer(name, "", unit, 0,
  416. ZoneNodeManager.Templates,
  417. NodeTestServer.Instance.ClientConnectString);
  418. ret.Start();
  419. }
  420. }
  421. public void AddBots(int count)
  422. {
  423. for (int i = 0; i < count; i++)
  424. {
  425. AddBot();
  426. }
  427. }
  428. public void AddBot(ServerZoneNode node)
  429. {
  430. string tempID = G2DTextDialog.Show(3.ToString(), "输入单位模板ID");
  431. int unit_template_id;
  432. if (tempID != null && int.TryParse(tempID, out unit_template_id))
  433. {
  434. UnitInfo unit = ZoneNodeManager.Templates.Templates.getUnit(unit_template_id);
  435. if (unit != null)
  436. {
  437. string name = unit.Name + "_" + bot_indexer.IncrementAndGet();
  438. BotPlayer ret = new BotPlayer(name, "", unit, 0,
  439. ZoneNodeManager.Templates,
  440. NodeTestServer.Instance.ClientConnectString);
  441. ret.Start();
  442. }
  443. }
  444. }
  445. public void AddBots(ServerZoneNode node, int count)
  446. {
  447. string tempID = G2DTextDialog.Show(3.ToString(), "输入单位模板ID");
  448. int unit_template_id;
  449. if (tempID != null && int.TryParse(tempID, out unit_template_id))
  450. {
  451. UnitInfo unit = ZoneNodeManager.Templates.Templates.getUnit(unit_template_id);
  452. if (unit != null)
  453. {
  454. for (int i = 0; i < count; i++)
  455. {
  456. string name = unit.Name + "_" + bot_indexer.IncrementAndGet();
  457. BotPlayer ret = new BotPlayer(name, "", unit, 0,
  458. ZoneNodeManager.Templates,
  459. NodeTestServer.Instance.ClientConnectString);
  460. ret.Start();
  461. }
  462. }
  463. }
  464. }
  465. public void AddBots(ServerZoneNode node, UnitInfo unit, int force, int count)
  466. {
  467. for (int i = 0; i < count; i++)
  468. {
  469. string name = unit.Name + "_" + bot_indexer.IncrementAndGet();
  470. BotPlayer ret = new BotPlayer(name, "", unit, force,
  471. ZoneNodeManager.Templates,
  472. NodeTestServer.Instance.ClientConnectString);
  473. ret.Start();
  474. }
  475. }
  476. private void RemoveAllPlayer(ServerZoneNode node)
  477. {
  478. using (var plist = ListObjectPool<ServerZoneNode.PlayerClient>.AllocAutoRelease())
  479. {
  480. node.ForEachPlayers((p) => { plist.Add(p); });
  481. foreach (var p in plist)
  482. {
  483. var pc = (p.Client as ServerZoneNode.ZoneNodePlayer).SessionPlayer as AppSessionPlayer;
  484. pc.ForceExit();
  485. }
  486. }
  487. }
  488. #endregion
  489. //-------------------------------------------------------------------------------------------------------------------------
  490. #endregion
  491. private void gCToolStripMenuItem_Click(object sender, EventArgs e)
  492. {
  493. GC.Collect();
  494. GC.WaitForFullGCComplete();
  495. }
  496. //----------------------------------------------------------------------------------------------------------------------
  497. }
  498. }