RPGBattleClient.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using DeepCore;
  2. using DeepCore.FuckPomeloClient;
  3. using DeepCore.GameData.Zone;
  4. using DeepCore.Log;
  5. using DeepCore.Protocol;
  6. using DeepMMO.Protocol.Client;
  7. using System;
  8. using DeepCore.Game3D.Slave.Runtime;
  9. using DeepCore.Game3D.ZoneServer;
  10. namespace DeepMMO.Client.Battle
  11. {
  12. public class RPGBattleClient : AbstractBattle
  13. {
  14. protected readonly Logger log;
  15. protected readonly RPGClient client;
  16. protected readonly PomeloClient game_client;
  17. protected readonly ClientEnterZoneNotify enter;
  18. private long sent_package = 0;
  19. private long recv_package = 0;
  20. private TimeInterval<int> ping_interval = new TimeInterval<int>(3000);
  21. private TimeInterval<int> post_interval;
  22. private PackAction post_queue = new PackAction();
  23. public RPGClient Client { get => client; }
  24. public override KickedByServerNotifyB2C KickMessage { get { return null; } }
  25. public override bool IsNet { get { return true; } }
  26. public override long RecvPackages { get { return recv_package; } }
  27. public override long SendPackages { get { return sent_package; } }
  28. public int PingIntervalMS
  29. {
  30. get { return ping_interval.IntervalTimeMS; }
  31. set { ping_interval = new TimeInterval<int>(Math.Max(1000, value)); }
  32. }
  33. public string ZoneUUID { get => enter.s2c_ZoneUUID; }
  34. public ClientEnterZoneNotify Enter { get { return enter; } }
  35. public RPGBattleClient(RPGClient client, ClientEnterZoneNotify sd) : base(RPGClientBattleManager.DataRoot)
  36. {
  37. this.log = LoggerFactory.GetLogger(GetType().Name);
  38. this.client = client;
  39. this.game_client = client.GameClient;
  40. this.enter = sd;
  41. this.post_interval = new TimeInterval<int>(sd.s2c_ZoneUpdateIntervalMS);
  42. this.Layer.ActorSyncMode = SyncMode.MoveByClient_PreSkillByClient;
  43. }
  44. public override string ToString()
  45. {
  46. return string.Format("{1}({0})", enter.s2c_ZoneUUID, Layer.Data);
  47. }
  48. protected internal virtual void OnReceived(ClientBattleEvent notify)
  49. {
  50. try
  51. {
  52. recv_package++;
  53. object evt;
  54. if (RPGClientBattleManager.BattleCodec.doDecode(new ArraySegment<byte>(notify.s2c_battleEvent), out evt))
  55. {
  56. Layer.ProcessMessage(evt as IMessage);
  57. }
  58. }
  59. catch (Exception err)
  60. {
  61. log.Error(err.Message, err);
  62. }
  63. }
  64. protected virtual void SendToServer(object message)
  65. {
  66. try
  67. {
  68. ArraySegment<byte> bin;
  69. if (RPGClientBattleManager.BattleCodec.doEncode(message, out bin))
  70. {
  71. game_client.Notify(new ClientBattleAction() { c2s_battleAction = bin.Array });
  72. sent_package++;
  73. }
  74. }
  75. catch (Exception err)
  76. {
  77. log.Error(err.Message, err);
  78. }
  79. }
  80. public override void SendAction(DeepCore.GameData.Zone.Action action)
  81. {
  82. post_queue.actions.Add(action);
  83. }
  84. public override void BeginUpdate(int intervalMS)
  85. {
  86. base.BeginUpdate(intervalMS);
  87. if (post_interval.Update(intervalMS))
  88. {
  89. if (post_queue.actions.Count > 0)
  90. {
  91. try
  92. {
  93. //post_queue.object_id = Actor.ObjectID;
  94. SendToServer(post_queue);
  95. }
  96. finally
  97. {
  98. post_queue.actions.Clear();
  99. }
  100. }
  101. }
  102. }
  103. public override void Update()
  104. {
  105. base.Update();
  106. if (ping_interval.Update(Layer.CurrentIntervalMS))
  107. {
  108. SendToServer(new Ping());
  109. }
  110. }
  111. }
  112. }