CTT/Server/Hotfix/Module/Message/OuterMessageDispatcher.cs

89 lines
3.7 KiB
C#
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.IO;
namespace ET
{
public class OuterMessageDispatcher: IMessageDispatcher
{
public void Dispatch(Session session, MemoryStream memoryStream)
{
ushort opcode = BitConverter.ToUInt16(memoryStream.GetBuffer(), Packet.KcpOpcodeIndex);
Type type = OpcodeTypeComponent.Instance.GetType(opcode);
object message = MessageSerializeHelper.DeserializeFrom(opcode, type, memoryStream);
if (message is IResponse response)
{
session.OnRead(opcode, response);
return;
}
OpcodeHelper.LogMsg(session.DomainZone(), opcode, message);
DispatchAsync(session, opcode, message).Coroutine();
}
public async ETVoid DispatchAsync(Session session, ushort opcode, object message)
{
// 根据消息接口判断是不是Actor消息不同的接口做不同的处理
switch (message)
{
case IActorLocationRequest actorLocationRequest: // gate session收到actor rpc消息先向actor 发送rpc请求再将请求结果返回客户端
{
SessionPlayerComponent sessionPlayerComponent = session.GetComponent<SessionPlayerComponent>();
long unitId = sessionPlayerComponent.User.Id;
int maxRpcId = sessionPlayerComponent.maxRpcId;
int rpcId = actorLocationRequest.RpcId; // 这里要保存客户端的rpcId
if (maxRpcId > rpcId)
{
try
{
session.Send(new G2C_ForceOffLine());
await TimerComponent.Instance.WaitAsync(300);
session.Dispose();
User user = await DBComponent.Instance.Query<User>(unitId);
Log.Error($"***********************\n\n【{user?.NickName}({unitId})】 作弊 {maxRpcId} {rpcId}");
}
catch (Exception e)
{
Log.Error(e);
}
return;
}
sessionPlayerComponent.maxRpcId = rpcId;
long instanceId = session.InstanceId;
IResponse response = await ActorLocationSenderComponent.Instance.Call(unitId, actorLocationRequest);
response.RpcId = rpcId;
// session可能已经断开了所以这里需要判断
if (session.InstanceId == instanceId)
{
session.Reply(response);
}
break;
}
case IActorLocationMessage actorLocationMessage:
{
long unitId = session.GetComponent<SessionPlayerComponent>().User.Id;
ActorLocationSenderComponent.Instance.Send(unitId, actorLocationMessage);
break;
}
case IActorRequest actorRequest: // 分发IActorRequest消息目前没有用到需要的自己添加
{
break;
}
case IActorMessage actorMessage: // 分发IActorMessage消息目前没有用到需要的自己添加
{
break;
}
default:
{
// 非Actor消息
MessageDispatcherComponent.Instance.Handle(session, opcode, message);
break;
}
}
}
}
}