| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package ops
- import (
- cherryApp "f1-game/internal/cherry_app"
- "f1-game/internal/code"
- "f1-game/internal/data"
- "f1-game/internal/enum"
- nameActor "f1-game/internal/name/actor"
- nameRemote "f1-game/internal/name/remote"
- "f1-game/internal/pb"
- "f1-game/internal/sessions"
- "sync/atomic"
- clog "github.com/cherry-game/cherry/logger"
- "github.com/cherry-game/cherry/net/parser/pomelo"
- )
- type (
- actor struct {
- pomelo.ActorBase
- nodeState int32
- }
- )
- func NewActor() *actor {
- return &actor{}
- }
- func (p *actor) AliasID() string {
- return nameActor.Map_Ops
- }
- // OnInit Actor初始化前触发该函数
- func (p *actor) OnInit() {
- nodeConfig, found := data.Node.GetByNodeID(cherryApp.NodeID())
- if !found || !nodeConfig.Enable {
- p.nodeState = enum.NodeClosed
- } else {
- p.nodeState = enum.NodeOpen
- }
- clog.Infof("node default state [%d]", p.nodeState)
- p.Remote().Register(nameRemote.Ops_CheckNodeState, p.checkNodeState)
- p.Remote().Register(nameRemote.Ops_ChangeNodeState, p.changeNodeState)
- }
- // OnStop Actor停止前触发该函数
- func (*actor) OnStop() {
- }
- // checkNodeState 检查当前地图节点状态
- func (p *actor) checkNodeState(req *pb.User) int32 {
- // 开放状态,跳过检测
- if p.nodeState == enum.NodeOpen {
- return code.OK
- }
- // 维护状态,不在白名单中,则禁止进入地图
- if p.nodeState == enum.NodeMaintain {
- if data.NodeState.InWhiteList(req.Ip, req.Uid) {
- return code.OK
- }
- return code.NodeMapIsMaintain
- }
- // 否则禁止任何用户进入地图
- return code.NodeMapIsClosed
- }
- // changeNodeState 变更节点状态
- func (p *actor) changeNodeState(req *pb.I32) int32 {
- if req.Value < enum.NodeOpen || req.Value > enum.NodeClosed {
- return code.NodeMapChangeStateError
- }
- clog.Infof("node state from [%d] to [%d]", p.nodeState, req.Value)
- atomic.StoreInt32(&p.nodeState, req.Value)
- // 如果修改为关闭状态,则踢除本服所有在线用户
- if p.nodeState == enum.NodeClosed {
- clog.Infof("node state change to close. kick all online players! [count = %d]", sessions.UIDCount())
- rsp := &pb.I32{
- Value: code.NodeMapIsMaintain,
- }
- sessions.KickMap(p.App().NodeID(), rsp, true)
- }
- return code.OK
- }
|