Files
bl/logic/service/player/save.go
昔念 5caa9a1e4f
All checks were successful
ci/woodpecker/push/my-first-workflow Pipeline was successful
```
feat(controller): 增强命令注册逻辑并修复试炼塔关卡限制

- 在命令注册时检查重复方法,如果存在则panic提示错误
- 移除CurrentFreshStage和CurrentStage的默认值设置逻辑
- 添加关卡等级验证,确保用户不能挑战超过最大关卡数的关卡
- 修复试炼之塔和勇者之塔的关卡计算逻辑

fix(item): 修复道具
2026-03-03 19:28:59 +08:00

118 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package player
import (
"blazing/common/data/share"
"blazing/cool"
"fmt"
"blazing/logic/service/fight/info"
"blazing/logic/service/space"
"context"
"time"
"github.com/gogf/gf/v2/util/grand"
)
// Save 保存玩家数据
func (p *Player) Save() {
cool.CacheManager.Remove(context.TODO(), fmt.Sprintf("player:%d", p.Info.UserID))
if cool.Config.ServerInfo.IsVip != 0 {
return
}
if p.Info == nil {
return
}
newtime := time.Now().Unix()
p.Info.TimeToday = p.Info.TimeToday + newtime - int64(p.Logintime) //保存电池时间
// p.Info.FightTime = p.Info.FightTime + (newtime - int64(p.Logintime))
p.Info.OnlineTime = p.Info.OnlineTime + (newtime-int64(p.Logintime))/60 //每次退出时候保存已经在线的分钟数
if p.FightC != nil {
//ov := make(chan struct{})
go func() {
defer func() {
if err := recover(); err != nil { // 恢复 panicerr 为 panic 错误值
// 1. 打印错误信息
cool.Logger.Error(context.TODO(), "panic 错误:", err)
}
}()
p.FightC.Over(p, info.BattleOverReason.PlayerOffline) //玩家逃跑,但是不能锁线程
}()
//<-ov
select {
case <-p.FightC.GetOverChan(): //等待结束
case <-time.After(time.Second * 5): //等待5秒
cool.Logger.Error(context.TODO(), "战斗崩溃", p.Info.UserID)
}
}
p.IsLogin = false
p.Service.Info.Save(*p.Info)
space.GetSpace(p.Info.MapID).LeaveMap(p)
p.MapNPC.Stop() //停止刷怪
Mainplayer.Delete(p.Info.UserID)
share.ShareManager.DeleteUserOnline(p.Info.UserID) //设置用户登录服务器
}
func (p *Player) CanGet() bool {
if p.Info.TimeToday >= p.Info.TimeLimit {
return false
}
islogintime := (int64(time.Now().Unix()) - int64(p.Logintime))
if islogintime > (p.Info.TimeLimit - p.Info.TimeToday) {
return false
}
return true
}
// 经验倍数返回
func (p *Player) CanGetExp() (float32, float32) {
var base float32 = 1
if p.Info.TwoTimes > 0 {
p.Info.TwoTimes--
base *= 2
}
if p.Info.ThreeTimes > 0 {
p.Info.ThreeTimes--
base *= 3
}
return (base), 0.2
}
func (p *Player) CanGetXUAN() bool {
var base = 1
if p.Info.EnergyTime > 0 {
base = 2
p.Info.EnergyTime--
}
if grand.Meet(base, 2) {
return true
}
return false
}
func (p *Player) CanGetItem() bool {
var base = 3
if p.Info.EnergyTime > 0 {
base = 6
p.Info.EnergyTime--
}
if grand.Meet(base, 10) {
return true
}
return false
}