actor.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package ops
  2. import (
  3. cherryApp "f1-game/internal/cherry_app"
  4. "f1-game/internal/code"
  5. "f1-game/internal/data"
  6. "f1-game/internal/enum"
  7. nameActor "f1-game/internal/name/actor"
  8. nameRemote "f1-game/internal/name/remote"
  9. "f1-game/internal/pb"
  10. "f1-game/internal/sessions"
  11. "sync/atomic"
  12. clog "github.com/cherry-game/cherry/logger"
  13. "github.com/cherry-game/cherry/net/parser/pomelo"
  14. )
  15. type (
  16. actor struct {
  17. pomelo.ActorBase
  18. nodeState int32
  19. }
  20. )
  21. func NewActor() *actor {
  22. return &actor{}
  23. }
  24. func (p *actor) AliasID() string {
  25. return nameActor.Map_Ops
  26. }
  27. // OnInit Actor初始化前触发该函数
  28. func (p *actor) OnInit() {
  29. nodeConfig, found := data.Node.GetByNodeID(cherryApp.NodeID())
  30. if !found || !nodeConfig.Enable {
  31. p.nodeState = enum.NodeClosed
  32. } else {
  33. p.nodeState = enum.NodeOpen
  34. }
  35. clog.Infof("node default state [%d]", p.nodeState)
  36. p.Remote().Register(nameRemote.Ops_CheckNodeState, p.checkNodeState)
  37. p.Remote().Register(nameRemote.Ops_ChangeNodeState, p.changeNodeState)
  38. }
  39. // OnStop Actor停止前触发该函数
  40. func (*actor) OnStop() {
  41. }
  42. // checkNodeState 检查当前地图节点状态
  43. func (p *actor) checkNodeState(req *pb.User) int32 {
  44. // 开放状态,跳过检测
  45. if p.nodeState == enum.NodeOpen {
  46. return code.OK
  47. }
  48. // 维护状态,不在白名单中,则禁止进入地图
  49. if p.nodeState == enum.NodeMaintain {
  50. if data.NodeState.InWhiteList(req.Ip, req.Uid) {
  51. return code.OK
  52. }
  53. return code.NodeMapIsMaintain
  54. }
  55. // 否则禁止任何用户进入地图
  56. return code.NodeMapIsClosed
  57. }
  58. // changeNodeState 变更节点状态
  59. func (p *actor) changeNodeState(req *pb.I32) int32 {
  60. if req.Value < enum.NodeOpen || req.Value > enum.NodeClosed {
  61. return code.NodeMapChangeStateError
  62. }
  63. clog.Infof("node state from [%d] to [%d]", p.nodeState, req.Value)
  64. atomic.StoreInt32(&p.nodeState, req.Value)
  65. // 如果修改为关闭状态,则踢除本服所有在线用户
  66. if p.nodeState == enum.NodeClosed {
  67. clog.Infof("node state change to close. kick all online players! [count = %d]", sessions.UIDCount())
  68. rsp := &pb.I32{
  69. Value: code.NodeMapIsMaintain,
  70. }
  71. sessions.KickMap(p.App().NodeID(), rsp, true)
  72. }
  73. return code.OK
  74. }