ClientFrameComponent.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using System;
  2. using System.Collections.Generic;
  3. namespace ETModel
  4. {
  5. public struct SessionFrameMessage
  6. {
  7. public Session Session;
  8. public FrameMessage FrameMessage;
  9. }
  10. [ObjectSystem]
  11. public class ClientFrameComponentUpdateSystem : UpdateSystem<ClientFrameComponent>
  12. {
  13. public override void Update(ClientFrameComponent self)
  14. {
  15. self.Update();
  16. }
  17. }
  18. public class ClientFrameComponent: Component
  19. {
  20. public int Frame;
  21. public Queue<SessionFrameMessage> Queue = new Queue<SessionFrameMessage>();
  22. public int count = 1;
  23. public int waitTime = 100;
  24. public const int maxWaitTime = 100;
  25. public void Add(Session session, FrameMessage frameMessage)
  26. {
  27. this.Queue.Enqueue(new SessionFrameMessage() {Session = session, FrameMessage = frameMessage});
  28. }
  29. public void Update()
  30. {
  31. if (this.Queue.Count == 0)
  32. {
  33. return;
  34. }
  35. SessionFrameMessage sessionFrameMessage = this.Queue.Dequeue();
  36. this.Frame = sessionFrameMessage.FrameMessage.Frame;
  37. for (int i = 0; i < sessionFrameMessage.FrameMessage.Message.Count; ++i)
  38. {
  39. OneFrameMessage oneFrameMessage = sessionFrameMessage.FrameMessage.Message[i];
  40. Session session = sessionFrameMessage.Session;
  41. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  42. Type type = opcodeTypeComponent.GetType((ushort)oneFrameMessage.Op);
  43. byte[] bytes = oneFrameMessage.AMessage.ToByteArray();
  44. IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, bytes, 0, bytes.Length);
  45. Game.Scene.GetComponent<MessageDispatherComponent>().Handle(sessionFrameMessage.Session, new MessageInfo((ushort)oneFrameMessage.Op, message));
  46. }
  47. }
  48. }
  49. }