| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194 |
- 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)
- }
|