using System; using Fantasy; using Fantasy.Async; using Fantasy.Network; using Fantasy.Network.Interface; using Fantasy.Platform.Net; using NB.Game; namespace NB.Gate; public class C2G_ExitRoomRequestHandler : MessageRPC { protected override async FTask Run(Session session, C2G_ExitRoomRequest request, G2C_ExitRoomResponse response, Action reply) { if (string.IsNullOrEmpty(request.RoomCode)) { response.ErrorCode = ErrorCode.MapRoomIdError; return; } var gateUnitSessionComponent = session.GetComponent(); if (gateUnitSessionComponent == null) { response.ErrorCode = ErrorCode.ErrServer; return; } // 在缓存中检查该账号是否存在 var gateUnitManageComponent = session.Scene.GetComponent(); if (gateUnitManageComponent == null) { response.ErrorCode = ErrorCode.ErrServer; return; } var gateUnit = gateUnitManageComponent.Get(gateUnitSessionComponent.AccountID); if (gateUnit == null) { response.ErrorCode = ErrorCode.ErrServer; return; } if (gateUnit.RoomCode != request.RoomCode) { response.ErrorCode = ErrorCode.MapRoomIdError; return; } RoomHelper.ParseCode(request.RoomCode, out var serviceId, out var roomId); if (serviceId < 1 || roomId < 1) { response.ErrorCode = ErrorCode.MapRoomIdError; return; } var sceneConfig = SceneConfigData.Instance.Get(serviceId); if (sceneConfig == null) { response.ErrorCode = ErrorCode.MapRoomIdError; return; } //执行退出房间操作 var roomResponse = (Map2G_ExiRoomResponse)await session.Scene.NetworkMessagingComponent.Call( sceneConfig.Address, new G2Map_ExitRoomRequest() { AccountId = gateUnit.Id, RoomCode = request.RoomCode, }); if (roomResponse.ErrorCode != 0) { response.ErrorCode = ErrorCode.MapRoomIdError; return; } gateUnit.RoomCode = string.Empty; response.RoomCode = request.RoomCode; response.ErrorCode = ErrorCode.Successful; } }