package scout import ( "f1-game/internal/code" "f1-game/internal/enum" "f1-game/internal/facade" nameRoute "f1-game/internal/name/route" "f1-game/internal/pb" "f1-game/internal/sessions" mapCall "f1-game/nodes/map/internal/call" "f1-game/nodes/map/internal/db" dbMapPlayer "f1-game/nodes/map/internal/db/data/player" "f1-game/nodes/map/player/battle" clog "github.com/cherry-game/cherry/logger" cproto "github.com/cherry-game/cherry/net/proto" ) func Service() *service { return &service{} } type service struct { facade.PlayerServiceBase[*db.MapPlayerTable] } func (*service) OnLogin(playerTable *db.MapPlayerTable, session *cproto.Session) { // 初始化侦察队列 // TODO 当前默认1个 if ok := playerTable.Scouts.ActiveQueue(1); ok { playerTable.Save2Queue() } } func (*service) Push(mapPlayerTable *db.MapPlayerTable, session *cproto.Session) { // 推送地图侦察列表 resp := mapPlayerTable.Scouts.ToProto() sessions.PushWithSession(session, nameRoute.PushMapPlayer_ScoutList, resp) } func (*service) ChangePush(mapPlayerTable *db.MapPlayerTable, changeQueueIDs ...int32) { if len(changeQueueIDs) <= 0 { return } resp := &pb.MapScoutList{} for _, queueID := range changeQueueIDs { scout, found := mapPlayerTable.Scouts.GetScout(queueID) if !found { clog.Warnf("[ChangePush] scout not found. playerID=%d, queueID=%d", mapPlayerTable.PlayerID, queueID) continue } resp.List = append(resp.List, scout.ToScoutProto(queueID)) } if len(resp.List) > 0 { sessions.PushPlayer(mapPlayerTable.PlayerID, nameRoute.PushMapPlayer_ScoutChange, resp) } } func (p *service) CheckScoutSuccess(playerTable *db.MapPlayerTable, queueID int32, scout *dbMapPlayer.Scout) int32 { // callwait logic 判断玩家现在是否还在原来的位置 resp, errCode := mapCall.Logic.ScoutCheck(playerTable.PlayerID, scout.ObjectID) if code.IsFail(errCode) { clog.Warnf("[CheckScoutSuccess] scout check fail. playerID=%d, queueID=%d, errCode=%d", playerTable.PlayerID, queueID, errCode) return errCode } result := enum.ScoutState_Success // 位置已发生改变 if scout.IsPointChanged(resp.Point) { result = enum.ScoutState_Lost } // 如果当前处于保护中 if resp.TargetState != 0 { result = enum.ScoutState_Protected } if result != enum.ScoutState_Success { var ( playerID = playerTable.PlayerID playerName = playerTable.PlayerName leagueID = playerTable.LeagueID targetPlayerID = resp.TargetPlayerID targetPlayerName = resp.TargetPlayerName ) // 构建战报 reportGroup := battle.Service().BuildScoutReportGroup(playerID, targetPlayerID, leagueID, playerName, targetPlayerName, scout.Point.ToProto(), nil, result) // 发送侦察失败战报 battle.Service().AddReport(playerID, reportGroup) return code.ScoutFail } return result }