using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_CHANGE_SCREEN_PAGE), typeof(ChangeScreenPagePacketHandler), typeof(GameLoginListener))] public class ChangeScreenPagePacketHandler : PacketRecvHandler { public static void send_S2C_ACK_CHANGE_SCREEN_PAGE(Player? owner, Result result, int screenPageNo) { var ack_packet = new ClientToGame { Response = new ClientToGameRes { ErrorCode = result.ErrorCode, AckChangeScreenPage = new ClientToGameRes.Types.GS2C_ACK_CHANGE_SCREEN_PAGE { ScreenPageNo = screenPageNo } } }; GameServerApp.getServerLogic().onSendPacket(owner!, ack_packet); } public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { await Task.CompletedTask; var result = new Result(); string err_msg; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); // 1. 기본 정보 체크 var request = (recvMessage as ClientToGame)?.Request.ReqChangeScreenPage; if (null == request) { err_msg = $"Failed to get request type !!! : {nameof(ClientToGame.Request.ReqChangeScreenPage)}"; result.setFail(ServerErrorCode.InvalidArgument, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_CHANGE_SCREEN_PAGE(player, result, -1); return result; } // 2. room id 확인 (result, var room_id) = checkCondition(player, request); if (result.ErrorCode != ServerErrorCode.Success) { send_S2C_ACK_CHANGE_SCREEN_PAGE(player, result, -1); return result; } // 3. room screen page 수정 var screen_page = InstanceRoomManager.Instance.changeScreenPage(room_id, request.IsCustom == BoolType.True, request.IsIncrease == BoolType.True, request.CustomPage); if (screen_page < 0) { err_msg = $"failed to change screen page!! : roomId[{room_id}]"; result.setFail(ServerErrorCode.NotExistInstanceRoom, err_msg); Log.getLogger().error(err_msg); } send_S2C_ACK_CHANGE_SCREEN_PAGE(player, result, screen_page); return await Task.FromResult(result); } private (Result result, string room_id) checkCondition(Player player, ClientToGameReq.Types.C2GS_REQ_CHANGE_SCREEN_PAGE request) { var result = new Result(); string err_msg; var location = player.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(location, () => $"location is null !!!"); // 1. room id 체크 var room_id = location.CurrentIndunLocation.InstanceRoomId; if (string.IsNullOrEmpty(room_id)) { err_msg = "Failed to change screen page!! : user is not in room"; result.setFail(ServerErrorCode.InvalidArgument, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_CHANGE_SCREEN_PAGE(player, result, -1); return (result, string.Empty); } // 2. 매개변수 체크 if (request.IsCustom == BoolType.True && request.CustomPage < 0) { err_msg = $"Failed to change screen page!! : invalid custom page number - {request.CustomPage}"; result.setFail(ServerErrorCode.InvalidArgument, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_CHANGE_SCREEN_PAGE(player, result, -1); return (result, string.Empty); } return (result, room_id); } }