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 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 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
			
			// 如果是帧指令消息,构造成OneFrameMessage发给对应的unit
			if (message is IFrameMessage)
			{
				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);

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

				OneFrameMessage oneFrameMessage = new OneFrameMessage();
				oneFrameMessage.Op = opcode;
				oneFrameMessage.AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage);
				actorProxy.Send(oneFrameMessage);
				return;
			}
30

31
			// gate session收到actor消息直接转发给actor自己去处理
32
			if (message is IActorMessage)
33
			{
34
				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
35
				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
36
				actorProxy.Send((IMessage)message);
37 38 39 40
				return;
			}

			// gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
41
			if (message is IActorRequest aActorRequest)
42
			{
43 44
				long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
				ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
45
				IResponse response = await actorProxy.Call(aActorRequest);
46
				session.Reply(response);
47 48 49
				return;
			}

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

			throw new Exception($"message type error: {message.GetType().FullName}");
		}
58 59 60 61 62

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