using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ClaimRewardReq), typeof(ClaimRewardPacketHandler), typeof(GameLoginListener))] public class ClaimRewardPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession session, IMessage recvMessage) { var owner = session as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var recv_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!!"); var request = recv_msg.Request.ClaimRewardReq; var claim_type = request.ClaimType; var claim_id = request.ClaimId; ClaimRewardReference claim_reward_ref = new(); claim_reward_ref.m_claim_id = claim_id; System.Enum.TryParse(claim_type.ToString(), out MetaAssets.ClaimType parsedType); claim_reward_ref.m_claim_type = parsedType; claim_reward_ref.m_user_guid = owner.getUserGuid(); var result = await claimReward(owner, claim_reward_ref); if (result.isFail()) { send_GS2C_ACK_CLAIM_REWARD_FAIL(owner, result); return result; } send_GS2C_ACK_CLAIM_REWARD(owner, result, claim_reward_ref); NullReferenceCheckHelper.throwIfNull(claim_reward_ref.m_meta_data, () => $"claim_reward_ref.m_meta_data is null !!!"); var rewards = claim_reward_ref.m_meta_data.DetailInfo.Values.ToList(); foreach (var reward in rewards) { await QuestManager.It.QuestCheck(owner, new QuestReward(EQuestEventTargetType.REWARD, EQuestEventNameType.RECEIVED, reward.RewardGroupId)); } return result; } private async Task claimReward(Player owner, ClaimRewardReference claimRewardRef) { var claim_reward_action = owner.getEntityAction(); var result = claim_reward_action.claimRewardConditionCheck(ref claimRewardRef); if (result.isFail()) return result; result = await owner.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "RewardClaim", delegateRewardClaim); if (result.isFail()) { string err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {owner.toBasicString()}"; Log.getLogger().error(err_msg); return result; } return result; async Task delegateRewardClaim() => await rewardClaim(owner, claimRewardRef); } private async Task rewardClaim(Player owner, ClaimRewardReference claimRewardRef) { var claim_reward_action = owner.getEntityAction(); var result = await claim_reward_action.rewardClaim(claimRewardRef); var server_logic = GameServerApp.getServerLogic(); var batch = new QueryBatchEx(owner, LogActionType.ClaimReward, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } var log_invoker = new ClaimRewardBusinessLog(claimRewardRef.m_claim_id, (int)claimRewardRef.m_claim_type, claimRewardRef.m_reward_group_id); batch.appendBusinessLog(log_invoker); result = await QueryHelper.sendQueryAndBusinessLog(batch); if (result.isFail()) return result; var found_transaction_runner = owner.findTransactionRunner(TransactionIdType.PrivateContents); NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {owner.toBasicString()}"); var common_result = found_transaction_runner.getCommonResult(); claimRewardRef.m_common_result = common_result; return result; } private static bool send_GS2C_ACK_CLAIM_REWARD_FAIL(Player owner, Result result) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.ClaimRewardRes = new(); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } private static bool send_GS2C_ACK_CLAIM_REWARD(Player owner, Result result, ClaimRewardReference claimRewardRef) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.ClaimRewardRes = new(); ack_packet.Response.ClaimRewardRes.ClaimId = claimRewardRef.m_claim_id; ack_packet.Response.ClaimRewardRes.CommonResult = claimRewardRef.m_common_result; //var rewarded_items = claimRewardRef.m_rewarded_items; //var rewarded_money = claimRewardRef.m_rewared_money; //var items = RewardManager.Instance.convertItemAndMoneyToItem(rewarded_items, rewarded_money); //ack_packet.Response.ClaimRewardRes.RewardItems.AddRange(items); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } }