package mapPlayer import ( "f1-game/internal/code" "f1-game/internal/enum" nameLocal "f1-game/internal/name/local" "f1-game/internal/pb" "f1-game/internal/types" mapCall "f1-game/nodes/map/internal/call" "f1-game/nodes/map/internal/db" "f1-game/nodes/map/player/team" ctime "github.com/cherry-game/cherry/extend/time" cproto "github.com/cherry-game/cherry/net/proto" ) func (p *actorPlayer) initAssemble() { p.Local().Register(nameLocal.MapPlayer_Assemble, p.assemble) p.Local().Register(nameLocal.MapPlayer_AssembleJoin, p.assembleJoin) } // 发起集结 func (p *actorPlayer) assemble(session *cproto.Session, req *pb.MapAssembleRequest) { p.Debug("[assemble] req = %+v", req) playerTable := db.GetMapPlayerTable(p.playerID) if playerTable.LeagueID == 0 { p.ResponseCode(session, code.LeagueNotJoin) return } dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID) if !ok { p.ResponseCode(session, code.MapTeamNotFound) return } // 发起集结需要 standby if !dbTeam.IsStandby() { p.ResponseCode(session, code.TeamIsBusy) return } // 检查 team 状态 if errCode := dbTeam.IsBusy(); code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 寻路检查目标是否可达 path, errCode := mapCall.PathFind.Find(playerTable.Point.X, playerTable.Point.Y, req.Point.X, req.Point.Y, p.playerID, playerTable.LeagueID, enum.MarchType_Assemble) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 检查资源是否足够 errCode = team.Service().CheckMarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path)) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } arg := pb.AssembleRequest{ PlayerID: p.playerID, LeagueID: playerTable.LeagueID, MarchObjectID: dbTeam.MarchObjectID, TargetObjectID: req.ObjectID, TargetObjectType: req.ObjectType, AssembleTime: int64(req.AssembleTime) * ctime.MillisecondsPerMinute, Path: path, IsAutoRetreat: req.IsAutoRetreat, MarchSync: team.Service().GetTeamMarchSyncProto(playerTable, dbTeam), } rsp, errCode := mapCall.Logic.Assemble(&arg) if code.IsFail(errCode) { p.Debug("assemble fail: LeagueID = %d, errCode = %d", playerTable.LeagueID, errCode) p.ResponseCode(session, errCode) return } // 扣除资源 team.Service().MarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path)) if dbTeam.MarchObjectID == 0 { dbTeam.MarchObjectID = rsp.Key playerTable.Save2Queue() } // 更新队伍状态 team.Service().UpdateTeamStateByMarchState(playerTable, dbTeam, enum.MarchState(rsp.Value)) p.ResponseCode(session, code.OK) } func (p *actorPlayer) assembleJoin(session *cproto.Session, req *pb.MapAssembleJoinRequest) { p.Debug("[assembleJoin] req = %+v", req) playerTable := db.GetMapPlayerTable(p.playerID) if playerTable.LeagueID == 0 { p.ResponseCode(session, code.LeagueNotJoin) return } dbTeam, ok := playerTable.Teams.GetTeam(req.TeamID) if !ok { p.ResponseCode(session, code.MapTeamNotFound) return } if errCode := dbTeam.IsBusy(); code.IsFail(errCode) { p.ResponseCode(session, errCode) return } var ( startPoint types.Point endPoint types.Point ) // 如果是待命状态,行军点就是玩家当前位置 if dbTeam.IsNeedSync() { startPoint = playerTable.Point // 只打目标集结点就够了 errCode := mapCall.Logic.GetObject1Point(req.AssembleID, enum.ObjectType_Legion, &endPoint) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } } else { // 非待命状态,要找行军对象坐标和集结点坐标 var ( marchObject = enum.NewObject(dbTeam.MarchObjectID, enum.ObjectType_March) assembleObject = enum.NewObject(req.AssembleID, enum.ObjectType_Legion) errCode = mapCall.Logic.GetObject2Point(marchObject, assembleObject, &startPoint, &endPoint) ) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } } path, errCode := mapCall.PathFind.Find(startPoint.X, startPoint.Y, endPoint.X, endPoint.Y, p.playerID, playerTable.LeagueID, enum.MarchType_Assemble) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 检查资源是否足够 errCode = team.Service().CheckMarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path)) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 调用地图行军 arg := &pb.MarchRequest{ TeamID: dbTeam.TeamID, ObjectID: dbTeam.MarchObjectID, MarchType: int32(enum.MarchType_Assemble), Point: endPoint.ToProto(), Path: path, TargetObjectID: req.AssembleID, IsAutoRetreat: req.IsAutoRetreat, } if dbTeam.IsNeedSync() { arg.MarchSync = team.Service().GetTeamMarchSyncProto(playerTable, dbTeam) } rsp, errCode := mapCall.Logic.AssembleJoin(arg) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 扣除资源 team.Service().MarchCost(p.playerID, req.TeamID, enum.MarchType_Assemble, len(path)) if dbTeam.MarchObjectID == 0 { dbTeam.MarchObjectID = rsp.Key playerTable.Save2Queue() } // 更新队伍状态 team.Service().UpdateTeamStateByMarchState(playerTable, dbTeam, enum.MarchState(rsp.Value)) p.ResponseCode(session, code.OK) }