refactor: 重构奖励发放逻辑并支持签到默认奖励
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed

This commit is contained in:
xinian
2026-04-06 03:42:48 +08:00
committed by cnb
parent 40ec827342
commit 99748ba41e
7 changed files with 250 additions and 137 deletions

View File

@@ -27,6 +27,11 @@ type SetHandler struct {
Handler PetItemHandler
}
var fallbackPetItemNewSeIdx = map[uint32]int{
300741: 1103, // 瞬杀能量珠
300854: 1103, // 瞬杀能量珠Ω
}
// PetItemHandlerRegistry 道具处理器注册器
type PetItemHandlerRegistry struct {
exactHandlers map[uint32]PetItemHandler // 精确ID映射
@@ -112,12 +117,29 @@ func nvfunc(itemid uint32, onpet *model.PetInfo) bool {
return true
}
func handleNewSeIdxPetItem(itemid uint32, onpet *model.PetInfo) errorcode.ErrorCode {
itemCfg, ok := xmlres.ItemsMAP[int(itemid)]
if !ok {
return errorcode.ErrorCodes.ErrItemUnusable
func resolvePetItemNewSeIdx(itemid uint32) (itemCfg xmlres.Item, newSeIdx int, ok bool) {
itemCfg, ok = xmlres.ItemsMAP[int(itemid)]
if ok && itemCfg.NewSeIdx != 0 {
return itemCfg, itemCfg.NewSeIdx, true
}
if itemCfg.NewSeIdx == 0 {
if newSeIdx, ok = fallbackPetItemNewSeIdx[itemid]; ok {
return itemCfg, newSeIdx, true
}
for idx, effectCfg := range xmlres.EffectMAP {
if effectCfg.ItemId == nil || gconv.Uint32(*effectCfg.ItemId) != itemid {
continue
}
return itemCfg, idx, true
}
return itemCfg, 0, false
}
func handleNewSeIdxPetItem(itemid uint32, onpet *model.PetInfo) errorcode.ErrorCode {
itemCfg, newSeIdx, ok := resolvePetItemNewSeIdx(itemid)
if ok && newSeIdx == 0 {
if itemCfg.MaxHPUp > 0 {
if !onpet.AddMaxHPUpEffect(itemid, itemCfg.MaxHPUp) {
return errorcode.ErrorCodes.ErrCannotInjectPillAgain
@@ -126,14 +148,17 @@ func handleNewSeIdxPetItem(itemid uint32, onpet *model.PetInfo) errorcode.ErrorC
}
return errorcode.ErrorCodes.ErrItemUnusable
}
if !ok {
return errorcode.ErrorCodes.ErrItemUnusable
}
effectCfg, ok := xmlres.EffectMAP[itemCfg.NewSeIdx]
effectCfg, ok := xmlres.EffectMAP[newSeIdx]
if !ok {
return errorcode.ErrorCodes.ErrSystemError
}
effectStatus := byte(gconv.Int(effectCfg.Stat))
effectIdx := uint16(itemCfg.NewSeIdx)
effectIdx := uint16(newSeIdx)
leftCount := 1
if effectCfg.Times != nil && *effectCfg.Times != "" {
leftCount = gconv.Int(*effectCfg.Times)