| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 |
- 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) {
- if req.Value < 1 {
- p.ResponseCode(session, code.IllegalArgument)
- return
- }
- playerData := redis.Game.GetPlayerData(req.Value, 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(p.playerID)
- 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 ok := data.Const.CheckPlayerNameLen(newPlayerName); !ok {
- 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)
- }
|