Files
bl/logic/service/player/save.go
昔念 174562b895 ```
feat(config): 重构配置结构并添加服务器列表支持

- 重命名PortBL字段为GameOnlineID,改进命名语义
- 添加ServerList结构体用于管理服务器配置
- 移除七牛云配置相关字段
- 更新ID生成器使用GameOnlineID参数

fix(server): 调整服务器启动参数和VIP逻辑

- 将启动参数从-port改为-id,统一参数命名
- 更新服务器启动逻辑,基于GameOnlineID获取服务器信息
- 为VIP服务器启用调试模式
- 优化端口可用性检查逻辑

refactor(model): 统一模型基类结构

- 将各模型中的*cool.Model嵌入改为Base基类
- 移除soul.go
2026-01-08 03:30:18 +08:00

109 lines
2.6 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"
"blazing/modules/blazing/model"
"blazing/logic/service/fight/info"
"blazing/logic/service/space"
"context"
"time"
)
// Save 保存玩家数据
func (p *Player) Save() {
if cool.Config.ServerInfo.IsVip != 0 {
cool.Logger.Info(context.TODO(), "测试服不保存玩家数据", p.Info.UserID)
return
}
if p.Info == nil {
return
}
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)
}
}
newtime := uint32(time.Now().Unix())
p.Info.TimeToday = p.Info.TimeToday + newtime - uint32(p.Logintime) //保存电池时间
p.Info.OnlineTime = p.Info.OnlineTime + (newtime-uint32(p.Logintime))/60 //每次退出时候保存已经在线的分钟数
p.Service.Info.Save(*p.Info)
space.GetSpace(p.Info.MapID).LeaveMap(p)
p.MapNPC.Stop() //停止刷怪
p.IsLogin = false
Mainplayer.Delete(p.Info.UserID)
share.ShareManager.DeleteUserOnline(p.Info.UserID) //设置用户登录服务器
}
// 是否可以获得经验
func (p *Player) CanGetExp() bool {
if p.Info.TimeToday >= p.Info.TimeLimit {
return false
}
ttt := p.Info.TimeLimit - p.Info.TimeToday
return (uint32(time.Now().Unix()) - uint32(p.Logintime)) <= ttt
}
// CompleteLogin 标记登录完成并通知等待者
func (lw *Player) CompleteLogin() {
if lw.Info.MapID > 300 || lw.Info.MapID == 0 { //如果位于基地,就重置到传送仓
lw.Info.MapID = 1
}
if lw.IsNewPlayer() { //重置新手地图,放到机械仓
lw.Info.SetTask(4, model.Completed) //设置新手任务默认完成
lw.Info.MapID = 8
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)
}
}
}
lw.IsLogin = true
}
// 定义检查函数判断84-87索引中是否有任意一个元素不等于3
func (lw *Player) IsNewPlayer() bool {
// 遍历84到87的索引
for i := 85; i <= 88; i++ {
if lw.Info.GetTask(i) != model.Completed {
return true // 只要有一个不等于3就返回true
}
}
return false // 全部等于3则返回false
}