From d0d6f28bee730ee64bf46adffa4f768d6af6ac0c Mon Sep 17 00:00:00 2001 From: hxp <ale99527@vip.qq.com> Date: 星期四, 19 九月 2024 10:56:34 +0800 Subject: [PATCH] 10267 【越南】【英文】【砍树】仙官新增膜拜 --- ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py | 185 +++++++++++++++++++++------------------------ 1 files changed, 87 insertions(+), 98 deletions(-) diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py index 433b35b..1924699 100644 --- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py +++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorship.py @@ -20,12 +20,12 @@ import NetPackCommon import PlayerControl import ChPyNetSendPack -import CrossChampionship import PlayerViewCache import PlayerRecData import CrossRealmMsg import IpyGameDataPY import GameWorld +import ChConfig import random import time @@ -38,33 +38,30 @@ def SetWorshipValue(recData, worshipValue): recData.SetValue2(worshipValue) def GetWorshipDays(recData): return recData.GetValue3() # 持续天数: 0永久,>0-天数 def SetWorshipDays(recData, days): recData.SetValue3(days) -def GetWorshipZoneID(recData): return recData.GetValue4() # 膜拜分区,跨服膜拜类型有用 -def SetWorshipZoneID(recData, zoneID): recData.SetValue4(zoneID) -def GetModelShowInfo(recData): return recData.GetEvalUserData({}) # 模型外观显示信息,备用,缓存没有时取这里 -def SetModelShowInfo(recData, modelShow): return recData.SetEvalUserData(modelShow) -def GetPlayerModelShow(playerID): - ## 获取膜拜对象的外观显示信息 - 本服跨服通用 - cacheDict = PlayerViewCache.GetCachePropDataDict(PlayerViewCache.FindViewCache(playerID)) - if not cacheDict: - return {} - modelShow = { - "Name":cacheDict.get("Name", ""), - "AccID":cacheDict.get("AccID", ""), - "LV":cacheDict.get("LV", 0), - "RealmLV":cacheDict.get("RealmLV", 0), - "Job":cacheDict.get("Job", 0), - "VIPLV":cacheDict.get("VIPLV", 0), - "TitleID":cacheDict.get("TitleID", 0), - "FightPower":cacheDict.get("FightPower", 0), - "EquipShowSwitch":cacheDict.get("EquipShowSwitch", 0), - "EquipShowID":cacheDict.get("EquipShowID", []), - } - return modelShow # 玩家每日膜拜记录 RecType = ShareDefine.Def_PlayerRecType_WorshipDaily -def GetTodayWorshipRecord(recData): return recData.GetEvalUserData({}) # 今日已膜拜记录 {tagPlayerID:[[膜拜类型, 膜拜值], ...], ...} - +# 今日已膜拜记录 {tagPlayerID:[[膜拜类型, 膜拜值], ...], ...} +# 今日是否已膜拜过该玩家某个膜拜 +def HasWorshipRecordToday(recData, tagPlayerID, worshipType, worshipValue): + worshipRecordList = recData.GetUserDataByKey(tagPlayerID, []) + if not worshipRecordList: + return False + return [worshipType, worshipValue] in worshipRecordList +# 设置今日已膜拜过该玩家某个膜拜 +def SetWorshipRecordToday(recData, tagPlayerID, worshipType, worshipValue): + worshipRecordList = recData.GetUserDataByKey(tagPlayerID, []) + recordInfo = [worshipType, worshipValue] + if recordInfo not in worshipRecordList: + worshipRecordList.append(recordInfo) + recData.SetUserDataByKey(tagPlayerID, worshipRecordList) + return ##-------------------------------------------------------------------------------------------------- +def OnServerStart(): + return + +def GetPlayerViewInfo(playerID): + ## 获取膜拜对象的外观显示信息 - 本服跨服通用 + return PlayerViewCache.GetShotCacheDict(playerID, "AccID", "VIPLV", "FightPower", "Model") def OnPlayerLogin(curPlayer): @@ -136,9 +133,9 @@ def __UpdWorshipByDay(isCrossServer, worshipList, recData): ## 过天更新未过期膜拜信息 playerID = recData.GetPlayerID() - modelShow = GetPlayerModelShow(playerID) - if modelShow: - SetModelShowInfo(recData, modelShow) + playerInfo = GetPlayerViewInfo(playerID) + if playerInfo: + recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo) if isCrossServer: worshipList.append(recData.GetString()) @@ -153,14 +150,8 @@ return True return False -def GetWorshipIpyData(worshipType, worshipValue): - ## 获取膜拜配置数据 - ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Worship", worshipType, worshipValue) - return ipyData - -def AddWorshipPlayer(playerID, worshipType, worshipValue, days=None, zoneID=0, isNotify=True): +def AddWorshipPlayer(worshipType, worshipValue, playerID, serverIDList, syncList=None, days=None): ## 添加膜拜玩家,本服跨服通用 - # @param isNotify: 本服-是否通知玩家;跨服-是否通知子服 if worshipType in ShareDefine.Def_WorshipTypeCross: if not GameWorld.IsCrossServer(): @@ -171,7 +162,7 @@ GameWorld.ErrLog("跨服服务器不允许添加非跨服膜拜! worshipType=%s" % (worshipType)) return - ipyData = IpyGameDataPY.GetIpyGameData("Worship", worshipType, worshipValue) + ipyData = IpyGameDataPY.GetIpyGameDataNotLog("Worship", worshipType, worshipValue) if not ipyData: return @@ -181,23 +172,41 @@ playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() recData = playerRecMgr.GetPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID, [worshipType, worshipValue]) if not recData: - GameWorld.Log("添加膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,zoneID=%s" % (playerID, worshipType, worshipValue, days, zoneID)) + GameWorld.Log("添加膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,%s" % (playerID, worshipType, worshipValue, days, serverIDList)) recData = playerRecMgr.AddPlayerRecData(ShareDefine.Def_PlayerRecType_WorshipPlayer, playerID) else: - GameWorld.Log("更新膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,zoneID=%s" % (playerID, worshipType, worshipValue, days, zoneID)) + GameWorld.Log("更新膜拜数据: playerID=%s,worshipType=%s,worshipValue=%s,days=%s,%s" % (playerID, worshipType, worshipValue, days, serverIDList)) + recData.SetTime(int(time.time())) SetWorshipType(recData, worshipType) SetWorshipValue(recData, worshipValue) SetWorshipDays(recData, days) - SetModelShowInfo(recData, GetPlayerModelShow(playerID)) - SetWorshipZoneID(recData, zoneID) - if isNotify: - if GameWorld.IsCrossServer(): - SyncAddCrossWorship([recData]) - else: - Sync_UnWorshipInfo(None, [recData]) - + playerInfo = GetPlayerViewInfo(playerID) + serverID = GameWorld.GetAccIDServerID(playerInfo.get("AccID", "")) + saveServerIDList = [] + serverIDList # 重新创建一份存储,不改变传入值 + # 确保玩家自身一定能看到自己,跨服排位赛历史分区问题 + if saveServerIDList and serverID and not GameWorld.CheckServerIDInList(serverID, saveServerIDList): + saveServerIDList.append(serverID) + recData.SetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList, saveServerIDList) # 保存当下的区服ID范围 + recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo) # 保存当下的玩家基本信息 + + if isinstance(syncList, list): + syncList.append(recData) + else: + SendNewWorshipPlayer([recData]) + return recData + +def SendNewWorshipPlayer(syncList): + ## 同步新膜拜数据 + if not syncList: + return + if GameWorld.IsCrossServer(): + SyncAddCrossWorship(syncList) + else: + Sync_UnWorshipInfo(None, syncList) + return + def DelWorshipPlayer(worshipType, worshipValue=None, delPlayerID=None): ## 删除膜拜玩家,本服跨服通用 @@ -259,7 +268,9 @@ GameWorld.DebugLog("膜拜: tagPlayerID=%s,worshipType=%s,worshipValue=%s,moneyType=%s,moneyValue=%s" % (tagPlayerID, worshipType, worshipValue, moneyType, moneyValue), playerID) - __AddWorshipRecord(playerID, recData) + playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() + worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID) + SetWorshipRecordToday(worshipRecData, tagPlayerID, worshipType, worshipValue) __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, 0, moneyType, moneyValue) # 同步地图发放货币 @@ -270,63 +281,37 @@ ## 检查玩家是否可膜拜该对象 playerID = curPlayer.GetPlayerID() recPlayerID = recData.GetPlayerID() - if playerID == recPlayerID: - GameWorld.DebugLog("不能膜拜自己!", playerID) - return - modelShow = GetModelShowInfo(recData) - if not modelShow: + playerInfo = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, {}) + if not playerInfo: GameWorld.DebugLog("没有外观展示的不同步! recPlayerID=%s" % recPlayerID, playerID) return - accID = modelShow.get("AccID", "") + accID = playerInfo.get("AccID", "") if not accID: return + serverID = GameWorld.GetAccIDServerID(accID) + playerServerID = GameWorld.GetPlayerServerID(curPlayer) + worshipType = GetWorshipType(recData) worshipValue = GetWorshipValue(recData) - zoneID = GetWorshipZoneID(recData) if worshipType == ShareDefine.Def_WorshipType_ServerNaming: #只同步给同ServerID的 - serverID = GameWorld.GetAccIDServerID(accID) - playerServerID = GameWorld.GetPlayerServerID(curPlayer) if serverID != playerServerID: GameWorld.DebugLog("只同步给同ServerID的! recPlayerID=%s,accID=%s,serverID=%s != playerServerID=%s" % (recPlayerID, accID, serverID, playerServerID), playerID) return - elif worshipType == ShareDefine.Def_WorshipType_CrossChampionship: - #只同步给同分区的 - playerZoneID = CrossChampionship.GetChampionshipMgr().GetPlayerOfficialZoneID(playerID) - if playerZoneID != zoneID: - GameWorld.DebugLog("只同步给同分区的! recPlayerID=%s,zoneID=%s != playerZoneID=%s" % (recPlayerID, zoneID, playerZoneID), playerID) + else: + serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList) + if not GameWorld.CheckServerIDInList(playerServerID, serverIDList): + GameWorld.DebugLog("该玩家不能膜拜目标玩家! playerServerID=%s not in %s" % (playerServerID, serverIDList), playerID) return playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID) - worshipRecordDict = GetTodayWorshipRecord(worshipRecData) - if recPlayerID in worshipRecordDict and [worshipType, worshipValue] in worshipRecordDict[recPlayerID]: - GameWorld.DebugLog("已膜拜过! recPlayerID=%s,worshipType=%s, worshipValue=%s,worshipRecordDict=%s" - % (recPlayerID, worshipType, worshipValue, worshipRecordDict), playerID) + if HasWorshipRecordToday(worshipRecData, recPlayerID, worshipType, worshipValue): + GameWorld.DebugLog("今日已膜拜过! recPlayerID=%s,worshipType=%s, worshipValue=%s" % (recPlayerID, worshipType, worshipValue), playerID) return return True - -def __AddWorshipRecord(playerID, recData): - ## 添加玩家膜拜目标记录 - playerRecMgr = PyDataManager.GetDBPlayerRecDataManager() - worshipRecData = playerRecMgr.GetPlayerRecDataFirst(ShareDefine.Def_PlayerRecType_WorshipDaily, playerID) - worshipRecordDict = GetTodayWorshipRecord(worshipRecData) - - tagPlayerID = recData.GetPlayerID() - worshipType = GetWorshipType(recData) - worshipValue = GetWorshipValue(recData) - recordInfo = [worshipType, worshipValue] - - if tagPlayerID not in worshipRecordDict: - worshipRecordDict[tagPlayerID] = [] - worshipRecordList = worshipRecordDict[tagPlayerID] - if recordInfo not in worshipRecordList: - worshipRecordList.append(recordInfo) - - #GameWorld.DebugLog("更新今日膜拜记录: %s" % GetTodayWorshipRecord(worshipRecData), playerID) - return def __SyncWorshipResult(curPlayer, tagPlayerID, worshipType, worshipValue, result, moneyType=0, moneyValue=0): ## 同步膜拜结果 @@ -372,13 +357,15 @@ playerID = recData.GetPlayerID() # 如果存在本服的最新外观数据则已本服的为准 - modelShow = GetPlayerModelShow(playerID) - if modelShow: - SetModelShowInfo(recData, modelShow) + playerInfo = GetPlayerViewInfo(playerID) + if playerInfo: + recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo) sysnList.append(recData) - GameWorld.Log(" 更新跨服膜拜: worshipType=%s,zoneID=%s,playerID=%s,worshipValue=%s,days=%s" - % (GetWorshipType(recData), GetWorshipZoneID(recData), playerID, GetWorshipValue(recData), GetWorshipDays(recData))) + + serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList) + GameWorld.Log(" 更新跨服膜拜: worshipType=%s,worshipValue=%s,playerID=%s,days=%s,%s" + % (GetWorshipType(recData), GetWorshipValue(recData), playerID, GetWorshipDays(recData), serverIDList)) #更新数据的可不同步,每个人的膜拜记录都不一样,由登录触发及添加新膜拜触发即可 #Sync_UnWorshipInfo(None, sysnList) @@ -409,8 +396,10 @@ recData = playerRecMgr.AddPlayerRecDataByDict(attrDict) sysnList.append(recData) - GameWorld.Log(" 添加跨服膜拜: worshipType=%s,zoneID=%s,playerID=%s,worshipValue=%s,days=%s" - % (GetWorshipType(recData), GetWorshipZoneID(recData), playerID, GetWorshipValue(recData), GetWorshipDays(recData))) + + serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList) + GameWorld.Log(" 添加跨服膜拜: worshipType=%s,worshipValue=%s,playerID=%s,days=%s,%s" + % (GetWorshipType(recData), GetWorshipValue(recData), playerID, GetWorshipDays(recData), serverIDList)) Sync_UnWorshipInfo(None, sysnList) return @@ -432,13 +421,13 @@ infoList = [] for recData in unWorshipList: recPlayerID = recData.GetPlayerID() - modelShow = GetPlayerModelShow(recPlayerID) - if modelShow: + playerInfo = GetPlayerViewInfo(recPlayerID) + if playerInfo: # 更新本服最新的外观显示,跨服玩家由跨服每日同步更新 __UpdWorshipByDay - SetModelShowInfo(recData, modelShow) + recData.SetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo, playerInfo) else: - modelShow = GetModelShowInfo(recData) - if not modelShow: + playerInfo = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo) + if not playerInfo: # 没有外观展示的不同步 continue @@ -450,7 +439,7 @@ infoPack.PlayerID = recPlayerID infoPack.WorshipType = GetWorshipType(recData) infoPack.WorshipValue = GetWorshipValue(recData) - infoPack.PlayerInfo = json.dumps(modelShow, ensure_ascii=False).replace(" ", "") + infoPack.PlayerInfo = json.dumps(playerInfo, ensure_ascii=False).replace(" ", "") infoPack.InfoLen = len(infoPack.PlayerInfo) if curPlayer: -- Gitblit v1.8.0