You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

125 lines
5.3 KiB

using System;
using System.IO;
namespace ET
{
[SessionStreamDispatcher(SessionStreamDispatcherType.SessionStreamDispatcherServerInner)]
public class SessionStreamDispatcherServerInner: ISessionStreamDispatcher
{
public void Dispatch(Session session, MemoryStream memoryStream)
{
ushort opcode = 0;
try
{
long actorId = BitConverter.ToInt64(memoryStream.GetBuffer(), Packet.ActorIdIndex);
opcode = BitConverter.ToUInt16(memoryStream.GetBuffer(), Packet.OpcodeIndex);
Type type = null;
object message = null;
#if SERVER
// 内网收到外网消息,有可能是gateUnit消息,还有可能是gate广播消息
if (OpcodeTypeComponent.Instance.IsOutrActorMessage(opcode))
{
InstanceIdStruct instanceIdStruct = new InstanceIdStruct(actorId);
instanceIdStruct.Process = Game.Options.Process;
long realActorId = instanceIdStruct.ToLong();
Entity entity = Game.EventSystem.Get(realActorId);
if (entity == null)
{
type = OpcodeTypeComponent.Instance.GetType(opcode);
message = MessageSerializeHelper.DeserializeFrom(opcode, type, memoryStream);
Log.Error($"not found actor: {session.DomainScene().Name} {opcode} {realActorId} {message}");
return;
}
if (entity is Session gateSession)
{
// 发送给客户端
memoryStream.Seek(Packet.OpcodeIndex, SeekOrigin.Begin);
gateSession.Send(0, memoryStream);
return;
}
if (entity is Player player)
{
if (player == null || player.IsDisposed)
{
return;
}
if (player.ClientSession == null || player.ClientSession.IsDisposed)
{
return;
}
memoryStream.Seek(Packet.OpcodeIndex, SeekOrigin.Begin);
player.ClientSession.Send(0, memoryStream);
return;
}
}
#endif
type = OpcodeTypeComponent.Instance.GetType(opcode);
message = MessageSerializeHelper.DeserializeFrom(opcode, type, memoryStream);
if (message is IResponse iResponse && !(message is IActorResponse))
{
session.OnRead(opcode, iResponse);
return;
}
OpcodeHelper.LogMsg(session.DomainZone(), opcode, message);
// 收到actor消息,放入actor队列
switch (message)
{
case IActorRequest iActorRequest:
{
InstanceIdStruct instanceIdStruct = new InstanceIdStruct(actorId);
int fromProcess = instanceIdStruct.Process;
instanceIdStruct.Process = Game.Options.Process;
long realActorId = instanceIdStruct.ToLong();
void Reply(IActorResponse response)
{
Session replySession = NetInnerComponent.Instance.Get(fromProcess);
// 发回真实的actorId 做查问题使用
replySession.Send(realActorId, response);
}
InnerMessageDispatcherHelper.HandleIActorRequest(opcode, realActorId, iActorRequest, Reply);
return;
}
case IActorResponse iActorResponse:
{
InstanceIdStruct instanceIdStruct = new InstanceIdStruct(actorId);
instanceIdStruct.Process = Game.Options.Process;
long realActorId = instanceIdStruct.ToLong();
InnerMessageDispatcherHelper.HandleIActorResponse(opcode, realActorId, iActorResponse);
return;
}
case IActorMessage iactorMessage:
{
InstanceIdStruct instanceIdStruct = new InstanceIdStruct(actorId);
instanceIdStruct.Process = Game.Options.Process;
long realActorId = instanceIdStruct.ToLong();
InnerMessageDispatcherHelper.HandleIActorMessage(opcode, realActorId, iactorMessage);
return;
}
default:
{
MessageDispatcherComponent.Instance.Handle(session, opcode, message);
break;
}
}
}
catch (Exception e)
{
Log.Error($"InnerMessageDispatcher error: {opcode}\n{e}");
}
}
}
}