2025-11-15 13:20:42 +08:00
|
|
|
|
package player
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"blazing/common/data/share"
|
|
|
|
|
|
"blazing/cool"
|
2025-12-08 19:16:37 +08:00
|
|
|
|
"blazing/modules/blazing/model"
|
2025-11-15 22:17:43 +00:00
|
|
|
|
|
2025-11-15 13:20:42 +08:00
|
|
|
|
"blazing/logic/service/fight/info"
|
2025-11-15 22:17:43 +00:00
|
|
|
|
"blazing/logic/service/space"
|
2025-11-15 13:20:42 +08:00
|
|
|
|
"context"
|
|
|
|
|
|
"time"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// Save 保存玩家数据
|
|
|
|
|
|
func (p *Player) Save() {
|
|
|
|
|
|
if p.Info == nil {
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
if p.FightC != nil {
|
|
|
|
|
|
|
|
|
|
|
|
//ov := make(chan struct{})
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
|
|
|
|
|
|
defer func() {
|
|
|
|
|
|
if err := recover(); err != nil { // 恢复 panic,err 为 panic 错误值
|
|
|
|
|
|
// 1. 打印错误信息
|
|
|
|
|
|
|
|
|
|
|
|
cool.Loger.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.Loger.Error(context.TODO(), "战斗崩溃", p.Info.UserID)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
newtime := uint32(time.Now().Unix())
|
|
|
|
|
|
p.Info.TimeToday = p.Info.TimeToday + newtime - uint32(p.Logintime) //保存电池时间
|
|
|
|
|
|
|
2025-11-16 20:30:17 +00:00
|
|
|
|
p.Info.OnlineTime = p.Info.OnlineTime + (newtime-uint32(p.Logintime))/60 //每次退出时候保存已经在线的分钟数
|
2025-11-15 13:20:42 +08:00
|
|
|
|
|
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-11-15 13:20:42 +08:00
|
|
|
|
p.StopChan.Stop() //停止刷怪
|
|
|
|
|
|
|
|
|
|
|
|
p.IsLogin = false
|
|
|
|
|
|
|
|
|
|
|
|
Mainplayer.Delete(p.Info.UserID)
|
|
|
|
|
|
share.ShareManager.DeleteUserOnline(p.Info.UserID) //设置用户登录服务器
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 是否可以获得经验
|
|
|
|
|
|
func (p *Player) CanGetExp() bool {
|
2025-12-09 00:47:21 +08:00
|
|
|
|
if p.Info.TimeToday >= p.Info.TimeLimit {
|
|
|
|
|
|
return false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-15 13:20:42 +08:00
|
|
|
|
ttt := p.Info.TimeLimit - p.Info.TimeToday
|
2025-12-09 00:47:21 +08:00
|
|
|
|
|
2025-11-15 13:20:42 +08:00
|
|
|
|
return (uint32(time.Now().Unix()) - uint32(p.Logintime)) <= ttt
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// CompleteLogin 标记登录完成并通知等待者
|
|
|
|
|
|
func (lw *Player) CompleteLogin() {
|
|
|
|
|
|
|
2025-12-08 00:17:04 +08:00
|
|
|
|
if lw.Info.MapID > 300 || lw.Info.MapID == 0 { //如果位于基地,就重置到传送仓
|
2025-11-15 13:20:42 +08:00
|
|
|
|
lw.Info.MapID = 1
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-11-15 22:17:43 +00:00
|
|
|
|
if lw.IsNewPlayer() { //重置新手地图,放到机械仓
|
2025-12-08 19:16:37 +08:00
|
|
|
|
lw.Info.SetTask(4, model.Completed) //设置新手任务默认完成
|
2025-11-15 22:17:43 +00:00
|
|
|
|
lw.Info.MapID = 8
|
2025-11-30 02:31:08 +00:00
|
|
|
|
if len(lw.Info.PetList) == 0 {
|
|
|
|
|
|
rr := lw.Service.Pet.PetInfo(0)
|
|
|
|
|
|
if len(rr) > 0 {
|
|
|
|
|
|
lw.Info.PetList = append(lw.Info.PetList, rr[0].Data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
2025-11-15 13:20:42 +08:00
|
|
|
|
}
|
|
|
|
|
|
lw.IsLogin = true
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 定义检查函数:判断84-87索引中是否有任意一个元素不等于3
|
|
|
|
|
|
func (lw *Player) IsNewPlayer() bool {
|
|
|
|
|
|
// 遍历84到87的索引
|
|
|
|
|
|
for i := 84; i <= 87; i++ {
|
2025-12-08 19:16:37 +08:00
|
|
|
|
if lw.Info.GetTask(i) != model.Completed {
|
2025-11-15 13:20:42 +08:00
|
|
|
|
return true // 只要有一个不等于3,就返回true
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return false // 全部等于3则返回false
|
|
|
|
|
|
}
|