OuterMessageDispatcher.cs 2.0 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
				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;
				}
				case IActorMessage _: // gate session收到actor消息直接转发给actor自己去处理
				{
					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
					actorProxy.Send((IMessage)message);
					return;
				}
				case IActorRequest aActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
				{
					long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
					ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
					IResponse response = await actorProxy.Call(aActorRequest);
					session.Reply(response);
					return;
				}
47 48
			}

49
			if (message != null)
50
			{
51
				Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message));
52 53 54 55 56 57 58
				return;
			}

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