Files
bl/logic/controller/login.go
昔念 6979b7018d ```
feat(space): 替换并发安全map实现以提升性能

将原来基于`utils.ConcurrentMap`的玩家存储结构替换为
`github.com/mhmtszr/concurrent-swiss-map`提供的`CsMap`,
以获得更高效的并发读写能力。

同时修改了相关API调用方式:
- `Set` 改为 `Store`
- `Remove` 改为 `Delete`
- `IterCb` 改为 `Range`,并支持提前终止迭代
- `Items()` 不再使用

此外,调整了部分业务逻辑中对玩家列表遍历的方式,
确保在发送网络包后及时跳出循环,避免不必要的操作。

新增战斗类型处理函数`PET_King`用于处理宠物王相关的
战斗请求,并修复了`PET_MELEE`方法中的逻辑问题。

更新了go.mod和go.sum引入新的依赖库。
```
2025-11-15 15:22:58 +08:00

119 lines
3.2 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/data/xmlres"
"blazing/cool"
"fmt"
"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/gtime"
"github.com/jinzhu/copier"
"github.com/panjf2000/gnet/v2"
)
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 gnet.Conn) (result *user.LoginMSInfo, err errorcode.ErrorCode) { //这个时候player应该是空的
tt := data.CheakSession()
if !tt {
err = errorcode.ErrorCodes.ErrLoginServerError
defer c.Close()
return
}
cool.Loger.Info(context.TODO(), "准备踢人")
err1 := h.RPCClient.Kick(data.Head.UserID) //先踢人
if err1 != nil {
fmt.Println("踢人失败", err)
}
//player.KickPlayer(data.Head.UserID)
cool.Loger.Info(context.TODO(), "踢人请求完成,继续登录流程")
// <-time.After(time.Millisecond * 3000)
share.ShareManager.SetUserOnline(data.Head.UserID, h.Port) //设置用户登录服务器
t := player.GetPlayer(c, data.Head.UserID)
if t == nil {
cool.Loger.Error(context.Background(), "获取玩家失败", data.Head.UserID)
err = errorcode.ErrorCodes.ErrLoginServerError
defer c.Close()
return
}
t.Service = blservice.NewUserService(data.Head.UserID)
t.Info = t.Service.Person(data.Head.UserID)
if t.Info == nil {
err = errorcode.ErrorCodes.ErrLoginServerError
return
}
t.Info.UserID = data.Head.UserID
t.Logintime = uint32(time.Now().Unix()) //保存时间戳
t.Changemap = true
cool.Loger.Info(context.Background(), "用户上次重置日期", t.Info.LastResetTime.String())
if !IsToday(t.Info.LastResetTime) { //判断是否是今天
t.Info.LastResetTime = gtime.Now().Time
//每天login时候检查重置时间然后把电池任务挖矿重置
//挖矿需要单独存,因为防止多开挖矿
t.Info.TimeToday = 0 //重置电池
for i := 400; i < 500; i++ { //每日任务区段
tttL, ok := xmlres.TaskMap[i]
if ok {
if tttL.Type == 1 { //日常任务
t.Info.TaskList[i-1] = 0 //重置每日任务
}
}
}
for i := 0; i < 50; i++ { //每日任务区段
t.Info.DailyResArr[i] = 0 //重置每日任务
}
//defer t.Service.Talk_Reset()
}
t.CompleteLogin() //通知客户端登录成功
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.Range(func(playerID uint32, player common.PlayerI) bool {
player.SendPack(t1.Pack(tt))
return false
})
space.GetSpace(t.Info.MapID).User.Store(t.Info.UserID, t)
}()
return result, 0
}