提交 cad891d5 编写于 作者: T tanghai

整理代码

上级 7a7d58b6
......@@ -12,6 +12,8 @@ namespace ETHotfix
public async Task Handle(Session session, Entity entity, ActorRequest actorRequest)
{
ActorResponse actorResponse = new ActorResponse();
actorResponse.RpcId = actorRequest.RpcId;
try
{
OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
......@@ -21,8 +23,7 @@ namespace ETHotfix
// 发送给客户端
Session clientSession = entity as Session;
clientSession.Send(actorResponse.Flag, message);
actorResponse.RpcId = actorRequest.RpcId;
session.Reply(actorResponse);
await Task.CompletedTask;
}
......@@ -30,7 +31,6 @@ namespace ETHotfix
{
actorResponse.Error = ErrorCode.ERR_SessionActorError;
actorResponse.Message = $"session actor error {e}";
actorResponse.RpcId = actorRequest.RpcId;
session.Reply(actorResponse);
throw;
}
......@@ -44,6 +44,7 @@ namespace ETHotfix
OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
Type type = opcodeTypeComponent.GetType(actorRequest.Op);
IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage);
await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
}
}
......@@ -63,9 +64,11 @@ namespace ETHotfix
{
Game.Scene.GetComponent<ServerFrameComponent>().Add(aFrameMessage);
ActorResponse actorResponse = new ActorResponse();
actorResponse.RpcId = actorRequest.RpcId;
session.Reply(actorResponse);
ActorResponse actorResponse = new ActorResponse
{
RpcId = actorRequest.RpcId
};
session.Reply(actorResponse);
return;
}
await Game.Scene.GetComponent<ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message);
......
......@@ -8,43 +8,42 @@ namespace ETHotfix
public async void Dispatch(Session session, Packet packet)
{
ushort opcode = packet.Opcode();
Type messageType = Game.Scene.GetComponent<OpcodeTypeComponent>().GetType(opcode);
Type messageType = session.Network.Entity.GetComponent<OpcodeTypeComponent>().GetType(opcode);
object message = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
// 如果是帧指令消息,构造成OneFrameMessage发给对应的unit
if (message is IFrameMessage)
switch (message)
{
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;
}
// gate session收到actor消息直接转发给actor自己去处理
if (message is IActorMessage)
{
long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
ActorProxy actorProxy = Game.Scene.GetComponent<ActorProxyComponent>().Get(unitId);
actorProxy.Send((IMessage)message);
return;
}
// gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
if (message is IActorRequest aActorRequest)
{
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;
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;
}
}
if (message != null)
......@@ -55,10 +54,5 @@ namespace ETHotfix
throw new Exception($"message type error: {message.GetType().FullName}");
}
public void Dispatch(Session session, ushort opcode, object message)
{
throw new NotImplementedException();
}
}
}
......@@ -75,7 +75,7 @@ namespace ETModel
return actorHandler;
}
public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, object message)
public async Task Handle(Session session, Entity entity, ActorRequest actorRequest, IMessage message)
{
if (!this.handlers.TryGetValue(message.GetType(), out IMActorHandler handler))
{
......
......@@ -208,39 +208,26 @@ namespace ETModel
public void Send(IMessage message)
{
ActorTask task = new ActorTask();
task.message = message;
task.proxy = this;
ActorTask task = new ActorTask
{
message = message,
proxy = this
};
this.Add(task);
}
public Task<IResponse> Call(IRequest request)
{
ActorTask task = new ActorTask();
task.message = request;
task.proxy = this;
task.Tcs = new TaskCompletionSource<IResponse>();
ActorTask task = new ActorTask
{
message = request,
proxy = this,
Tcs = new TaskCompletionSource<IResponse>()
};
this.Add(task);
return task.Tcs.Task;
}
public async Task<IResponse> RealCall(ActorRequest request, CancellationToken cancellationToken)
{
try
{
//Log.Debug($"realcall {MongoHelper.ToJson(request)} {this.Address}");
request.Id = this.Id;
Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.Address);
IResponse response = await session.Call(request, cancellationToken);
return response;
}
catch (RpcException e)
{
Log.Error($"{this.Address} {e}");
throw;
}
}
public string DebugQueue(Queue<ActorTask> tasks)
{
string s = "";
......
......@@ -7,7 +7,7 @@ namespace ETModel
{
public ActorProxy proxy;
public object message;
public IMessage message;
public TaskCompletionSource<IResponse> Tcs;
......
......@@ -28,7 +28,6 @@ namespace ETModel
{
private readonly Dictionary<ushort, List<IMHandler>> handlers = new Dictionary<ushort, List<IMHandler>>();
public void Awake()
{
this.Load();
......
......@@ -240,7 +240,7 @@ namespace ETModel
this.Send(0x01, message);
}
public void Send(byte flag, object message)
public void Send(byte flag, IMessage message)
{
OpcodeTypeComponent opcodeTypeComponent = this.Network.Entity.GetComponent<OpcodeTypeComponent>();
ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
......
......@@ -78,10 +78,6 @@ namespace ETHotfix
{
try
{
if (response.RpcId != rpcId)
{
return;
}
if (response.Error > ErrorCode.ERR_Exception)
{
throw new RpcException(response.Error, response.Message);
......@@ -110,10 +106,6 @@ namespace ETHotfix
{
try
{
if (response.RpcId != rpcId)
{
return;
}
if (response.Error > ErrorCode.ERR_Exception)
{
throw new RpcException(response.Error, response.Message);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册