package scout import ( capp "f1-game/internal/cherry_app" "f1-game/internal/code" "f1-game/internal/enum" nameActor "f1-game/internal/name/actor" nameRemote "f1-game/internal/name/remote" "f1-game/internal/pb" "f1-game/nodes/map/internal/db" dbMapScout "f1-game/nodes/map/internal/db/data/scout" "time" ctime "github.com/cherry-game/cherry/extend/time" cfacade "github.com/cherry-game/cherry/facade" clog "github.com/cherry-game/cherry/logger" cactor "github.com/cherry-game/cherry/net/actor" ) // 侦察 type actor struct { cactor.Base table *db.MapScoutTable } func Init(app cfacade.IApplication, table *db.MapScoutTable) { actor := &actor{ table: table, } app.ActorSystem().CreateActor(actor.AliasID(), actor) } func (p *actor) AliasID() string { return nameActor.Map_Scout } func (p *actor) OnInit() { // 添加定时器处理 p.Timer().Add(1*time.Second, p.every1STimer) p.Timer().Add(5*time.Minute, p.checkAndSaveTimer) p.Remote().Register(nameRemote.MapScout_UpdateStatus, p.updateScoutStatus) } // 更新侦察状态 func (p *actor) updateScoutStatus(req *pb.ScoutRequest) int32 { var ( queueID = req.QueueID scoutType = req.ScoutType playerID = req.PlayerID endTime = req.EndTime ) if enum.CheckNotScoutType(scoutType) { return code.ScoutTypeError } playerScout, found := p.table.GetPlayerScout(playerID) if !found { playerScout = dbMapScout.NewPlayerScout() p.table.AddPlayerScount(playerID, playerScout) } if exist := playerScout.CheckQueueScouting(queueID); exist { return code.ScoutQueueBusy } if scoutType == enum.ScoutType_March { // 添加行军记录 playerScout.AddScoutMarch(queueID, endTime) } else { // 添加开始侦察记录 playerScout.AddScouting(queueID, endTime) } p.table.SetChangeData() return code.OK } func (p *actor) every1STimer() { now := ctime.Now().ToMillisecond() // 判断侦察是否结束,通知map处理 for playerID, playerScout := range p.table.PlayerScoutMap { // 获取侦察行军结束的列表 startIDs := playerScout.RemoveAndGetScoutMarchs(now) // 获取已结束的侦察列表 endIDs := playerScout.RemoveAndGetScouting(now) if len(startIDs) <= 0 && len(endIDs) <= 0 { continue } req := &pb.ScoutUpdateNotice{ Starts: startIDs, Ends: endIDs, } targetPath := cfacade.NewChildPath("", nameActor.Map_Player, playerID) errCode := capp.Call(targetPath, nameRemote.MapScout_UpdateNotice, req) if code.IsFail(errCode) { clog.Warnf("scout send update notice fail. playerID:%d, starts:%+v, ends:%d", playerID, startIDs, endIDs) } p.table.SetChangeData() } } func (p *actor) checkAndSaveTimer() { // 删除无用的玩家侦察数据 p.table.RemoveEmptyPlayerScout() // 检测数据保存 if p.table.IsChangeData() { p.table.Save2Queue() } } func (p *actor) OnStop() { p.checkAndSaveTimer() }