XmdsNetClient.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Pomelo.DotNetClient;
  2. using System;
  3. using pomelo.area;
  4. using XmdsBattleClient.Battle;
  5. using Pomelo.DotNetClient.NetClient;
  6. using CommonAI.Zone.ZoneEditor;
  7. using System.Diagnostics;
  8. using System.IO;
  9. namespace XmdsBattleClientBot.XmdsBot
  10. {
  11. /// <summary>
  12. /// 机器人实体对象
  13. /// </summary>
  14. public class XmdsNetClient : BaseNetClient<GateSocket, GameSocket, XmdsBattleClient.Battle.XmdsBattleClient>
  15. {
  16. public LoginHandler LoginHandler { get; private set; }
  17. public override EditorTemplates DataRoot { get { return XmdsBattleManager.DataRoot; } }
  18. public XmdsNetClient(bool auto_invoke_change_scene = false)
  19. : base(new GateSocket(new ProtoSerializer()), new GameSocket(new ProtoSerializer()))
  20. {
  21. this.LoginHandler = new LoginHandler(this);
  22. this.OnBattlePlayerReady += XmdsNetClient_OnBattlePlayerReady;
  23. if (auto_invoke_change_scene)
  24. {
  25. this.GameSocket.listen<ChangeAreaPush>(new Action<ChangeAreaPush>((act) =>
  26. {
  27. this.LoginHandler.Invoke_ChangeScene();
  28. }));
  29. }
  30. }
  31. public override XmdsBattleClient.Battle.XmdsBattleClient CreateBattle()
  32. {
  33. return new XmdsBattleClient.Battle.XmdsBattleClient(this);
  34. }
  35. //public override void SendBattleMessage(CommonAI.Zone.Action action)
  36. //{
  37. // byte[] bin;
  38. // // 将战斗服协议编码成二进制 //
  39. // if (mBattleCodec.doEncodeBin(out bin, action))
  40. // {
  41. // GameSocket.playerHandler.battleEventNotify(bin);
  42. // }
  43. //}
  44. private readonly MemoryStream writeBuffer = new MemoryStream(2048);
  45. public override void SendBattleMessage(CommonAI.Zone.Action action)
  46. {
  47. if (writeBuffer != null)
  48. {
  49. writeBuffer.Position = 0;
  50. if (mBattleCodec.doEncode(writeBuffer, action))
  51. {
  52. var route = EventTypes.GetNotifyKey(typeof(BattleEventNotify));
  53. GameSocket.send(route, 0, writeBuffer);
  54. }
  55. }
  56. }
  57. //-----------------------------------------------------------------------------------------
  58. #region _监视进入场景时间_
  59. private Stopwatch entry_server_watch = new Stopwatch();
  60. internal void StartEntryServer()
  61. {
  62. entry_server_watch.Reset();
  63. entry_server_watch.Start();
  64. }
  65. private void XmdsNetClient_OnBattlePlayerReady(CommonAI.ZoneClient.ZoneLayer arg1, CommonAI.ZoneClient.ZoneActor arg2)
  66. {
  67. entry_server_watch.Stop();
  68. this.EntryServerElapsedMS = entry_server_watch.ElapsedMilliseconds;
  69. }
  70. public long EntryServerElapsedMS
  71. {
  72. get; private set;
  73. }
  74. #endregion
  75. //-----------------------------------------------------------------------------------------
  76. }
  77. public class ProtoSerializer : ISerializer
  78. {
  79. private ProtobufSerializer ser = new ProtobufSerializer();
  80. public object Deserialize(Stream source, object value, Type type)
  81. {
  82. return ser.Deserialize(source, value, type);
  83. }
  84. public void Serialize(Stream stream, object msg)
  85. {
  86. ser.Serialize(stream, msg);
  87. }
  88. }
  89. }