using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using static ClientToGameReq.Types; using static ClientToGameRes.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(UseRandomBoxItemReq), typeof(UseRandomBoxItemPacketHandler), typeof(GameLoginListener))] internal class UseRandomBoxItemPacketHandler : PacketRecvHandler { public override async Task onProcessPacket(ISession session, IMessage recvMessage) { var player = session as Player; ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var req_msg = recvMessage as ClientToGame; ArgumentNullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}"); var request = req_msg.Request.UseRandomBoxItemReq; ArgumentNullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}"); var result = new Result(); var item_guid = request.ItemGuid; #pragma warning disable CS0219 // 변수가 할당되었지만 해당 값이 사용되지 않았습니다. ushort num = 1; #pragma warning restore CS0219 // 변수가 할당되었지만 해당 값이 사용되지 않았습니다. var server_logic = GameServerApp.getServerLogic(); ArgumentNullException.ThrowIfNull(server_logic); var random_box_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(random_box_action, () => $"random_box_action is null !!! - {player.toBasicString()}"); RandomBoxItemReference random_box_item_ref = new(); random_box_item_ref.m_item_guid = item_guid; result = random_box_action.conditionCheck(ref random_box_item_ref); if (result.isFail()) { send_S2C_ACK_RANDOM_BOX_ITEM_FAIL(player, result); return result; } result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "RandomBoxItemUse", delegateRandomBoxItemUse); if (result.isFail()) { var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_RANDOM_BOX_ITEM_FAIL(player, result); return result; } send_S2C_ACK_RANDOM_BOX_ITEM(player, result, random_box_item_ref); return result; async Task delegateRandomBoxItemUse() => await randomBoxItemUse(player, random_box_item_ref); } private async Task randomBoxItemUse(Player player, RandomBoxItemReference randomBoxItemRef) { var result = new Result(); var random_box_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(random_box_action, () => $"random_box_action is null !!! - {player.toBasicString()}"); result = await random_box_action.deleteRandomBox(randomBoxItemRef); if (result.isFail()) return result; var gacha_data = randomBoxItemRef.m_gacha_data; ArgumentNullReferenceCheckHelper.throwIfNull(gacha_data, () => $"gacha_data is null !!! - {player.toBasicString()}"); var gacha = gacha_data.getRandomReward(); randomBoxItemRef.m_rewards.Add(gacha.Reward); result = await random_box_action.getGachaReward(randomBoxItemRef); if (result.isFail()) return result; var server_logic = GameServerApp.getServerLogic(); var batch = new QueryBatchEx(player, LogActionType.ItemRandomBoxUse, server_logic.getDynamoDbClient()); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } var deleted_item = randomBoxItemRef.m_deleted_item_nullable; ArgumentNullReferenceCheckHelper.throwIfNull(deleted_item, () => $"deleted_item is null !!! - {player.toBasicString()}"); var item_meta = deleted_item.getItemMeta(); ArgumentNullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!! - {player.toBasicString()}"); var info = new RandomBoxItemUseInfo(randomBoxItemRef.m_item_guid, item_meta.ItemId, 1, gacha); var invoker = new RandomBoxItemUseBusinessLog(info); batch.appendBusinessLog(invoker); result = await QueryHelper.sendQueryAndBusinessLog(batch); var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents); NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}"); var common_result = found_transaction_runner.getCommonResult(); randomBoxItemRef.m_common_result = common_result; return result; } public static bool send_S2C_ACK_RANDOM_BOX_ITEM_FAIL(Player owner, Result result) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.UseRandomBoxItemRes = new(); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } public static bool send_S2C_ACK_RANDOM_BOX_ITEM(Player owner, Result result, RandomBoxItemReference random_box_item_ref) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.UseRandomBoxItemRes = new(); ack_packet.Response.UseRandomBoxItemRes.CommonResult = random_box_item_ref.m_common_result; //var rewarded_items = random_box_item_ref.m_rewarded_items; //var rewarded_money = random_box_item_ref.m_rewarded_money; //var items = RewardManager.Instance.convertItemAndMoneyToItem(rewarded_items, rewarded_money); //ack_packet.Response.UseRandomBoxItemRes.Items.AddRange(items); //var deleted_refactoring_items = new List(); //if (null != random_box_item_ref.m_deleted_item_nullable) //{ // deleted_refactoring_items.Add(random_box_item_ref.m_deleted_item_nullable); //} //var deleted_items = RewardManager.Instance.convertItemAndMoneyToItem(deleted_refactoring_items, new()); //ack_packet.Response.UseRandomBoxItemRes.Items.AddRange(deleted_items); if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet)) return false; return true; } }