actor_login.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package login
  2. import (
  3. cherryApp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/component/redis"
  6. nameActor "f1-game/internal/name/actor"
  7. nameLocal "f1-game/internal/name/local"
  8. nameRemote "f1-game/internal/name/remote"
  9. "f1-game/internal/pb"
  10. "f1-game/internal/sessions"
  11. "f1-game/nodes/game/internal/db"
  12. ctime "github.com/cherry-game/cherry/extend/time"
  13. clog "github.com/cherry-game/cherry/logger"
  14. "github.com/cherry-game/cherry/net/parser/pomelo"
  15. cproto "github.com/cherry-game/cherry/net/proto"
  16. )
  17. type actorLogin struct {
  18. pomelo.ActorBase
  19. }
  20. func (p *actorLogin) OnInit() {
  21. p.Local().Register(nameLocal.Login_Enter, p.playerEnter)
  22. }
  23. func (p *actorLogin) OnStop() {
  24. }
  25. // playerEnter 玩家进入游戏 game.login.enter
  26. func (p *actorLogin) playerEnter(session *cproto.Session, req *pb.PlayerEnterRequest) {
  27. now := ctime.Now()
  28. // 玩家已登录(防止反复请求)
  29. if session.Contains(sessions.PlayerID) {
  30. p.ResponseCode(session, code.PlayerHasLoggedIn)
  31. return
  32. }
  33. gameNodeID := sessions.GetGameNodeID(session)
  34. if gameNodeID != cherryApp.NodeID() {
  35. p.ResponseCode(session, code.PlayerLoginServerError)
  36. return
  37. }
  38. // 获取playerID,如果不存在,则分配一个playerID
  39. playerID, found := db.GetPlayerIDWithUID(session.Uid)
  40. if !found {
  41. // 生成全局唯一ID
  42. playerID = redis.GUID.NewGUID()
  43. // 设置session为新玩家
  44. session.Add(sessions.IsNewPlayer, true)
  45. // 设置语言
  46. if req.Language != "" {
  47. session.Add(sessions.Language, req.Language)
  48. }
  49. }
  50. // playerID error
  51. if playerID < 1 {
  52. p.ResponseCode(session, code.PlayerIDError)
  53. return
  54. }
  55. // add playerID for session
  56. session.Add(sessions.PlayerID, playerID)
  57. // 调用 player actor的函数onEnter()
  58. p.Call(p.NewChildPath(nameActor.GamePlayer, playerID), nameRemote.Player_OnEnter, session)
  59. elapsedTime := now.NowDiffMillisecond()
  60. if elapsedTime > 1000 {
  61. clog.Infof("playerID = %d enter game. elapsed time %d", playerID, elapsedTime)
  62. }
  63. }