Files
caliverse_server/GameServer/Contents/Room/PacketHandler/ChangeScreenPagePacketHandler.cs
2025-05-01 07:20:41 +09:00

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);
}
}