OuterMessageDispatcher.cs 2.2 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
		{
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
			
T
tanghai 已提交
14
			switch (message)
15
			{
T
tanghai 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
				case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit
				{
					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);

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

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

					int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId
					IResponse response = await actorProxy.Call(iActorRequest);
					response.RpcId = rpcId;

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

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

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