| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 |
- package player
- import (
- "f1-game/internal/code"
- "f1-game/internal/constant"
- "f1-game/internal/data"
- nameLocal "f1-game/internal/name/local"
- "f1-game/internal/pb"
- "f1-game/nodes/game/player/lineup"
- cproto "github.com/cherry-game/cherry/net/proto"
- )
- func (p *actorPlayer) initLineup() {
- p.Local().Register(nameLocal.Player_LineupUp, p.lineupUp)
- p.Local().Register(nameLocal.Player_LineupLeave, p.lineupLeave)
- p.Local().Register(nameLocal.Player_LineupChange, p.lineupChange)
- p.Local().Register(nameLocal.Player_LineupAdjust, p.lineupAdjust)
- }
- // lineupUp 阵容英雄上阵
- func (p *actorPlayer) lineupUp(session *cproto.Session, req *pb.LineupUpRequest) {
- var (
- heroTable = p.HeroTable()
- teamTable = p.TeamTable()
- heroGUID = req.HeroGUID
- lineupType = req.LineupType
- lineupID = req.LineupID
- index = req.Index
- )
- if !constant.CheckLineupTypeValid(lineupType) {
- p.ResponseCode(session, code.TeamLineupTypeError)
- return
- }
- // 检测上阵位置是否正确
- if !constant.ValidateLineupMemberIndex(index) {
- p.ResponseCode(session, code.TeamIndexError)
- return
- }
- // 判断当前英雄是否已上阵
- if exist := teamTable.LineupMap.CheckHeroAlreadyUp(heroGUID); exist {
- p.ResponseCode(session, code.TeamHeroAlreadyUp)
- return
- }
- heroEntity, ok := heroTable.Heroes.Get(heroGUID)
- if !ok {
- p.ResponseCode(session, code.HeroNotExist)
- return
- }
- if _, ok = data.HeroTeam.Get(lineupID); !ok {
- p.ResponseCode(session, code.ConfigNotFound_HeroTeam)
- return
- }
- lineups, found := teamTable.LineupMap.GetLineups(lineupType)
- if !found {
- p.Warn("[lineupUp] lineupType not found %d", lineupType)
- p.ResponseCode(session, code.TeamLineupNotUnlock)
- return
- }
- // 检测是否上阵相同英雄
- if same := lineup.Service().CheckLineupSameHero(heroTable, lineups, 0, 0, lineupID, index, heroEntity.HeroID); same {
- p.ResponseCode(session, code.TeamAlreadySameHero)
- return
- }
- // 获取阵容数据
- curLineup, found := lineups.GetLineup(lineupID)
- if !found {
- p.ResponseCode(session, code.TeamNotUnlock)
- return
- }
- // 获取上阵英雄数据
- lineupMember, found := curLineup.GetLineupMember(index)
- if !found {
- // 上阵人数已达上限
- if lineup.Service().CheckLineupMemberLimit(p.playerID, curLineup, index) {
- p.ResponseCode(session, code.TeamMemberLimit)
- return
- }
- curLineup.AddLineupMember(index, heroGUID)
- } else {
- lineupMember.HeroGUID = heroGUID
- }
- teamTable.Save2Queue()
- // 更新阵容羁绊列表
- lineup.Service().UpdateLineupFetterList(p.playerID, heroTable, curLineup)
- proto := curLineup.ToProto()
- resp := &pb.LineupInfo{
- LineupType: lineupType,
- Lineup: &proto,
- }
- p.Response(session, resp)
- }
- // lineupLeave 阵容英雄下阵
- func (p *actorPlayer) lineupLeave(session *cproto.Session, req *pb.LineupLeaveRequest) {
- var (
- teamTable = p.TeamTable()
- lineupType = req.LineupType
- lineupID = req.LineupID
- index = req.Index
- )
- lineups, found := teamTable.LineupMap.GetLineups(lineupType)
- if !found {
- p.ResponseCode(session, code.TeamLineupTypeError)
- return
- }
- curLineup, found := lineups.GetLineup(lineupID)
- if !found {
- p.ResponseCode(session, code.TeamNotUnlock)
- return
- }
- if !curLineup.DelLineupMember(index) {
- p.ResponseCode(session, code.HeroNotInTeam)
- return
- }
- teamTable.Save2Queue()
- // 更新阵容羁绊列表
- lineup.Service().UpdateLineupFetterList(p.playerID, p.HeroTable(), curLineup)
- proto := curLineup.ToProto()
- resp := &pb.LineupInfo{
- LineupType: lineupType,
- Lineup: &proto,
- }
- p.Response(session, resp)
- }
- // lineupChange 阵容英雄换阵
- func (p *actorPlayer) lineupChange(session *cproto.Session, req *pb.LineupChangeRequest) {
- var (
- heroTable = p.HeroTable()
- teamTable = p.TeamTable()
- lineupType = req.LineupType
- srcLineupID = req.SrcLineupID
- dstLineupID = req.DstLineupID
- srcIndex = req.SrcIndex
- dstIndex = req.DstIndex
- )
- if srcLineupID == dstLineupID && srcIndex == dstIndex {
- p.ResponseCode(session, code.TeamIndexNotChange)
- return
- }
- //判断队伍索引是否合法
- if !constant.ValidateLineupMemberIndex(srcIndex, dstIndex) {
- p.ResponseCode(session, code.TeamIndexError)
- return
- }
- lineups, found := teamTable.LineupMap.GetLineups(lineupType)
- if !found {
- p.ResponseCode(session, code.TeamLineupTypeError)
- return
- }
- srcLineup, found := lineups.GetLineup(srcLineupID)
- if !found {
- p.ResponseCode(session, code.TeamNotUnlock)
- return
- }
- srcLineupMember, ok := srcLineup.GetLineupMember(srcIndex)
- if !ok || srcLineupMember.HeroGUID == 0 {
- p.ResponseCode(session, code.HeroNotInTeam)
- return
- }
- srcHero, ok := heroTable.Heroes.Get(srcLineupMember.HeroGUID)
- if !ok {
- p.ResponseCode(session, code.HeroNotExist)
- return
- }
- dstLineup, ok := lineups.GetLineup(dstLineupID)
- if !ok {
- p.ResponseCode(session, code.TeamNotUnlock)
- return
- }
- //不同队伍 检测是否上阵相同英雄
- if srcLineupID != dstLineupID &&
- lineup.Service().CheckLineupSameHero(heroTable, lineups, srcLineupID, srcIndex, dstLineupID, dstIndex, srcHero.HeroID) {
- p.ResponseCode(session, code.TeamAlreadySameHero)
- return
- }
- // 被替换位置检测英雄下阵
- dstLineupMember, found := dstLineup.GetLineupMember(dstIndex)
- if found {
- dstLineupMember.HeroGUID = srcLineupMember.HeroGUID
- } else {
- // 上阵人数已达上限
- if lineup.Service().CheckLineupMemberLimit(p.playerID, dstLineup, dstIndex) {
- p.ResponseCode(session, code.TeamMemberLimit)
- return
- }
- dstLineup.AddLineupMember(dstIndex, srcLineupMember.HeroGUID)
- }
- // 原阵容英雄下阵
- srcLineup.DelLineupMember(srcIndex)
- teamTable.Save2Queue()
- // 更新阵容羁绊列表
- lineup.Service().UpdateLineupFetterList(p.playerID, heroTable, srcLineup, dstLineup)
- // 同步给客户端
- lineup.Service().LineupChangePush(p.playerID, lineupType, srcLineupID, dstLineupID)
- p.ResponseCode(session, code.OK)
- }
- // lineupTune 阵容英雄阵容设置
- func (p *actorPlayer) lineupAdjust(session *cproto.Session, req *pb.LineupAdjustRequest) {
- var (
- teamTable = p.TeamTable()
- lineupType = req.LineupType
- lineupID = req.LineupID
- index = req.Index
- toIndex = req.ToIndex
- )
- //检测部队位置是否合法
- if !constant.ValidateLineupMemberIndex(index, toIndex) {
- p.ResponseCode(session, code.TeamIndexError)
- return
- }
- // 获取阵容类型下的阵容列表
- lineups, found := teamTable.LineupMap.GetLineups(lineupType)
- if !found {
- p.ResponseCode(session, code.TeamLineupTypeError)
- return
- }
- // 获取阵容信息
- lineup, found := lineups.GetLineup(lineupID)
- if !found {
- p.ResponseCode(session, code.TeamNotUnlock)
- return
- }
- // 获取阵容成员信息
- fromLineupMember, found := lineup.GetLineupMember(index)
- if !found || fromLineupMember.HeroGUID == 0 {
- p.ResponseCode(session, code.HeroNotInTeam)
- return
- }
- if fromLineupMember.Index != toIndex {
- //获取交换对象 如果原来位置存在英雄 则交换阵容位置 否则直接修改位置
- toLineupMember, found := lineup.GetLineupMember(toIndex)
- if found {
- //交换
- fromLineupMember.Index, toLineupMember.Index = toLineupMember.Index, fromLineupMember.Index
- } else {
- fromLineupMember.Index = toIndex
- }
- teamTable.Save2Queue()
- }
- proto := lineup.ToProto()
- resp := &pb.LineupInfo{
- LineupType: lineupType,
- Lineup: &proto,
- }
- p.Response(session, resp)
- }
|