Files
bl/logic/controller/login.go
昔念 eff23d5bd0 fix(login): 深拷贝用户信息以避免数据竞争
在登录逻辑中,使用 `copier.CopyWithOption` 进行深拷贝,确保发送给其他玩家的
玩家信息不会因为引用同一对象而导致数据异常。同时修正了部分字段注释和默认值说明。

feat(maps): 更新地图角色信息结构体字段描述

更新 `OutInfo` 结构体中的 `Action`、`Direction` 和 `ChangeShape` 字段的注释,
使其更准确地反映其用途和含义,便于后续维护与开发理解。

fix(player): 完善登录位置判断条件

在玩家完成登录时,除了判断 `MapID > 10000` 外,增加对 `MapID == 0` 的处理,
确保角色能正确被传送到默认地图。

refactor(walk): 移除无用上下文导入并优化日志记录

移除了未使用的 `context` 包导入,并调整了行走逻辑中的赋值顺序,使代码更清晰。
同时注释掉不再需要的调试日志输出语句。
2025-10-13 23:38:48 +08:00

103 lines
2.8 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 controller
import (
"blazing/common/data/share"
"blazing/common/socket/errorcode"
"blazing/logic/service/common"
"blazing/logic/service/user"
"blazing/logic/service/maps"
"blazing/logic/service/player"
"blazing/logic/service/space"
blservice "blazing/modules/blazing/service"
"context"
"time"
"github.com/gogf/gf/v2/os/glog"
"github.com/jinzhu/copier"
)
func IsToday(t time.Time) bool {
// 获取当前时间
now := time.Now()
// 比较年、月、日是否相同
return t.Year() == now.Year() &&
t.Month() == now.Month() &&
t.Day() == now.Day()
}
// 处理命令: 1001
func (h *Controller) Login(data *user.MAIN_LOGIN_IN, c *player.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
if tt := data.CheakSession(); tt { //说明sid正确
h.RPCClient.Kick(data.Head.UserID) //先踢人
t := player.GetPlayer(c, data.Head.UserID)
t.Service = blservice.NewUserService(data.Head.UserID)
t.Info = t.Service.Person(data.Head.UserID)
t.Info.UserID = data.Head.UserID
t.Onlinetime = uint32(time.Now().Unix()) //保存时间戳
t.Changemap = true
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
if !IsToday(t.Info.LastResetTime) { //判断是否是今天
t.Info.LastResetTime = time.Now()
//每天login时候检查重置时间然后把电池任务挖矿重置
//挖矿需要单独存,因为防止多开挖矿
t.Info.TimeToday = 0 //重置电池
defer func() {
// for i := 400; i < 500; i++ { //每日任务区段
// t.Info.TaskList[i] = 0 //重置每日任务
// t.Service.Task((uint32(i)), func(te *model.TaskEX) bool {
// te.Data = make([]uint32, 0)
// return true
// })
// }
for i := 400; i < 50; i++ { //每日任务区段
t.Info.DailyResArr[i] = 0 //重置每日任务
}
t.Service.Talk(func(m *map[uint32]uint32) bool {
m = &map[uint32]uint32{}
return true
})
}()
}
t.CompleteLogin() //通知客户端登录成功
glog.Debug(context.Background(), "登录成功,初始地图 人数:", space.GetSpace(t.Info.MapID).User.Count())
result = user.NewOutInfo() //设置登录消息
result.PlayerInfo = *t.Info
defer func() {
tt := maps.NewOutInfo()
copier.CopyWithOption(tt, t.Info, copier.Option{DeepCopy: true})
//copier.Copy(t.Info, tt)
t1 := player.NewTomeeHeader(2001, t.Info.UserID)
space.GetSpace(t.Info.MapID).User.Set(t.Info.UserID, t)
space.GetSpace(t.Info.MapID).User.IterCb(func(playerID uint32, player common.PlayerI) {
player.SendPack(t1.Pack(tt))
})
}()
return result, 0
} else {
err = errorcode.ErrorCodes.ErrLoginServerError
}
return
}