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 }