Files
bl/logic/controller/item_buy.go
xinian 6510e4e09b
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
refactor: 重构入参类型引用
2026-04-05 07:24:36 +08:00

113 lines
2.9 KiB
Go

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
}