package login import ( cherryApp "f1-game/internal/cherry_app" "f1-game/internal/code" "f1-game/internal/component/redis" nameActor "f1-game/internal/name/actor" nameLocal "f1-game/internal/name/local" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/nodes/game/internal/db" ctime "github.com/cherry-game/cherry/extend/time" clog "github.com/cherry-game/cherry/logger" "github.com/cherry-game/cherry/net/parser/pomelo" cproto "github.com/cherry-game/cherry/net/proto" ) type actorLogin struct { pomelo.ActorBase } func (p *actorLogin) OnInit() { p.Local().Register(nameLocal.Login_Enter, p.playerEnter) } func (p *actorLogin) OnStop() { } // playerEnter 玩家进入游戏 game.login.enter func (p *actorLogin) playerEnter(session *cproto.Session, req *pb.PlayerEnterRequest) { now := ctime.Now() // 玩家已登录(防止反复请求) if session.Contains(sessions.PlayerID) { p.ResponseCode(session, code.PlayerHasLoggedIn) return } gameNodeID := sessions.GetGameNodeID(session) if gameNodeID != cherryApp.NodeID() { p.ResponseCode(session, code.PlayerLoginServerError) return } // 获取playerID,如果不存在,则分配一个playerID playerID, found := db.GetPlayerIDWithUID(session.Uid) if !found { // 生成全局唯一ID playerID = redis.GUID.NewGUID() // 设置session为新玩家 session.Add(sessions.IsNewPlayer, true) // 设置语言 if req.Language != "" { session.Add(sessions.Language, req.Language) } } // playerID error if playerID < 1 { p.ResponseCode(session, code.PlayerIDError) return } // add playerID for session session.Add(sessions.PlayerID, playerID) // 调用 player actor的函数onEnter() p.Call(p.NewChildPath(nameActor.GamePlayer, playerID), nameRemote.Player_OnEnter, session) elapsedTime := now.NowDiffMillisecond() if elapsedTime > 1000 { clog.Infof("playerID = %d enter game. elapsed time %d", playerID, elapsedTime) } }