OuterMessageDispatcher.cs 1.4 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, PacketInfo packetInfo)
9
		{
10
			Type messageType = Game.Scene.GetComponent<OpcodeTypeComponent>().GetType(packetInfo.Opcode);
11
			object message = session.Network.MessagePacker.DeserializeFrom(messageType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);
12

13
			// gate session收到actor消息直接转发给actor自己去处理
14
			if (message is IActorMessage)
15
			{
16
				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
17
				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
18
				actorProxy.Send((IMessage)message);
19 20 21 22
				return;
			}

			// gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
23
			if (message is IActorRequest aActorRequest)
24
			{
25 26
				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
27
				IResponse response = await actorProxy.Call(aActorRequest);
28
				session.Reply(packetInfo.RpcId, response);
29 30 31
				return;
			}

32
			if (message != null)
33
			{
34
				Game.Scene.GetComponent<MessageDispatherComponent>().Handle(session, new MessageInfo(packetInfo.RpcId, packetInfo.Opcode, message));
35 36 37 38 39 40 41
				return;
			}

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