fix: 修复道具扣除和宠物融合事务处理问题
Some checks failed
ci/woodpecker/push/my-first-workflow Pipeline failed

This commit is contained in:
xinian
2026-04-14 13:06:28 +08:00
parent ddbfe91d8b
commit c9b5f8569f
11 changed files with 562 additions and 56 deletions

View File

@@ -65,16 +65,33 @@ func (h Controller) PetFusion(data *C2S_PetFusion, c *player.Player) (result *pe
return result, errorcode.ErrorCodes.ErrSunDouInsufficient10016
}
consumeItems(c, materialCounts)
c.Info.Coins -= petFusionCost
if resultPetID == 0 {
if useOptionalItem(c, data.GoldItem1[:], petFusionFailureItemID) {
result.CostItemFlag = 1
} else if auxPet.Level > 5 {
auxPet.Downgrade(auxPet.Level - 5)
failedAux := *auxPet
if auxPet.Level > 5 {
failedAux.Downgrade(auxPet.Level - 5)
} else {
auxPet.Downgrade(1)
failedAux.Downgrade(1)
}
txResult, errCode := c.Service.PetFusionTx(
*c.Info,
data.Mcatchtime,
data.Auxcatchtime,
materialCounts,
data.GoldItem1[:],
petFusionKeepAuxItemID,
petFusionFailureItemID,
petFusionCost,
nil,
&failedAux,
)
if errCode != 0 {
return result, errCode
}
c.Info.Coins -= petFusionCost
if txResult.CostItemUsed {
result.CostItemFlag = 1
} else if txResult.UpdatedAux != nil {
*auxPet = *txResult.UpdatedAux
}
return &pet.PetFusionInfo{}, 0
}
@@ -101,18 +118,37 @@ func (h Controller) PetFusion(data *C2S_PetFusion, c *player.Player) (result *pe
newPet.RandomByWeightShiny()
}
c.Service.Pet.PetAdd(newPet, 0)
//println(c.Info.UserID, "进行融合", len(c.Info.PetList), masterPet.ID, auxPet.ID, newPet.ID)
c.PetDel(data.Mcatchtime)
if useOptionalItem(c, data.GoldItem1[:], petFusionKeepAuxItemID) {
result.CostItemFlag = 1
} else {
c.PetDel(data.Auxcatchtime)
txResult, errCode := c.Service.PetFusionTx(
*c.Info,
data.Mcatchtime,
data.Auxcatchtime,
materialCounts,
data.GoldItem1[:],
petFusionKeepAuxItemID,
petFusionFailureItemID,
petFusionCost,
newPet,
nil,
)
if errCode != 0 {
return result, errCode
}
result.ObtainTime = newPet.CatchTime
result.StarterCpTm = newPet.ID
c.Info.Coins -= petFusionCost
if txResult.CostItemUsed {
result.CostItemFlag = 1
} else {
removePetFromPlayerInfo(c, data.Auxcatchtime)
}
removePetFromPlayerInfo(c, data.Mcatchtime)
if txResult.NewPet == nil {
return result, errorcode.ErrorCodes.ErrSystemError
}
c.Info.PetList = append(c.Info.PetList, *txResult.NewPet)
result.ObtainTime = txResult.NewPet.CatchTime
result.StarterCpTm = txResult.NewPet.ID
return result, 0
}
@@ -149,21 +185,10 @@ func hasEnoughItems(c *player.Player, itemCounts map[uint32]int) bool {
return true
}
func consumeItems(c *player.Player, itemCounts map[uint32]int) {
for itemID, count := range itemCounts {
_ = c.Service.Item.UPDATE(itemID, -count)
func removePetFromPlayerInfo(c *player.Player, catchTime uint32) {
index, _, ok := c.FindPet(catchTime)
if !ok {
return
}
}
func useOptionalItem(c *player.Player, itemIDs []uint32, target uint32) bool {
if c.Service.Item.CheakItem(target) <= 0 {
return false
}
for _, itemID := range itemIDs {
if itemID == target {
_ = c.Service.Item.UPDATE(target, -1)
return true
}
}
return false
c.Info.PetList = append(c.Info.PetList[:index], c.Info.PetList[index+1:]...)
}