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(ClientToGameReq.Types.BuyItemReq), typeof(BuyItemPacketHandler), typeof(GameLoginListener))] public class BuyItemPacketHandler : PacketRecvHandler { private static void send_S2C_ACK_BUY_ITEM(Player player, Result result) { ArgumentNullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); ArgumentNullReferenceCheckHelper.throwIfNull(result, () => $"result is null !!! - {player.toBasicString()}"); var ack_packet = new ClientToGame { Response = new ClientToGameRes { ErrorCode = result.ErrorCode, BuyItemRes = new ClientToGameRes.Types.BuyItemRes() } }; var item_buy_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(item_buy_action, () => $"item_buy_action is null !!! - {player.toBasicString()}"); if (result.isSuccess()) { // 구매 아이템 리스트 획득 var buy_items = item_buy_action.BuyItems; if (null != buy_items) { foreach (var item in buy_items.Select(info => info.toItemData4Client())) { ack_packet.Response.BuyItemRes.Item.Add(item); } } // char info 획득 var account_attribute = player.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}"); var level_attribute = player.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(level_attribute, () => $"level_attribute is null !!! - {player.toBasicString()}"); var money_attribute = player.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(money_attribute, () => $"money_attribute is null !!! - {player.toBasicString()}"); var nickname_attribute = player.getOriginEntityAttribute(); NullReferenceCheckHelper.throwIfNull(nickname_attribute, () => $"nickname_attribute is null !!! - {player.toBasicString()}"); var char_info = new CharInfo { Level = (int)level_attribute.Level, Exp = (int)level_attribute.Exp, Gold = money_attribute.Gold, Sapphire = money_attribute.Sapphire, Calium = money_attribute.Calium, Ruby = money_attribute.Ruby, Usergroup = account_attribute.AuthAdminLevelType.ToString(), Operator = (int)account_attribute.AuthAdminLevelType, DisplayName = nickname_attribute.Nickname, LanguageInfo = (int)account_attribute.LanguageType, IsIntroComplete = 1 }; ack_packet.Response.BuyItemRes.CurrencyInfo = char_info; } GameServerApp.getServerLogic().onSendPacket(player, ack_packet); } public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { var result = new Result(); string err_msg; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!"); var recv_msg = recvMessage as ClientToGame; NullReferenceCheckHelper.throwIfNull(recv_msg, () => $"recv_msg is null !!! - {player.toBasicString()}"); var request = recv_msg.Request.BuyItemReq; NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}"); var server_logic = GameServerApp.getServerLogic(); NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}"); var fn_item_buy = async delegate () { var result = new Result(); var item_buy_action = player.getEntityAction(); NullReferenceCheckHelper.throwIfNull(item_buy_action, () => $"item_buy_action is null !!! - {player.toBasicString()}"); result = await item_buy_action.tryBuyItem((uint)request.ItemId, request.Count); if (result.isFail()) { err_msg = $"Failed to tryBuyItem() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); send_S2C_ACK_BUY_ITEM(player, result); return result; } // 3. DB 갱신 var batch = new QueryBatchEx( player, LogActionType.ItemBuy , GameServerApp.getServerLogic().getDynamoDbClient() , true); { batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner()); } result = await QueryHelper.sendQueryAndBusinessLog(batch); send_S2C_ACK_BUY_ITEM(player, result); return result; }; result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ItemBuy", fn_item_buy); if (result.isFail()) { err_msg = $"Failed to runTransactionRunnerSafely()!!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } await QuestManager.It.QuestCheck(player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, request.ItemId)); return result; } }