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