package mapLeague import ( "f1-game/internal/code" "f1-game/internal/component/redis" "f1-game/internal/enum" nameLocal "f1-game/internal/name/local" nameRemote "f1-game/internal/name/remote" nameRoute "f1-game/internal/name/route" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/internal/types" mapCall "f1-game/nodes/map/internal/call" dbLeague "f1-game/nodes/map/internal/db/data/league" mapTypes "f1-game/nodes/map/internal/types" cproto "github.com/cherry-game/cherry/net/proto" ) func (p *actorLeague) initAssemble() { p.Local().Register(nameLocal.MapLeague_AssembleList, p.assembleList) p.Local().Register(nameLocal.MapLeague_AssembleStop, p.assembleStop) p.Local().Register(nameLocal.MapLeague_AssembleKick, p.assembleKick) p.Local().Register(nameLocal.MapLeague_AssembleDepart, p.assembleDepart) p.Local().Register(nameLocal.MapLeague_AssembleQuit, p.assembleQuit) p.Remote().Register(nameRemote.MapLeague_AssembleAdd, p.assembleAdd) p.Remote().Register(nameRemote.MapLeague_AssembleUpdate, p.assembleUpdate) } // 获取集结列表 func (p *actorLeague) assembleList(session *cproto.Session, _ *pb.None) { proto := pb.MapAssembleList{} for _, assemble := range p.leagueTable.Assembles { proto.List = append(proto.List, assemble.ToProto()) } p.Response(session, &proto) } func (p *actorLeague) assembleStop(session *cproto.Session, req *pb.I64) { assembleID := req.GetValue() assemble, ok := p.leagueTable.Assembles.Get(assembleID) if !ok { p.ResponseCode(session, code.MapAssemble_NotFound) return } if assemble.LeadPlayerID != sessions.GetPlayerID(session) { p.ResponseCode(session, code.MapAssemble_NotLeader) return } errCode := mapCall.Logic.AssembleStop(assemble.AssembleID) if code.IsFail(errCode) { p.Debug("assemble stop fail: LeagueID = %d, errCode = %d", p.leagueID, errCode) p.ResponseCode(session, errCode) return } // 删除集结信息 p.leagueTable.Assembles.Remove(assemble.AssembleID) p.leagueTable.Save2Queue() p.ResponseCode(session, code.OK) // 通知联盟成员 p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{Value: -1}) } func (p *actorLeague) assembleKick(session *cproto.Session, req *pb.I64I64) { var ( assembleID = req.Key kickMarchObjectID = req.Value ) assemble, ok := p.leagueTable.Assembles.Get(assembleID) if !ok { p.ResponseCode(session, code.MapAssemble_NotFound) return } // 不是自己的集结队列 if assemble.LeadPlayerID != sessions.GetPlayerID(session) { p.ResponseCode(session, code.MapAssemble_NotLeader) return } // 不能踢队长 if assembleID == kickMarchObjectID { p.ResponseCode(session, code.MapAssemble_KickLeader) return } // 成员不在集结队列中 if !assemble.ContainsMarch(kickMarchObjectID) { p.ResponseCode(session, code.MapAssemble_NotInAssemble) return } errCode := mapCall.Logic.AssembleQuit(assembleID, kickMarchObjectID) if code.IsFail(errCode) { p.Debug("assemble kick fail: LeagueID = %d, errCode = %d", p.leagueID, errCode) p.ResponseCode(session, errCode) return } assemble.RemoveMember(kickMarchObjectID) p.leagueTable.Save2Queue() p.ResponseCode(session, code.OK) p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{}) } func (p *actorLeague) assembleDepart(session *cproto.Session, req *pb.I64) { assemble, ok := p.leagueTable.Assembles.Get(req.Value) if !ok { p.ResponseCode(session, code.MapAssemble_NotFound) return } // 不是自己的集结队列 if assemble.LeadPlayerID != sessions.GetPlayerID(session) { p.ResponseCode(session, code.MapAssemble_NotLeader) return } errCode := mapCall.Logic.AssembleDepart(assemble.AssembleID) if code.IsFail(errCode) { p.Debug("assemble depart fail: LeagueID = %d, errCode = %d", p.leagueID, errCode) p.ResponseCode(session, errCode) return } // 设置出发标记 assemble.IsDepart = true p.leagueTable.Save2Queue() p.ResponseCode(session, code.OK) p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{}) } func (p *actorLeague) assembleQuit(session *cproto.Session, req *pb.I64) { assemble, ok := p.leagueTable.Assembles.Get(req.Value) if !ok { p.ResponseCode(session, code.MapAssemble_NotFound) return } playerID := sessions.GetPlayerID(session) var foundMember *mapTypes.AssembleMember for _, member := range assemble.JoinList { if member.PlayerID == playerID { foundMember = member break } } if foundMember == nil { p.ResponseCode(session, code.MapAssemble_NotInAssemble) return } errCode := mapCall.Logic.AssembleQuit(assemble.AssembleID, foundMember.MarchObjectID) if code.IsFail(errCode) { p.Debug("assemble quit fail: LeagueID = %d, errCode = %d", p.leagueID, errCode) p.ResponseCode(session, errCode) return } assemble.RemoveMember(foundMember.MarchObjectID) p.leagueTable.Save2Queue() p.ResponseCode(session, code.OK) p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{}) } func (p *actorLeague) assembleAdd(req *pb.NewAssemble) { p.Debug("[assembleAdd] req = %v", req) assemble := &dbLeague.Assemble{ AssembleID: req.LegionObjectID, LeadPlayerID: req.LeadMember.PlayerID, StartPoint: types.NewPoint(req.Point.X, req.Point.Y), EndTime: req.EndTime, TargetObjectID: req.TargetObjectID, TargetConfigID: req.TargetConfigID, TargetObjectType: enum.ObjectType(req.TargetObjectType), TargetPoint: types.NewPoint(req.TargetPoint.X, req.TargetPoint.Y), } p.addAssembleMember(assemble, req.LeadMember) p.leagueTable.Assembles.Put(req.LegionObjectID, assemble) p.leagueTable.Save2Queue() // 通知联盟成员 p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{Value: 1}) } // 集结更新 func (p *actorLeague) assembleUpdate(req *pb.AssembleUpdate) { p.Debug("[assembleUpdate] req = %+v", req) assemble, ok := p.leagueTable.Assembles.Get(req.LegionObjectID) if !ok { return } // 解散 if req.IsDisband { p.leagueTable.Assembles.Remove(req.LegionObjectID) p.leagueTable.Save2Queue() p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{Value: -1}) return } var update bool if req.NewMember != nil { p.addAssembleMember(assemble, req.NewMember) update = true } if req.QuitMember > 0 { assemble.RemoveMember(req.QuitMember) update = true } if req.IsDepart { assemble.IsDepart = true update = true } if update { p.leagueTable.Save2Queue() p.pushToMembers(nameRoute.PushMapLeague_AssembleUpdate, &pb.I32{}) } } func (p *actorLeague) addAssembleMember(assemble *dbLeague.Assemble, req *pb.AssembleMember) { playerData, _, heroData := redis.Game.GetPlayerTeamHeroData(req.PlayerID, req.TeamID, req.HeroGUID) if playerData != nil { req.PlayerName = playerData.PlayerName } member := &mapTypes.AssembleMember{ PlayerID: req.PlayerID, PlayerName: req.PlayerName, MarchObjectID: req.MarchObjectID, TroopsNum: req.TroopsNum, MarchArriveTime: req.ArriveTime, } if heroData != nil { member.HeroConfigID = heroData.ConfigID member.HeroLevel = heroData.Level member.HeroStar = heroData.Star } assemble.JoinList = append(assemble.JoinList, member) }