OuterMessageDispatcher.cs 2.3 KB
Newer Older
1
using System;
2
using ETModel;
3

4
namespace ETHotfix
5 6 7
{
	public class OuterMessageDispatcher: IMessageDispatcher
	{
8
		public async void Dispatch(Session session, Packet packet)
9
		{
T
tanghai 已提交
10
			ushort opcode = packet.Opcode;
T
tanghai 已提交
11
			Type messageType = session.Network.Entity.GetComponent<OpcodeTypeComponent>().GetType(opcode);
12
			object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
13 14 15

			//Log.Debug($"recv: {JsonHelper.ToJson(message)}");

T
tanghai 已提交
16
			switch (message)
17
			{
T
tanghai 已提交
18 19 20
				case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit
				{
					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
21
					ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
T
tanghai 已提交
22 23 24 25 26 27 28 29 30

					// 这里设置了帧消息的id,防止客户端伪造
					iFrameMessage.Id = unitId;

					OneFrameMessage oneFrameMessage = new OneFrameMessage
					{
						Op = opcode,
						AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage)
					};
31
					actorMessageSender.Send(oneFrameMessage);
T
tanghai 已提交
32 33
					return;
				}
34
				case IActorRequest iActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
T
tanghai 已提交
35 36
				{
					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
37
					ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
38 39

					int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId
40
					IResponse response = await actorMessageSender.Call(iActorRequest);
41 42 43
					response.RpcId = rpcId;

					session.Reply(response);
T
tanghai 已提交
44 45
					return;
				}
46
				case IActorMessage iActorMessage: // gate session收到actor消息直接转发给actor自己去处理
T
tanghai 已提交
47 48
				{
					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
49 50
					ActorMessageSender actorMessageSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(unitId);
					actorMessageSender.Send(iActorMessage);
T
tanghai 已提交
51 52
					return;
				}
53 54
			}

55
			if (message != null)
56
			{
57
				Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message));
58 59 60 61 62 63 64
				return;
			}

			throw new Exception($"message type error: {message.GetType().FullName}");
		}
	}
}