OuterMessageDispatcher.cs 1.5 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 11 12
			ushort opcode = packet.Opcode();
			Type messageType = Game.Scene.GetComponent<OpcodeTypeComponent>().GetType(opcode);
			object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
13

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

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

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

			throw new Exception($"message type error: {message.GetType().FullName}");
		}
41 42 43 44 45

		public void Dispatch(Session session, ushort opcode, object message)
		{
			throw new NotImplementedException();
		}
46 47
	}
}