package leagueMember import ( "f1-game/internal/enum" nameRoute "f1-game/internal/name/route" "f1-game/internal/pb" "f1-game/internal/sessions" "f1-game/nodes/map/internal/db" mapFacade "f1-game/nodes/map/internal/facade" leagueBase "f1-game/nodes/map/league/base" cherryLogger "github.com/cherry-game/cherry/logger" clog "github.com/cherry-game/cherry/logger" cproto "github.com/cherry-game/cherry/net/proto" ) func Service() *service { return &service{} } type service struct { mapFacade.LeagueServiceBase[*db.MapLeagueTable] } func (p *service) OnReset(leagueTable *db.MapLeagueTable) { if leagueTable.Stats.IsWeekReset { leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueTable.LeagueID) if !found { clog.Warnf("league member week reset, league member table not found. leagueID:%d", leagueTable.LeagueID) } for _, member := range leagueMemberTable.Members { member.WeekReset() } leagueMemberTable.Save2Queue() } } // 推送联盟邮件列表 func (p *service) Push(leagueTable *db.MapLeagueTable, session *cproto.Session) { // 推送联盟职位信息 p.JobPush(leagueTable, session) } // 盟主转让定时检测 func (p *service) LeagueLeaderTransferTimer(leagueTable *db.MapLeagueTable, nowSecond int64) { leagueID := leagueTable.LeagueID leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID) if !found { return } var ( playerID = leagueMemberTable.LeagueMember.Transfer.PlayerID endTime = leagueMemberTable.LeagueMember.Transfer.EndTime ) // 不存在转让玩家 if playerID <= 0 || nowSecond < endTime { return } if found = leagueMemberTable.LeagueMember.CheckMemberExist(playerID); found { leagueTable, found := db.GetMapLeagueTable(leagueID) if !found { clog.Warnf("leagueLeaderTransfer leagueTable not found leagueID = %v", leagueID) return } oldLeaderPlayerID := leagueTable.LeagueInfo.LeaderID leagueTable.LeagueInfo.LeaderID = playerID leagueTable.Save2Queue() // 获取旧盟主职位 leaderJobID := leagueMemberTable.GetLeagueMemberJob(oldLeaderPlayerID) leagueMemberTable.LeagueJob.Jobs[leaderJobID] = playerID // 职位变更通知 p.PermissionChangePush(leagueMemberTable, oldLeaderPlayerID, playerID) // 同步新盟主信息 leagueBase.Service().SyncLeagueLeaderChange(leagueID, playerID, oldLeaderPlayerID, enum.Log_LeagueLeaderTransfer) } leagueMemberTable.SetLeagueTransfer(0, 0) leagueMemberTable.Save2Queue() } // 弹劾盟主定时器检测 func (p *service) LeagueImpeachTimer(leagueTable *db.MapLeagueTable, nowSecond int64) { leagueID := leagueTable.LeagueID leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID) if !found { return } if !leagueMemberTable.LeagueMember.CheckLeagueImpeachExist() { return } // 判断时间是否以达到 if nowSecond < leagueMemberTable.GetLeagueImpeachEndTime() { return } // 时间已到 获取弹劾人数 var ( agreeCount = int32(len(leagueMemberTable.Impeach.AgreePlayerIDs)) rejectCount = int32(len(leagueMemberTable.Impeach.RejectPlayerIDs)) newLeaderID = leagueMemberTable.Impeach.PlayerID needCount = leagueMemberTable.Impeach.Total / 2 ) // 同意人数大于反对的人数 且 当前同意的人数大于等于总可以投票的人数/2 弹劾成功 if rejectCount < agreeCount && agreeCount >= needCount { // 盟主转换 leagueTable, found := db.GetMapLeagueTable(leagueID) if !found { cherryLogger.Warnf("league impeach finish fail, league not found. leagueID:%d", leagueID) return } oldLeaderPlayerID := leagueTable.LeagueInfo.LeaderID leagueTable.LeagueInfo.LeaderID = newLeaderID // 如果弹劾玩家存在职位 需要先卸载职位 leagueMemberTable.Resigned(newLeaderID) leagueTable.Save2Queue() // 同步新的盟主信息 leagueBase.Service().SyncLeagueLeaderChange(leagueID, newLeaderID, oldLeaderPlayerID, enum.Log_LeagueLeaderImpeach) } // 不管是否弹劾成功 都需要清除弹劾数据 leagueMemberTable.LeagueImpeachClear(newLeaderID) leagueMemberTable.Save2Queue() } func (p *service) PermissionChangePush(leagueMemberTable *db.MapLeagueMemberTable, playerIDs ...int64) { if len(playerIDs) <= 0 { return } for _, playerID := range playerIDs { session, found := sessions.GetSession(playerID) if !found { continue } resp := &pb.LeagueJob{ Job: leagueMemberTable.GetLeagueMemberJob(playerID), } // 获取职位权限列表 if resp.Job > 0 { permissions, _ := leagueMemberTable.GetJobPermissions(resp.Job) resp.Permissions = permissions } sessions.PushWithSession(session, nameRoute.PushLeague_JobChange, resp) } } func (p *service) JobPush(leagueTable *db.MapLeagueTable, session *cproto.Session) { var ( playerID = sessions.GetPlayerID(session) leagueID = leagueTable.LeagueID ) leagueMemberTable, found := db.GetMapLeagueMemberTable(leagueID) if !found { return } jobID := leagueMemberTable.LeagueMember.GetLeagueMemberJob(playerID) // 没有职位 if jobID <= 0 { return } permissions, _ := leagueMemberTable.GetJobPermissions(jobID) resp := &pb.LeagueJob{ Job: jobID, Permissions: permissions, } sessions.PushWithSession(session, nameRoute.PushLeague_JobInfo, resp) }