using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using static ClientToGameReq.Types; using static ClientToGameRes.Types; namespace GameServer.PacketHandler; [PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.BuyCartReq), typeof(BuyCartPacketHandler), typeof(GameLoginListener))] public class BuyCartPacketHandler : PacketRecvHandler { public static bool send_S2C_ACK_BUY_CART(Player player, Result result, List? items = null) { var ack_packet = new ClientToGame(); ack_packet.Response = new ClientToGameRes(); ack_packet.Response.ErrorCode = result.ErrorCode; ack_packet.Response.BuyCartRes = new BuyCartRes(); if (result.isSuccess() && items != null) { var account_attribute = player.getEntityAttribute(); var level_attribute = player.getEntityAttribute(); var money_attribute = player.getEntityAttribute(); var nickname_attribute = player.getEntityAttribute(); 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.BuyCartRes.CurrencyInfo = char_info; ack_packet.Response.BuyCartRes.Items.AddRange(items.Select(info => info.toItemData4Client())); } if (false == GameServerApp.getServerLogic().onSendPacket(player, ack_packet)) { return false; } return true; } public override async Task onProcessPacket(ISession entityWithSession, IMessage recvMessage) { var result = new Result(); var err_msg = string.Empty; var entity_player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(entity_player, () => $"entity_player is null !!!"); var cart_action = entity_player.getEntityAction(); if (cart_action == null) { err_msg = $"Failed to get cart action : {nameof(CartAction)}"; result.setFail(ServerErrorCode.EntityActionNotFound, err_msg); Log.getLogger().error(err_msg); send_S2C_ACK_BUY_CART(entity_player, result); return result; } var game_msg = recvMessage as ClientToGame; if (game_msg == null) { err_msg = $"Failed to cast ClientToGame !!! : {nameof(ClientToGame.Request.BuyCartReq)}"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); send_S2C_ACK_BUY_CART(entity_player, result); return result; } var request = game_msg.Request.BuyCartReq; result = await cart_action.BuyCartProcess(request.ItemInfos.ToList()); if (result.isFail()) { err_msg = $"Failed to BuyCartProcess() !!! : {result.toBasicString()} - {entity_player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } foreach (var cart_item_info in request.ItemInfos.ToList()) { await QuestManager.It.QuestCheck(entity_player, new QuestItem(EQuestEventTargetType.ITEM, EQuestEventNameType.BOUGHT, cart_item_info.ItemId)); } return result; } public override async Task onProcessPacketException(ISession entityWithSession, IMessage recvMessage , Result errorResult) { await Task.CompletedTask; var player = entityWithSession as Player; NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!! - {entityWithSession.toBasicString()}"); send_S2C_ACK_BUY_CART(player, errorResult); } }