128 lines
4.9 KiB
C#
128 lines
4.9 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_UGC_NPC_RANK), typeof(GetUgcNpcRankPacketHandler), typeof(GameLoginListener))]
|
|
public class GetUgcNpcRankPacketHandler : PacketRecvHandler
|
|
{
|
|
public static bool send_GS2C_ACK_UGC_NPC_RANK(Player owner, Result result, UgcNpcRankType rankType, UgcNpcRankState rankState, List<UgcNpcRank>? ranking)
|
|
{
|
|
var ack_packet = new ClientToGame();
|
|
ack_packet.Response = new ClientToGameRes();
|
|
|
|
ack_packet.Response.ErrorCode = result.ErrorCode;
|
|
ack_packet.Response.AckUgcNpcRank = new();
|
|
|
|
|
|
if (result.isSuccess())
|
|
{
|
|
ack_packet.Response.AckUgcNpcRank.Type = rankType;
|
|
ack_packet.Response.AckUgcNpcRank.State = rankState;
|
|
|
|
ranking ??= new List<UgcNpcRank>();
|
|
ack_packet.Response.AckUgcNpcRank.UgcNpcRank.AddRange(ranking);
|
|
}
|
|
|
|
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
public override async Task<Result> onProcessPacket(ISession entityWithSession, IMessage recvMessage)
|
|
{
|
|
var result = new Result();
|
|
string err_msg;
|
|
|
|
var player = entityWithSession as Player;
|
|
NullReferenceCheckHelper.throwIfNull(player, () => "player is null !!!");
|
|
|
|
var server_logic = GameServerApp.getServerLogic();
|
|
|
|
// 1. 기본 정보 체크
|
|
var request = (recvMessage as ClientToGame)?.Request.ReqUgcNpcRank;
|
|
if (null == request)
|
|
{
|
|
err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.ReqUgcNpcRank)}";
|
|
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
send_GS2C_ACK_UGC_NPC_RANK(player,result, UgcNpcRankType.None, UgcNpcRankState.None, null);
|
|
return result;
|
|
}
|
|
|
|
var ranking_entity = server_logic.findGlobalEntity<UgcNpcRankEntity>();
|
|
if (null == ranking_entity)
|
|
{
|
|
err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.ReqUgcNpcRank)}";
|
|
result.setFail(ServerErrorCode.UgcNpcRankEntityIsNotFound, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
send_GS2C_ACK_UGC_NPC_RANK(player,result, request.Type, request.State, null);
|
|
return result;
|
|
}
|
|
|
|
// 2. request validation 체크
|
|
if (false == checkRequestValidation(request))
|
|
{
|
|
err_msg = $"Failed to get Request !!! : {nameof(ClientToGame.Request.ReqUgcNpcRank)}";
|
|
result.setFail(ServerErrorCode.InvalidArgument, err_msg);
|
|
Log.getLogger().error(result.toBasicString());
|
|
|
|
send_GS2C_ACK_UGC_NPC_RANK(player,result, request.Type, request.State, null);
|
|
return result;
|
|
}
|
|
|
|
// 3. ranking data 조회
|
|
(Result result, List<UgcNpcRank>? ranks) res_rank = new();
|
|
res_rank.result = result;
|
|
|
|
switch (request.Type)
|
|
{
|
|
case UgcNpcRankType.Like:
|
|
var like_action = ranking_entity.getEntityAction<UgcNpcLikeRankAction>();
|
|
NullReferenceCheckHelper.throwIfNull(like_action, () => $"UgcNpcLikeRankAction is null !!! - player:{player.toBasicString()}");
|
|
|
|
res_rank = await like_action.getRanks(request.State);
|
|
break;
|
|
case UgcNpcRankType.Communication:
|
|
var communication_action = ranking_entity.getEntityAction<UgcNpcCommunicationRankAction>();
|
|
NullReferenceCheckHelper.throwIfNull(communication_action, () => $"UgcNpcCommunicationRankAction is null !!! - player:{player.toBasicString()}");
|
|
|
|
res_rank = await communication_action.getRanks(request.State);
|
|
break;
|
|
case UgcNpcRankType.Quest:
|
|
var quest_action = ranking_entity.getEntityAction<UgcNpcQuestRankAction>();
|
|
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"UgcNpcQuestRankAction is null !!! - player:{player.toBasicString()}");
|
|
|
|
res_rank = await quest_action.getRanks(request.State);
|
|
break;
|
|
}
|
|
|
|
send_GS2C_ACK_UGC_NPC_RANK(player, res_rank.result, request.Type, request.State, res_rank.ranks);
|
|
|
|
return result;
|
|
}
|
|
|
|
private bool checkRequestValidation(ClientToGameReq.Types.C2GS_REQ_UGC_NPC_RANK request)
|
|
{
|
|
// 1. state 체크
|
|
if (request.State == UgcNpcRankState.None) return false;
|
|
|
|
// 2. type 체크
|
|
if (request.Type == UgcNpcRankType.None) return false;
|
|
|
|
return true;
|
|
}
|
|
} |