diff --git a/logic/service/fight/effect/EffectDefeatTrigger.go b/logic/service/fight/effect/EffectDefeatTrigger.go index 2e362dff4..830456fe8 100644 --- a/logic/service/fight/effect/EffectDefeatTrigger.go +++ b/logic/service/fight/effect/EffectDefeatTrigger.go @@ -47,22 +47,16 @@ func registerDefeatTriggerEffects() { // 共性逻辑:OnSkill标记生效,Switch检查条件并触发行为 // ----------------------------------------------------------- // OnSkill:命中时标记当次攻击可触发效果 -func (e *EffectDefeatTrigger) OnSkill() bool { - e.can = true // 标记当次攻击有效 - return true -} func (e *EffectDefeatTrigger) SwitchOut(in *input.Input) bool { // 1. 检查效果是否生效(当次攻击有效) - if !e.can { - return true - } + // 2. 过滤我方切精灵的情况(只处理对方切精灵) if in == e.Ctx().Our { return true } - if e.Ctx().Our.CurrentPet.Info.Hp > 0 { + if e.Ctx().Opp.CurrentPet.Info.Hp > 0 { return true } e.isd = true @@ -73,9 +67,7 @@ func (e *EffectDefeatTrigger) SwitchOut(in *input.Input) bool { // Switch:检查是否击败对方,满足条件则根据effectID触发对应行为 func (e *EffectDefeatTrigger) SwitchIn(in *input.Input) bool { // 1. 检查效果是否生效(当次攻击有效) - if !e.can { - return true - } + if !e.isd { //不是击败触发 return true } diff --git a/modules/player/service/pet.go b/modules/player/service/pet.go index a3f9b3ed3..affe27cdc 100644 --- a/modules/player/service/pet.go +++ b/modules/player/service/pet.go @@ -2,11 +2,13 @@ package service import ( "blazing/cool" + basemodel "blazing/modules/base/model" "blazing/modules/base/service" "blazing/modules/player/model" "context" "fmt" + "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gtime" ) @@ -73,7 +75,6 @@ func (s *PetService) UPdatePrice(ctime uint32, Price uint32, is_sale uint32) err return nil } func (s *PetService) BuyPet(pid uint32) error { - tt := NewPetService(0).PetInfo_One_ID(pid) if tt == nil { @@ -94,18 +95,59 @@ func (s *PetService) BuyPet(pid uint32) error { if !tt.UpdateTime.AddDate(0, 0, 1).Before(gtime.Now()) { return fmt.Errorf("数据异常") } - useglod := int64(tt.SalePrice)*102 + int64(tt.SaleCount)*5 - if service.NewBaseSysUserService().GetFreeGold(uint(s.userid)) < useglod { - return fmt.Errorf("余额不足") - } + return g.DB().Transaction(context.TODO(), func(ctx context.Context, tx gdb.TX) error { - service.NewBaseSysUserService().UpdateFreeGold(s.userid, -useglod) - NewPetService(tt.PlayerID).Pet_del(tt.CatchTime) - service.NewBaseSysUserService().UpdateFreeGold(tt.PlayerID, int64(tt.SalePrice)*98) - s.PetAdd(&tt.Data, tt.SaleCount+1) + useglod := int64(tt.SalePrice)*102 + int64(tt.SaleCount)*5 + var res1 basemodel.BaseSysUser - return nil + tx.Model(basemodel.BaseSysUser{}).Where("id", tt.PlayerID).Fields("free_gold").Scan(&res1) + if res1.FreeGold < useglod { + return fmt.Errorf("余额不足") + } + _, err := tx.Model(basemodel.BaseSysUser{}).Where("id", s.userid).Increment("free_gold", -useglod) + if err != nil { + return err + } + tx.Model(s.Model).Where("catch_time", tt.CatchTime).Delete() + + _, err = tx.Model(basemodel.BaseSysUser{}).Where("id", tt.PlayerID).Increment("free_gold", int64(tt.SalePrice)*98) + if err != nil { + return err + } + sql := fmt.Sprintf(` +UPDATE %s +SET max_ts = CASE + WHEN max_ts < EXTRACT(EPOCH FROM NOW())::INT THEN EXTRACT(EPOCH FROM NOW())::INT + ELSE max_ts + 1 +END +WHERE id = ? AND deleted_at IS NULL +RETURNING max_ts; +`, service.NewBaseSysUserService().Model.TableName()) + + // 执行 Raw SQL 并扫描返回值 + ret, err := tx.Model(service.NewBaseSysUserService().Model).Raw(sql, s.userid).All() + if err != nil { + return err + } + //fmt.Println(ret, err) + tt.CatchTime = ret.Array()[0].Uint32() + + var player model.Pet + player.PlayerID = s.userid + player.Data = tt.Data + player.CatchTime = tt.CatchTime + player.Free = 0 + player.SaleCount = tt.SaleCount + 1 + player.IsVip = cool.Config.ServerInfo.IsVip + + _, err = tx.Model(s.Model).Insert(player) + if err != nil { + return err + } + + return nil + }) } func (s *PetService) UPdate(t model.PetInfo) {