package player import ( "f1-game/internal/code" "f1-game/internal/component/redis" "f1-game/internal/data" "f1-game/internal/enum" "f1-game/internal/event" nameEvent "f1-game/internal/name/event" nameLocal "f1-game/internal/name/local" nameRedis "f1-game/internal/name/redis" "f1-game/internal/pb" "f1-game/nodes/game/internal/db" dbPlayer "f1-game/nodes/game/internal/db/data/player" "f1-game/nodes/game/player/asset" ao "f1-game/nodes/game/player/asset/origin" "f1-game/nodes/game/player/lord" gameMap "f1-game/nodes/game/player/map" "strings" ctime "github.com/cherry-game/cherry/extend/time" cfacade "github.com/cherry-game/cherry/facade" cproto "github.com/cherry-game/cherry/net/proto" ) func (p *actorPlayer) initLord() { p.Local().Register(nameLocal.Player_LordInfo, p.lordInfo) p.Local().Register(nameLocal.Player_LordChangeName, p.lordChangeName) p.Local().Register(nameLocal.Player_LordChangeIcon, p.lordChangeIcon) p.Local().Register(nameLocal.Player_LordChangeFrame, p.lordChangeFrame) p.Local().Register(nameLocal.Player_LordChangeBg, p.lordChangeBg) p.Local().Register(nameLocal.Player_LordChangeDesc, p.lordChangeDesc) p.Local().Register(nameLocal.Player_LordShowActive, p.lordShowActive) p.Local().Register(nameLocal.Player_LordShowView, p.lordShowView) p.Local().Register(nameLocal.Player_LordLangSelect, p.lordLangSelect) p.Local().Register(nameLocal.Player_LordShowDataSet, p.lordShowDataSet) p.EventRegister(nameEvent.Hero_Get, p.activeHeroShow) p.EventRegister(nameEvent.Hero_Star, p.heroStarRefreshPrestige) p.EventRegister(nameEvent.Player_Reset, p.onPlayerDataSync) } // 获取领主信息 func (p *actorPlayer) lordInfo(session *cproto.Session, req *pb.I64) { targetPlayerID := req.Value if targetPlayerID < 1 { p.ResponseCode(session, code.IllegalArgument) return } playerData := redis.Game.GetPlayerData(targetPlayerID, nameRedis.PlayerDetailFields...) if playerData == nil { p.ResponseCode(session, code.PlayerDetailNotFound) return } // 玩家声望信息 prestige := &pb.PrestigeDetail{ CurPrestige: playerData.Prestige, } // 转换 rsp := &pb.LordDetail{ PlayerID: playerData.PlayerID, PlayerName: playerData.PlayerName, IconID: playerData.IconID, FrameID: playerData.FrameID, BgID: playerData.BgID, Desc: playerData.Desc, MapNodeID: playerData.MapNodeID, TotalLoginDays: playerData.TotalLoginDays, Prestige: prestige, Point: &pb.Point{X: playerData.X, Y: playerData.Y}, } // 玩家数据展示 showDatas := redis.Game.GetPlayerSetting(targetPlayerID) if showDatas != nil { rsp.ShowDatas = showDatas } // 获取联盟信息 rsp.League = &pb.LeaguePlayerJob{ LeagueID: playerData.LeagueID, LeagueName: playerData.LeagueName, LeagueAbbName: playerData.LeagueAbbName, JobID: playerData.LeagueJob, } p.Response(session, rsp) } // 修改领主名称 func (p *actorPlayer) lordChangeName(session *cproto.Session, req *pb.Str) { var ( playerTable = p.PlayerTable() newPlayerName = strings.TrimSpace(req.Value) curTime = ctime.Now().ToSecond() ) // 名字相同 if playerTable.Lord.Name == newPlayerName { p.ResponseCode(session, code.PlayerNameSame) return } // 长度不符 if !data.Const.CheckPlayerNameLen(newPlayerName) { p.ResponseCode(session, code.PlayerNameLimit) return } // 判断名称是否存在 _, exist := db.PlayerNameIsExist(newPlayerName) if exist { p.ResponseCode(session, code.PlayerNameExist) return } // 改名冷却中 if curTime < playerTable.Lord.LastChangeNameTime+data.Const.PlayerChangeNameCD { p.ResponseCode(session, code.PlayerChangeNameCD) return } // 首次免费 if playerTable.Lord.ChangeNameCount > 0 { // 判断消耗 _, errCode := asset.Service().Subs(p.playerID, data.Const.PlayerChangeNameCost, ao.PlayerChangeNameCost) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } } playerTable.UpdatePlayerName(newPlayerName, curTime) playerTable.Save2Queue() redis.Game.UpdatePlayerDataField(playerTable.PlayerID, nameRedis.Player_PlayerName, newPlayerName) p.Response(session, &pb.I64Str{Key: curTime, Value: newPlayerName}) // 同步到地图 gameMap.Service().SyncMapPlayer(p.playerID) } // 修改领主头像 func (p *actorPlayer) lordChangeIcon(session *cproto.Session, req *pb.I32) { var ( playerTable = p.PlayerTable() showID = req.Value ) lordShowRow, found := data.LordShow.GetByShowID(showID) if !found { p.ResponseCode(session, code.ShowConfigNotExist) return } if lordShowRow.Type != enum.ShowType_Icon { p.ResponseCode(session, code.ShowTypeError) return } // 判断是否解锁 show, found := playerTable.Shows.GetShow(showID) if !found { p.ResponseCode(session, code.ShowNotUnlock) return } if show.ExpireTime != 0 && show.ExpireTime <= ctime.Now().ToSecond() { p.ResponseCode(session, code.ShowExpire) return } if !show.IsViewed { show.IsViewed = true } playerTable.Lord.IconID = showID playerTable.Save2Queue() redis.Game.UpdatePlayerDataField(playerTable.PlayerID, nameRedis.Player_IconID, showID) resp := &pb.I32{Value: showID} p.Response(session, resp) // 同步到地图 gameMap.Service().SyncMapPlayer(p.playerID) } // 修改领主头像框 func (p *actorPlayer) lordChangeFrame(session *cproto.Session, req *pb.I32) { var ( playerTable = p.PlayerTable() showID = req.Value ) lordShowRow, found := data.LordShow.GetByShowID(showID) if !found { p.ResponseCode(session, code.ShowConfigNotExist) return } if lordShowRow.Type != enum.ShowType_Frame { p.ResponseCode(session, code.ShowTypeError) return } // 判断是否解锁 show, found := playerTable.Shows.GetShow(showID) if !found { p.ResponseCode(session, code.ShowNotUnlock) return } if show.ExpireTime != 0 && show.ExpireTime <= ctime.Now().ToSecond() { p.ResponseCode(session, code.ShowExpire) return } playerTable.Lord.FrameID = showID playerTable.Save2Queue() redis.Game.UpdatePlayerDataField(playerTable.PlayerID, nameRedis.Player_FrameID, showID) resp := &pb.I32{Value: showID} p.Response(session, resp) // 同步到地图 gameMap.Service().SyncMapPlayer(p.playerID) } // 修改领主主页背景 func (p *actorPlayer) lordChangeBg(session *cproto.Session, req *pb.I32) { var ( playerTable = p.PlayerTable() showID = req.Value ) lordShowRow, found := data.LordShow.GetByShowID(showID) if !found { p.ResponseCode(session, code.ShowConfigNotExist) return } if lordShowRow.Type != enum.ShowType_Bg { p.ResponseCode(session, code.ShowTypeError) return } // 判断是否解锁 show, found := playerTable.Shows.GetShow(showID) if !found { p.ResponseCode(session, code.ShowNotUnlock) return } if show.ExpireTime != 0 && show.ExpireTime <= ctime.Now().ToSecond() { p.ResponseCode(session, code.ShowExpire) return } playerTable.Lord.BgID = showID playerTable.Save2Queue() redis.Game.UpdatePlayerDataField(playerTable.PlayerID, nameRedis.Player_BgID, showID) resp := &pb.I32{Value: showID} p.Response(session, resp) } // 修改领主主页简介 func (p *actorPlayer) lordChangeDesc(session *cproto.Session, req *pb.Str) { var ( playerTable = p.PlayerTable() desc = strings.TrimSpace(req.Value) ) // 判断是否超过限制 if data.Const.CheckPlayerDescLen(desc) { p.ResponseCode(session, code.PlayerDescLenLimit) return } if playerTable.Lord.Desc != desc { playerTable.Lord.Desc = desc playerTable.Save2Queue() // 更新到redis redis.Game.UpdatePlayerDataField(playerTable.PlayerID, nameRedis.Player_Desc, desc) } resp := &pb.Str{Value: desc} p.Response(session, resp) } // 外显激活 func (p *actorPlayer) lordShowActive(session *cproto.Session, req *pb.I32) { var ( playerTable = p.PlayerTable() showID = req.Value ) lordShowRow, found := data.LordShow.GetByShowID(showID) if !found { p.ResponseCode(session, code.ShowConfigNotExist) return } show, found := playerTable.Shows.GetShow(showID) if found && show.ExpireTime <= 0 { p.ResponseCode(session, code.ShowAlreadyActive) return } // 英雄都是自动激活 if lordShowRow.ActiveCondition.Key == enum.Hero_Active { p.ResponseCode(session, code.ShowActiveTypeError) return } _, errCode := asset.Service().Sub(p.playerID, lordShowRow.ActiveCondition.Value, 1, ao.ShowActiveCost) if code.IsFail(errCode) { p.ResponseCode(session, errCode) return } // 激活外显 playerTable.Shows.ActiveShow(showID, lordShowRow.ExpireTime) playerTable.Save2Queue() p.Response(session, show.ToProto(showID)) } // 查看外显 消除红点 func (p *actorPlayer) lordShowView(session *cproto.Session, req *pb.I32) { var ( playerTable = p.PlayerTable() showID = req.Value ) show, found := playerTable.Shows.GetShow(showID) if !found { p.ResponseCode(session, code.ShowNotUnlock) return } if !show.IsViewed { show.IsViewed = true playerTable.Save2Queue() } p.ResponseCode(session, code.OK) } // 语言设置 func (p *actorPlayer) lordLangSelect(session *cproto.Session, req *pb.Str) { var ( playerTable = p.PlayerTable() lang = req.Value ) if playerTable.Settings.Language != lang { _, found := enum.ParseLanguage(lang) if !found { p.ResponseCode(session, code.LanguageNotExist) return } playerTable.Settings.Language = lang playerTable.Save2Queue() } resp := &pb.Str{Value: playerTable.Settings.Language} p.Response(session, resp) } func (p *actorPlayer) lordShowDataSet(session *cproto.Session, req *pb.LordShowDataList) { var ( playerTable = p.PlayerTable() showList = req.Datas ) if len(showList) != len(enum.AllShowDataTypes) { p.ResponseCode(session, code.ShowDataLenNoSame) return } var ( showDatas = []*dbPlayer.ShowData{} showCount = 0 ) for _, show := range showList { showType := show.ShowType showDataType, found := enum.CheckShowDataTypeExist(showType) if !found { p.ResponseCode(session, code.ShowDataTypeNotExist) return } if show.IsShow { showCount++ if showCount > data.Const.PlayerShowDataCount { p.ResponseCode(session, code.ShowDataCountLimit) return } } showData := &dbPlayer.ShowData{ ShowType: showDataType, IsShow: show.IsShow, } showDatas = append(showDatas, showData) } playerTable.Settings.ShowDatas = showDatas playerTable.Save2Queue() // 缓存到redis上 redis.Game.UpdatePlayerSetting(playerTable.PlayerID, req) p.Response(session, req) } // 获得英雄判断激活外显 func (p *actorPlayer) activeHeroShow(e cfacade.IEventData) { evt, ok := e.(*event.HeroGet) if !ok || evt.Heroes().Len() < 1 { return } var ( playerTable = p.PlayerTable() heroes = evt.Heroes() updateList = []int32{} ) for _, hero := range heroes { row, found := data.LordShow.GetHeroShow(hero.ID) if !found { continue } show, found := playerTable.Shows.GetShow(row.ShowID) // 已激活且当前为永久 if found && show.ExpireTime <= 0 { continue } // 激活外显 playerTable.Shows.ActiveShow(row.ShowID, row.ExpireTime) updateList = append(updateList, row.ShowID) } if len(updateList) > 0 { playerTable.Save2Queue() // 推送英雄变更 lord.Service().ChangePush(p.playerID, updateList...) } } // 英雄升星刷新声望 func (p *actorPlayer) heroStarRefreshPrestige(e cfacade.IEventData) { // 刷新英雄声望 lord.Service().UpdatePrestige(p.playerID) } // 跨天同步玩家信息 func (p *actorPlayer) onPlayerDataSync(c cfacade.IEventData) { _, ok := c.(*event.PlayerReset) if !ok { return } var ( playerTable = p.PlayerTable() fields = map[string]any{} ) fields[nameRedis.Player_TotalLoginDays] = playerTable.Stats.TotalLoginDays redis.Game.SavePlayerDataFields(p.playerID, fields) }