package controller import ( "blazing/common/socket/errorcode" "blazing/modules/config/service" "blazing/logic/service/item" "blazing/logic/service/player" ) // 防止封包通过领取来获取道具 // BuyItem 购买单个道具 func (h Controller) BuyItem(data *BuyInboundInfo, player *player.Player) (result *item.BuyOutboundInfo, err errorcode.ErrorCode) { result = &item.BuyOutboundInfo{Coins: player.Info.Coins} bought, err := buySeerdouBackpackItem(player, data.ItemId, data.Count) if err != 0 { return result, err } if !bought { result.Coins = player.Info.Coins return result, 0 } result.ItemId = data.ItemId result.Level = 1 result.Count = data.Count result.Coins = player.Info.Coins return result, 0 } // BuyMultipleItems 批量购买道具 func (h Controller) BuyMultipleItems(data *BuyMultiInboundInfo, player *player.Player) (result *item.BuyMultiOutboundInfo, err errorcode.ErrorCode) { for _, itemID := range data.ItemIds { bought, buyErr := buySeerdouBackpackItem(player, int64(itemID), 1) if buyErr == errorcode.ErrorCodes.ErrSunDouInsufficient10016 { break } if buyErr != 0 || !bought { continue } } return &item.BuyMultiOutboundInfo{ Coins: player.Info.Coins, }, 0 } // BuyGoldItem 使用金豆购买商品 func (h Controller) BuyGoldItem(data *C2S_GOLD_BUY_PRODUCT, player *player.Player) (result *item.S2C_GoldBuyProductInfo, err errorcode.ErrorCode) { pro := service.NewShopService().Get(data.ProductID) if pro == nil { return nil, errorcode.ErrorCodes.ErrTooManyProducts } config := service.NewTalkConfigService().GetCache(int(data.ProductID)) if config != nil { _, ok := player.Service.Talk.Cheak(0, int(data.ProductID)) if !ok { return nil, errorcode.ErrorCodes.ErrExceedStock } } var usegold uint64 switch data.Type { case 0: if pro.SeerdouPrice == 0 { return nil, errorcode.ErrorCodes.ErrSystemError } if !player.GetCoins(data.Count * int64(pro.SeerdouPrice)) { return nil, errorcode.ErrorCodes.ErrSystemError } usegold = uint64(data.Count) * uint64(pro.SeerdouPrice) case 1: if pro.JindouPrice == 0 { return nil, errorcode.ErrorCodes.ErrSystemError } if !player.UseGold(int64(data.Count) * int64(pro.JindouPrice) * 100) { return nil, errorcode.ErrorCodes.ErrSystemError } usegold = uint64(data.Count) * uint64(pro.JindouPrice*100) } switch data.Type { case 0: if player.ItemAdd(pro.ProductID, data.Count) { player.Info.Coins -= int64(usegold) } case 1: if config != nil { r := player.Service.Talk.Update(int(pro.ProductID), int(data.Count)) if !r { return nil, errorcode.ErrorCodes.ErrGoldBeanSingleLimit } } if player.ItemAdd(pro.ProductID, data.Count) { player.User.UpdateGold(player.Info.UserID, -int64(usegold)) } } player.SendPackCmd(1105, item.GoldOnlineRemainOutboundInfo{ Coin: player.Info.Coins, GoldNumber: uint32(player.User.GetGold(uint(player.Info.UserID))), }) return nil, -1 }