From 87d5b9209727c841c97cbad7b3048d972ceb4321 Mon Sep 17 00:00:00 2001 From: liwei1dao Date: Thu, 4 May 2023 19:13:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modules/parkour/api_Info.go | 3 +- modules/parkour/api_invite.go | 12 +++-- modules/parkour/api_invitehandle.go | 3 +- modules/parkour/api_jointeam.go | 18 +++++-- modules/parkour/api_quitteam.go | 82 +++++++++++++++++++++++------ modules/parkour/model_parkour.go | 6 +-- modules/parkour/module.go | 32 +++++------ modules/rtask/model_rtask.go | 6 ++- modules/rtask/module.go | 7 ++- 9 files changed, 122 insertions(+), 47 deletions(-) diff --git a/modules/parkour/api_Info.go b/modules/parkour/api_Info.go index 830853973..d933a5ac0 100644 --- a/modules/parkour/api_Info.go +++ b/modules/parkour/api_Info.go @@ -21,7 +21,8 @@ func (this *apiComp) Info(session comm.IUserSession, req *pb.ParkourInfoReq) (co if code = this.InfoCheck(session, req); code != pb.ErrorCode_Success { return } - isopen = this.module.configure.isopen() + // isopen = this.module.configure.isopen() + isopen = true if isopen { if info, err = this.module.parkourComp.queryinfo(session.GetUserId()); err != nil { code = pb.ErrorCode_DBError diff --git a/modules/parkour/api_invite.go b/modules/parkour/api_invite.go index a10ab4340..301481ca2 100644 --- a/modules/parkour/api_invite.go +++ b/modules/parkour/api_invite.go @@ -59,7 +59,7 @@ func (this *apiComp) Invite(session comm.IUserSession, req *pb.ParkourInviteReq) } } if !ok { - info.Member = append(info.Member, &pb.DBRaceMember{Uid: tuser.Uid, Name: tuser.Name, Avatar: tuser.Avatar, Mount: info.Dfmount, Hp: mount.Hp}) + info.Member = append(info.Member, &pb.DBRaceMember{Uid: tuser.Uid, Name: tuser.Name, Avatar: tuser.Avatar, Lv: tuser.Lv, Mount: info.Dfmount, Hp: mount.Hp}) } if tinfo, err = this.module.parkourComp.queryinfo(req.Uid); err != nil { @@ -77,7 +77,8 @@ func (this *apiComp) Invite(session comm.IUserSession, req *pb.ParkourInviteReq) //目标是否在线 if !this.module.ModuleUser.IsOnline(req.Uid) { - member = &pb.DBRaceMember{Uid: tuser.Uid, Name: tuser.Name, Avatar: tuser.Avatar, Mount: tinfo.Dfmount, Hp: mount.Hp, Isai: true} + member = &pb.DBRaceMember{Uid: tuser.Uid, Name: tuser.Name, Avatar: tuser.Avatar, Lv: tuser.Lv, Mount: tinfo.Dfmount, Hp: mount.Hp, Isai: true} + info.Captainid = session.GetUserId() info.Member = append(info.Member, member) users = make([]string, len(info.Member)) for i, v := range info.Member { @@ -100,14 +101,15 @@ func (this *apiComp) Invite(session comm.IUserSession, req *pb.ParkourInviteReq) } } if !ok { - info.Invite = append(info.Invite, &pb.DBRaceInvite{Uid: tuser.Uid, Name: tuser.Name, Avatar: tuser.Avatar, Expired: configure.Now().Add(time.Second * 10).Unix()}) + info.Invite = append(info.Invite, &pb.DBRaceInvite{Uid: tuser.Uid, Name: tuser.Name, Avatar: tuser.Avatar, Lv: tuser.Lv, Expired: configure.Now().Add(time.Second * 10).Unix()}) } this.module.SendMsgToUser(string(this.module.GetType()), "invitenotice", &pb.ParkourInviteNoticePush{Team: info, State: 1}, req.Uid) } if err = this.module.parkourComp.Change(session.GetUserId(), map[string]interface{}{ - "invite": info.Invite, - "member": info.Member, + "captainid": info.Captainid, + "invite": info.Invite, + "member": info.Member, }); err != nil { code = pb.ErrorCode_DBError return diff --git a/modules/parkour/api_invitehandle.go b/modules/parkour/api_invitehandle.go index 004d2edab..1a6198a1f 100644 --- a/modules/parkour/api_invitehandle.go +++ b/modules/parkour/api_invitehandle.go @@ -64,12 +64,13 @@ func (this *apiComp) InviteHandle(session comm.IUserSession, req *pb.ParkourInvi code = pb.ErrorCode_ConfigNoFound return } - member = &pb.DBRaceMember{Uid: invite.Uid, Name: invite.Name, Avatar: invite.Avatar, Mount: info.Dfmount, Hp: mount.Hp} + member = &pb.DBRaceMember{Uid: invite.Uid, Name: invite.Name, Avatar: invite.Avatar, Lv: invite.Lv, Mount: info.Dfmount, Hp: mount.Hp} tean.Captainid = tean.Uid tean.State = pb.RaceTeamState_teaming tean.Member = append(tean.Member, member) if err = this.module.parkourComp.Change(session.GetUserId(), map[string]interface{}{ "captainid": tean.Captainid, + "state": tean.State, }); err != nil { code = pb.ErrorCode_DBError return diff --git a/modules/parkour/api_jointeam.go b/modules/parkour/api_jointeam.go index 672fb838c..daf9d08f7 100644 --- a/modules/parkour/api_jointeam.go +++ b/modules/parkour/api_jointeam.go @@ -52,17 +52,29 @@ func (this *apiComp) JoinTeam(session comm.IUserSession, req *pb.ParkourJoinTeam } users[i] = v.Uid } + if tean.Captainid == "" { + user := this.module.ModuleUser.GetUser(tean.Uid) + if mount, err = this.module.configure.getGameBuzkashiMount(tean.Dfmount); err != nil { + code = pb.ErrorCode_ConfigNoFound + return + } + member = &pb.DBRaceMember{Uid: session.GetUserId(), Name: user.Name, Avatar: user.Avatar, Lv: user.Lv, Mount: tean.Dfmount, Hp: mount.Hp} + tean.Captainid = tean.Uid + tean.State = pb.RaceTeamState_teaming + tean.Member = append(tean.Member, member) + users = append(users, tean.Uid) + } + users = append(users, session.GetUserId()) if mount, err = this.module.configure.getGameBuzkashiMount(info.Dfmount); err != nil { code = pb.ErrorCode_ConfigNoFound return } user := this.module.ModuleUser.GetUser(session.GetUserId()) - member = &pb.DBRaceMember{Uid: session.GetUserId(), Name: user.Name, Avatar: user.Avatar, Mount: info.Dfmount, Hp: mount.Hp} - tean.Captainid = tean.Uid - tean.State = pb.RaceTeamState_teaming + member = &pb.DBRaceMember{Uid: session.GetUserId(), Name: user.Name, Avatar: user.Avatar, Lv: user.Lv, Mount: info.Dfmount, Hp: mount.Hp} tean.Member = append(tean.Member, member) if err = this.module.parkourComp.Change(session.GetUserId(), map[string]interface{}{ + "state": tean.State, "captainid": tean.Captainid, }); err != nil { code = pb.ErrorCode_DBError diff --git a/modules/parkour/api_quitteam.go b/modules/parkour/api_quitteam.go index 1e3c49163..de8df4949 100644 --- a/modules/parkour/api_quitteam.go +++ b/modules/parkour/api_quitteam.go @@ -14,6 +14,7 @@ func (this *apiComp) QuitTeamCheck(session comm.IUserSession, req *pb.ParkourQui func (this *apiComp) QuitTeam(session comm.IUserSession, req *pb.ParkourQuitTeamReq) (code pb.ErrorCode, data *pb.ErrorData) { var ( tean *pb.DBParkour + ntean *pb.DBParkour member *pb.DBRaceMember users []string ok bool @@ -31,7 +32,7 @@ func (this *apiComp) QuitTeam(session comm.IUserSession, req *pb.ParkourQuitTeam tean.Member = append(tean.Member[0:i], tean.Member[i+1:]...) member = v ok = true - } else { + } else if !v.Isai { users = append(users, v.Uid) } } @@ -39,24 +40,71 @@ func (this *apiComp) QuitTeam(session comm.IUserSession, req *pb.ParkourQuitTeam code = pb.ErrorCode_ReqParameterError return } - if err = this.module.parkourComp.Change(session.GetUserId(), map[string]interface{}{ - "captainid": session.GetUserId(), - }); err != nil { - code = pb.ErrorCode_DBError - return - } - if err = this.module.parkourComp.Change(req.Captainid, map[string]interface{}{ - "member": tean.Member, - }); err != nil { - code = pb.ErrorCode_DBError - return - } + if req.Captainid == session.GetUserId() { //自己是队长 + if len(users) > 0 { + for i, v := range users { + if i == 0 { + if ntean, err = this.module.parkourComp.queryinfo(v); err != nil { + code = pb.ErrorCode_DBError + return + } else { + ntean.Captainid = users[0] + ntean.Member = tean.Member + if err = this.module.parkourComp.Change(v, map[string]interface{}{ + "captainid": v, + "member": tean.Member, + }); err != nil { + code = pb.ErrorCode_DBError + return + } + } + } else { + if err = this.module.parkourComp.Change(v, map[string]interface{}{ + "captainid": users[0], + }); err != nil { + code = pb.ErrorCode_DBError + return + } + } + } + this.module.SendMsgToUsers(string(this.module.GetType()), "teamchanage", + &pb.ParkourTeamChanagePush{Team: ntean}, users...) + } - this.module.SendMsgToUsers(string(this.module.GetType()), "teamquitnotice", - &pb.ParkourTeamQuitNoticePush{Member: member}, users...) + tean.Invite = make([]*pb.DBRaceInvite, 0) + tean.Member = make([]*pb.DBRaceMember, 0) + if err = this.module.parkourComp.Change(session.GetUserId(), map[string]interface{}{ + "state": pb.RaceTeamState_resting, + "captainid": "", + "invite": tean.Invite, + "member": tean.Member, + }); err != nil { + code = pb.ErrorCode_DBError + return + } - this.module.SendMsgToUsers(string(this.module.GetType()), "teamchanage", - &pb.ParkourTeamChanagePush{Team: tean}, users...) + } else { + if err = this.module.parkourComp.Change(session.GetUserId(), map[string]interface{}{ + "state": pb.RaceTeamState_resting, + "captainid": "", + }); err != nil { + code = pb.ErrorCode_DBError + return + } + if err = this.module.parkourComp.Change(req.Captainid, map[string]interface{}{ + "member": tean.Member, + }); err != nil { + code = pb.ErrorCode_DBError + return + } + if len(users) > 0 { + this.module.SendMsgToUsers(string(this.module.GetType()), "teamquitnotice", + &pb.ParkourTeamQuitNoticePush{Member: member}, users...) + + this.module.SendMsgToUsers(string(this.module.GetType()), "teamchanage", + &pb.ParkourTeamChanagePush{Team: tean}, users...) + } + } session.SendMsg(string(this.module.GetType()), "quitteam", &pb.ParkourQuitTeamResp{}) return diff --git a/modules/parkour/model_parkour.go b/modules/parkour/model_parkour.go index a2c23d63c..84cb820a5 100644 --- a/modules/parkour/model_parkour.go +++ b/modules/parkour/model_parkour.go @@ -151,7 +151,7 @@ func (this *ModelParkourComp) queryinfo(uid string) (result *pb.DBParkour, err e result = &pb.DBParkour{ Id: primitive.NewObjectID().Hex(), Uid: uid, - State: pb.RaceTeamState_teaming, + State: pb.RaceTeamState_resting, Mounts: make(map[string]int32), Invite: make([]*pb.DBRaceInvite, 0), Member: []*pb.DBRaceMember{}, @@ -187,7 +187,7 @@ func (this *ModelParkourComp) queryinfos(uids []string) (results []*pb.DBParkour temp := &pb.DBParkour{ Id: primitive.NewObjectID().Hex(), Uid: v, - State: pb.RaceTeamState_teaming, + State: pb.RaceTeamState_resting, Mounts: make(map[string]int32), Invite: make([]*pb.DBRaceInvite, 0), Member: []*pb.DBRaceMember{}, @@ -227,7 +227,7 @@ func (this *ModelParkourComp) addUserMounts(uid string, mounts map[string]int32) result = &pb.DBParkour{ Id: primitive.NewObjectID().Hex(), Uid: uid, - State: pb.RaceTeamState_teaming, + State: pb.RaceTeamState_resting, Invite: make([]*pb.DBRaceInvite, 0), Mounts: make(map[string]int32), Member: []*pb.DBRaceMember{}, diff --git a/modules/parkour/module.go b/modules/parkour/module.go index 7d53cd219..276af9215 100644 --- a/modules/parkour/module.go +++ b/modules/parkour/module.go @@ -392,11 +392,11 @@ func (this *Parkour) overtimer(task *timewheel.Task, args ...interface{}) { //用户离线处理 func (this *Parkour) useroffline(uid, sessionid string) { var ( - info *pb.DBParkour - + info *pb.DBParkour team *pb.DBParkour member *pb.DBRaceMember users []string + keep bool index int32 err error ) @@ -445,27 +445,29 @@ func (this *Parkour) useroffline(uid, sessionid string) { if v.Uid == uid { index = int32(i) member = v + keep = true continue } if v.Uid != uid && !v.Isai { users = append(users, v.Uid) } } - team.Member = append(team.Member[0:index], team.Member[index+1:]...) - if err = this.parkourComp.Change(team.Uid, map[string]interface{}{ - "member": team.Member, - }); err != nil { - this.Error("用户离线! 解散队伍处理", log.Field{Key: "uid", Value: team.Uid}, log.Field{Key: "err", Value: err.Error()}) - return - } - if len(users) > 0 { - this.SendMsgToUsers(string(this.GetType()), "teamquitnotice", - &pb.ParkourTeamQuitNoticePush{Member: member}, users...) + if keep { + team.Member = append(team.Member[0:index], team.Member[index+1:]...) + if err = this.parkourComp.Change(team.Uid, map[string]interface{}{ + "member": team.Member, + }); err != nil { + this.Error("用户离线! 解散队伍处理", log.Field{Key: "uid", Value: team.Uid}, log.Field{Key: "err", Value: err.Error()}) + return + } + if len(users) > 0 { + this.SendMsgToUsers(string(this.GetType()), "teamquitnotice", + &pb.ParkourTeamQuitNoticePush{Member: member}, users...) - this.SendMsgToUsers(string(this.GetType()), "teamchanage", - &pb.ParkourTeamChanagePush{Team: team}, users...) + this.SendMsgToUsers(string(this.GetType()), "teamchanage", + &pb.ParkourTeamChanagePush{Team: team}, users...) + } } - } } else if info.State == pb.RaceTeamState_matching { if info.Captainid == uid { diff --git a/modules/rtask/model_rtask.go b/modules/rtask/model_rtask.go index c5d7712bc..c26c7fcda 100644 --- a/modules/rtask/model_rtask.go +++ b/modules/rtask/model_rtask.go @@ -95,7 +95,7 @@ func (this *ModelRtask) checkCondi(uid string, condiId int32) (err error, ok boo cond, ok := this.moduleRtask.handleMap.Load(condiId) if !ok { rcs := this.moduleRtask.getHandle(comm.TaskType(conf.Type)) - for _, v:=range rcs { + for _, v := range rcs { if v.condId == condiId { cond = v } @@ -119,3 +119,7 @@ func (this *ModelRtask) checkCondi(uid string, condiId int32) (err error, ok boo return } + +func (this *ModelRtask) userlock(uid string) (result *redis.RedisMutex, err error) { + return this.DBModel.Redis.NewRedisMutex(fmt.Sprintf("ulocktask:%s", uid)) +} diff --git a/modules/rtask/module.go b/modules/rtask/module.go index a6b13983e..b9b9e5534 100644 --- a/modules/rtask/module.go +++ b/modules/rtask/module.go @@ -357,6 +357,12 @@ func (this *ModuleRtask) TriggerTask(uid string, taskParams ...*comm.TaskParam) return } + lock, _ := this.modelRtask.userlock(uid) + err := lock.Lock() + if err != nil { + this.Error("TriggerTask userlock err!", log.Field{Key: "err", Value: err.Error()}) + } + defer lock.Unlock() for _, tp := range taskParams { if code := this.processOneTask(session, tp.TT, tp.Params...); code != pb.ErrorCode_Success { @@ -364,7 +370,6 @@ func (this *ModuleRtask) TriggerTask(uid string, taskParams ...*comm.TaskParam) session.Push() comm.PuttaskParam(tp) } - this.PutUserSession(session) return }