1
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful

This commit is contained in:
昔念
2026-04-18 15:22:30 +08:00
parent 4abd179a23
commit 7844c5b76b
2 changed files with 50 additions and 12 deletions

View File

@@ -26,8 +26,11 @@ type CdkRewardResult struct {
EVPool int64 `json:"ev_pool,omitempty"`
}
type CdkSpecialRewardAdder func(itemID uint32, count int64) bool
// GrantConfigReward 按 cdk 配置 ID 发放奖励,不处理兑换码次数和领取资格校验。
func (s *CdkService) GrantConfigReward(cdkID uint32) (*CdkRewardResult, error) {
// 当传入 specialAdder 时,赛尔豆/累计经验/金豆/学习力会优先走在线玩家加成逻辑。
func (s *CdkService) GrantConfigReward(cdkID uint32, specialAdders ...CdkSpecialRewardAdder) (*CdkRewardResult, error) {
cfg := configservice.NewCdkService().GetByID(cdkID)
if cfg == nil {
return nil, fmt.Errorf("绑定的CDK不存在")
@@ -45,42 +48,72 @@ func (s *CdkService) GrantConfigReward(cdkID uint32) (*CdkRewardResult, error) {
if playerInfo == nil {
return nil, fmt.Errorf("玩家角色不存在")
}
var specialAdder CdkSpecialRewardAdder
if len(specialAdders) > 0 {
specialAdder = specialAdders[0]
}
var (
infoDirty bool
bagItems []data.ItemInfo
)
appendRewardItem := func(itemID uint32, count int64) {
appendRewardItem := func(itemID uint32, count int64) error {
if itemID == 0 || count <= 0 {
return
return nil
}
switch itemID {
case 1:
result.Coins += count
playerInfo.Coins += count
infoDirty = true
if specialAdder != nil {
if !specialAdder(itemID, count) {
return fmt.Errorf("在线发放赛尔豆失败")
}
} else {
playerInfo.Coins += count
infoDirty = true
}
case 3:
result.ExpPool += count
playerInfo.ExpPool += count
infoDirty = true
if specialAdder != nil {
if !specialAdder(itemID, count) {
return fmt.Errorf("在线发放经验池失败")
}
} else {
playerInfo.ExpPool += count
infoDirty = true
}
case 5:
result.Gold += count
if specialAdder != nil {
if !specialAdder(itemID, count) {
return fmt.Errorf("在线发放金豆失败")
}
}
case 9:
result.EVPool += count
playerInfo.EVPool += count
infoDirty = true
if specialAdder != nil {
if !specialAdder(itemID, count) {
return fmt.Errorf("在线发放学习力失败")
}
} else {
playerInfo.EVPool += count
infoDirty = true
}
default:
bagItems = append(bagItems, data.ItemInfo{ItemId: int64(itemID), ItemCnt: count})
}
return nil
}
for _, rewardID := range cfg.ItemRewardIds {
itemInfo := configservice.NewItemService().GetItemCount(rewardID)
appendRewardItem(uint32(itemInfo.ItemId), itemInfo.ItemCnt)
if err := appendRewardItem(uint32(itemInfo.ItemId), itemInfo.ItemCnt); err != nil {
return nil, err
}
}
if result.Gold != 0 {
if result.Gold != 0 && specialAdder == nil {
baseservice.NewBaseSysUserService().UpdateGold(s.userid, result.Gold*100)
}
if result.FreeGold != 0 {