using System; using System.Threading.Tasks; using ETModel; namespace ETHotfix { /// /// gate session收到的消息直接转发给客户端 /// public class GateSessionEntityActorHandler : IEntityActorHandler { 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(); Type type = opcodeTypeComponent.GetType(actorRequest.Op); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage); // 发送给客户端 Session clientSession = entity as Session; clientSession.Send(actorResponse.Flag, message); session.Reply(actorResponse); await Task.CompletedTask; } catch (Exception e) { actorResponse.Error = ErrorCode.ERR_SessionActorError; actorResponse.Message = $"session actor error {e}"; session.Reply(actorResponse); throw; } } } public class CommonEntityActorHandler : IEntityActorHandler { public async Task Handle(Session session, Entity entity, ActorRequest actorRequest) { OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent(); Type type = opcodeTypeComponent.GetType(actorRequest.Op); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage); await Game.Scene.GetComponent().Handle(session, entity, actorRequest, message); } } /// /// 玩家收到帧同步消息交给帧同步组件处理 /// public class MapUnitEntityActorHandler : IEntityActorHandler { public async Task Handle(Session session, Entity entity, ActorRequest actorRequest) { OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent(); Type type = opcodeTypeComponent.GetType(actorRequest.Op); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage); if (message is OneFrameMessage aFrameMessage) { Game.Scene.GetComponent().Add(aFrameMessage); ActorResponse actorResponse = new ActorResponse { RpcId = actorRequest.RpcId }; session.Reply(actorResponse); return; } await Game.Scene.GetComponent().Handle(session, entity, actorRequest, message); } } }