| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- 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"
- 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.CheckScoutType(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() {
- var (
- 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)
- capp.Call(targetPath, nameRemote.MapScout_UpdateNotice, req)
- p.table.SetChangeData()
- }
- }
- func (p *actor) checkAndSaveTimer() {
- // 删除无用的玩家侦察数据
- p.table.RemoveEmptyPlayerScout()
- // 检测数据保存
- if p.table.IsChangeData() {
- p.table.Save2Queue()
- }
- }
- func (p *actor) OnStop() {
- p.checkAndSaveTimer()
- }
|