111 lines
4.0 KiB
C#
111 lines
4.0 KiB
C#
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<Result> 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<LocationAttribute>();
|
|
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);
|
|
}
|
|
} |