| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameXiangong  | 
| #  | 
| # @todo:Ïɹ¬  | 
| # @author hxp  | 
| # @date 2024-09-04  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: Ïɹ¬  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2024-09-04 16:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import ShareDefine  | 
| import PyDataManager  | 
| import NetPackCommon  | 
| import ChPyNetSendPack  | 
| import PlayerCompensation  | 
| import PlayerViewCache  | 
| import CrossRealmMsg  | 
| import IpyGameDataPY  | 
| import PyGameData  | 
| import GameWorld  | 
| import ChConfig  | 
|   | 
| import time  | 
|   | 
| # Ïɹ¬Íæ¼Ò¼Ç¼  | 
| def GetXGPlayerID(recData): return recData.GetValue1() # Ïɹ¬Íæ¼ÒID  | 
| ##--------------------------------------------------------------------------------------------------  | 
|   | 
| def OnPlayerLogin_CrossLogic(serverGroupID, serverID, playerID):  | 
|     ## Íæ¼ÒµÇ¼ - ¿ç·þ´¦ÀíÂß¼  | 
|       | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for index in range(ipyDataMgr.GetXiangongCount()):  | 
|         ipyData = ipyDataMgr.GetXiangongByIndex(index)  | 
|         if not ipyData:  | 
|             continue  | 
|         SendShowXiangongPlayerToClientServer(ipyData, serverGroupID, serverID, playerID)  | 
|           | 
|     return  | 
|   | 
| def IsXiangongPlayer(playerID):  | 
|     ## ÊÇ·ñÏɹ¬Íæ¼Ò  | 
|     gameRecMgr = PyDataManager.GetDBGameRecDataManager()  | 
|     recDataDict = gameRecMgr.GetGameRecDataDict(ShareDefine.Def_GameRecType_Xiangong)  | 
|     for xiangongID in recDataDict.keys():  | 
|         if gameRecMgr.GetGameRecDataMatch(ShareDefine.Def_GameRecType_Xiangong, xiangongID, [playerID], findone=True):  | 
|             return True  | 
|     return False  | 
|   | 
| def AddXiangongPlayer(xiangongID, playerID, serverIDList, rank=None, syncDict=None):  | 
|     ## Ìí¼ÓнúÏɹÙÍæ¼Ò  | 
|     if not xiangongID:  | 
|         return  | 
|       | 
|     ipyData = IpyGameDataPY.GetIpyGameData("Xiangong", xiangongID)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     gameRecMgr = PyDataManager.GetDBGameRecDataManager()  | 
|     recData = gameRecMgr.AddGameRecData(ShareDefine.Def_GameRecType_Xiangong, xiangongID, [playerID])  | 
|     playerInfo = PlayerViewCache.GetShotCacheDict(playerID, "ServerID", "Face", "FacePic")  | 
|       | 
|     serverID = playerInfo.get("ServerID", 0)  | 
|     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) # ±£´æµ±ÏµÄÍæ¼Ò»ù±¾ÐÅÏ¢  | 
|     GameWorld.Log("нúÏɹÙÍæ¼Ò: xiangongID=%s,playerID=%s,rank=%s,serverID=%s,saveServerIDList=%s,%s"   | 
|                   % (xiangongID, playerID, rank, serverID, saveServerIDList, playerInfo))  | 
|       | 
|     # ½úÉýÓʼþ֪ͨ  | 
|     if playerID > 10000 and rank:  | 
|         titleID = ipyData.GetTitleID()  | 
|         addItemList = ipyData.GetAwardItemList()  | 
|         addQiyun = 0 if not addItemList else addItemList[0][1]  | 
|         paramList = [rank, titleID, addQiyun]  | 
|         PlayerCompensation.SendMailByKey(ipyData.GetMailKey(), [playerID], addItemList, paramList, crossMail=True)  | 
|           | 
|     if isinstance(syncDict, dict):  | 
|         if xiangongID not in syncDict:  | 
|             syncDict[xiangongID] = []  | 
|         newRecDataList = syncDict[xiangongID]  | 
|         newRecDataList.append(recData)  | 
|     return  | 
|   | 
| def SendNewXiangongPlayerToClientServer(syncDict):  | 
|     ## Í¬²½Ð½úÏɹ¬Íæ¼Òµ½×Ó·þ  | 
|     if not syncDict or not isinstance(syncDict, dict):  | 
|         return  | 
|     for xiangongID, newRecDataList in syncDict.items():  | 
|         ipyData = IpyGameDataPY.GetIpyGameData("Xiangong", xiangongID)  | 
|         if not ipyData:  | 
|             continue  | 
|         SendShowXiangongPlayerToClientServer(ipyData, syncRecDataList=newRecDataList)  | 
|     return  | 
|   | 
| def SendShowXiangongPlayerToClientServer(ipyData, serverGroupID=0, playerServerID=0, queryPlayerID=0, syncRecDataList=None):  | 
|     ## ·¢ËÍÐèҪչʾµÄнúÏɹ¬Íæ¼Òµ½×Ó·þ  | 
|       | 
|     if not ipyData:  | 
|         return  | 
|     xiangongID = ipyData.GetXiangongID()  | 
|     showDays = ipyData.GetShowDays()  | 
|       | 
|     curTime = int(time.time())  | 
|     if syncRecDataList:  | 
|         recDataList = syncRecDataList  | 
|     else:  | 
|         gameRecMgr = PyDataManager.GetDBGameRecDataManager()  | 
|         recDataList = gameRecMgr.GetGameRecDataList(ShareDefine.Def_GameRecType_Xiangong, xiangongID)  | 
|           | 
|     if not recDataList:  | 
|         return  | 
|       | 
|     GameWorld.DebugLog("·¢ËÍÐèҪչʾµÄнúÏɹ¬Íæ¼Òµ½×Ó·þ: xiangongID=%s,recDataLen=%s" % (xiangongID, len(recDataList)))  | 
|     GameWorld.DebugLog("serverGroupID=%s,playerServerID=%s,queryPlayerID=%s" % (serverGroupID, playerServerID, queryPlayerID))  | 
|     playerInfoList = []  | 
|     for recData in recDataList[::-1]:  | 
|         xgPlayerID = GetXGPlayerID(recData)  | 
|         addTime = recData.GetTime()  | 
|         passDays = GameWorld.GetDiff_Day(curTime, addTime) + 1  | 
|         if passDays > showDays:  | 
|             GameWorld.DebugLog("    xgPlayerID=%s,addTime=%s,passDays=%s > %s" % (xgPlayerID, addTime, passDays, showDays))  | 
|             break  | 
|         serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList)  | 
|         if playerServerID:  | 
|             if serverIDList == None:  | 
|                 GameWorld.DebugLog("    xgPlayerID=%s,serverIDList is None" % (xgPlayerID))  | 
|                 continue  | 
|             if not GameWorld.CheckServerIDInList(playerServerID, serverIDList):  | 
|                 GameWorld.DebugLog("    xgPlayerID=%s,playerServerID=%s not in %s" % (xgPlayerID, playerServerID, serverIDList))  | 
|                 continue  | 
|               | 
|         playerInfo = PlayerViewCache.GetShotCacheDict(xgPlayerID, "PlayerID", "ServerID", "Model", "Face", "FacePic")  | 
|         if not playerInfo:  | 
|             GameWorld.Log("ÕÒ²»µ½Íæ¼Ò»º´æµÄÔݲ»Í¬²½Ïɹ¬Ð½úÏɹÙ! xgPlayerID=%s" % xgPlayerID)  | 
|             continue  | 
|         playerInfo["AddTime"] = addTime  | 
|         playerInfo["ServerIDList"] = serverIDList  | 
|           | 
|         playerInfoList.insert(0, playerInfo)  | 
|           | 
|     GameWorld.DebugLog("playerInfoListLen=%s" % (len(playerInfoList)))  | 
|     if not playerInfoList:  | 
|         return  | 
|       | 
|     serverGroupIDList = [serverGroupID] if serverGroupID else []  | 
|     dataMsg = {"msgType":"ShowXiangongPlayer", "xiangongID":xiangongID, "playerInfoList":playerInfoList, "queryPlayerID":queryPlayerID}  | 
|     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_Xiangong, dataMsg, serverGroupIDList)  | 
|     return  | 
|   | 
| def ClientServerMsg_QueryXiangong(serverGroupID, msgData):  | 
|     ## ÊÕµ½×Ó·þ - ²é¿´ÏÉÃû¼  | 
|       | 
|     serverID = msgData["serverID"]  | 
|     queryPlayerID = msgData["queryPlayerID"]  | 
|     xiangongID = msgData["xiangongID"]  | 
|       | 
|     playerInfoList = []  | 
|     maxSyncCount = min(IpyGameDataPY.GetFuncCfg("XiangongSet", 2), 200)  | 
|     gameRecMgr = PyDataManager.GetDBGameRecDataManager()  | 
|     recDataList = gameRecMgr.GetGameRecDataList(ShareDefine.Def_GameRecType_Xiangong, xiangongID)  | 
|       | 
|     for recData in recDataList[::-1]:  | 
|         serverIDList = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_ServerIDList)  | 
|         playerInfo = recData.GetUserDataByKey(ChConfig.Def_RecDataKey_PlayerInfo)  | 
|         if not playerInfo or not GameWorld.CheckServerIDInList(serverID, serverIDList):  | 
|             continue  | 
|         playerInfo["AddTime"] = recData.GetTime()  | 
|         playerInfo["PlayerID"] = GetXGPlayerID(recData)  | 
|         playerInfoList.insert(0, playerInfo)  | 
|         if len(playerInfoList) >= maxSyncCount:  | 
|             break  | 
|           | 
|     # Ã»ÓмǼҲҪ»Ø°ü  | 
|     serverGroupList = [serverGroupID] # ½ö֪ͨ²éѯ·þ¼´¿É  | 
|     sendMsg = {"msgType":"QueryXiangongPlayer", "xiangongID":xiangongID, "playerInfoList":playerInfoList, "queryPlayerID":queryPlayerID}  | 
|     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_Xiangong, sendMsg, serverGroupList)  | 
|     return  | 
|   | 
| ##--------------------------------------------------------------------------------------------------  | 
|   | 
| #// A9 06 ²é¿´Ïɹ¬ÏÉÃû¼ #tagCGQueryXiangongRecPlayers  | 
| #  | 
| #struct    tagCGQueryXiangongRecPlayers  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD        XiangongID;    // Ïɹ¬ID  | 
| #};  | 
| def OnQueryXiangongRecPlayers(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     xiangongID = clientData.XiangongID  | 
|       | 
|     serverID = GameWorld.GetPlayerServerID(curPlayer)  | 
|     dataMsg = {"serverID":serverID, "queryPlayerID":playerID, "xiangongID":xiangongID}  | 
|     CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_QueryXiangong, dataMsg)  | 
|     return  | 
|   | 
| #// A9 07 µãÔÞÏɹ¬ #tagCGLikeXiangong  | 
| #  | 
| #struct    tagCGLikeXiangong  | 
| #{  | 
| #    tagHead        Head;  | 
| #    WORD        XiangongID;    // Ïɹ¬ID£¬Îª0ʱ´ú±íÿÈÕµÄÏɹ¬µãÔÞ  | 
| #};  | 
| def OnLikeXiangong(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     xiangongID = clientData.XiangongID  | 
|       | 
|     if xiangongID:  | 
|         ipyData = IpyGameDataPY.GetIpyGameData("Xiangong", xiangongID)  | 
|         if not ipyData:  | 
|             return  | 
|         showDays = ipyData.GetShowDays()  | 
|         timeDict = PyGameData.g_xiangongCanLikeTimeDict.get(playerID, {})  | 
|         if xiangongID not in timeDict:  | 
|             GameWorld.DebugLog("¸ÃÏɹ¬Ã»ÓÐÐèҪչʾµÄнúÍæ¼Ò¼Ç¼! xiangongID=%s" % xiangongID, playerID)  | 
|             return  | 
|         addTime = timeDict[xiangongID]  | 
|         passDays = GameWorld.GetDiff_Day(int(time.time()), addTime) + 1  | 
|         if passDays > showDays:  | 
|             GameWorld.DebugLog("¸ÃÏɹ¬Ð½úչʾʱ¼ä³¬¹ý×î´óչʾÌìÊý£¬ÎÞ·¨µãÔÞ! xiangongID=%s,addTime=%s,passDays=%s > %s"   | 
|                                % (xiangongID, addTime, passDays, showDays), playerID)  | 
|             return  | 
|         moneyType, moneyValue = ipyData.GetMoneyType(), ipyData.GetMoneyValue()  | 
|     else:  | 
|         moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("XiangongSet", 1)  | 
|           | 
|     msgInfo = str(["LikeXiangong", [xiangongID, moneyType, moneyValue]])  | 
|     curPlayer.MapServer_QueryPlayerResult(0, 0, "Xiangong", msgInfo, len(msgInfo))  | 
|     return  | 
|   | 
| def CrossServerMsg_Xiangong(msgData):  | 
|     ## ×Ó·þÊÕµ½¿ç·þÐÅÏ¢  | 
|       | 
|     msgType = msgData["msgType"]  | 
|       | 
|     if msgType == "ShowXiangongPlayer":  | 
|         __Client_ShowXiangongPlayer(msgData)  | 
|           | 
|     elif msgType == "QueryXiangongPlayer":  | 
|         __Client_QueryXiangongPlayer(msgData)  | 
|           | 
|     return  | 
|   | 
| def __Client_ShowXiangongPlayer(msgData):  | 
|     ## ×Ó·þÊÕµ½ - ¿ç·þͬ²½Õ¹Ê¾µÄнúÏɹ¬Íæ¼Ò  | 
|       | 
|     xiangongID = msgData["xiangongID"]  | 
|     playerInfoList = msgData["playerInfoList"]  | 
|     queryPlayerID = msgData.get("queryPlayerID", 0)  | 
|       | 
|     if not playerInfoList:  | 
|         return  | 
|       | 
|     newPlayerList = []  | 
|     for playerInfo in playerInfoList:  | 
|         newP = ChPyNetSendPack.tagGCXiangongNewPlayer()  | 
|         newP.AddTime = playerInfo["AddTime"]  | 
|         newP.ServerID = playerInfo["ServerID"]  | 
|         newP.PlayerID = playerInfo["PlayerID"]  | 
|         newP.Name = playerInfo["Name"]  | 
|         newP.NameLen = len(newP.Name)  | 
|         newP.LV = playerInfo["LV"]  | 
|         newP.Job = playerInfo["Job"]  | 
|         newP.RealmLV = playerInfo["RealmLV"]  | 
|         newP.Face = playerInfo.get("Face", 0)  | 
|         newP.FacePic = playerInfo.get("FacePic", 0)  | 
|         newP.EquipShowSwitch = playerInfo["EquipShowSwitch"]  | 
|         newP.EquipShowID = playerInfo["EquipShowID"]  | 
|         newP.EquipShowIDCount = len(newP.EquipShowID)  | 
|         newPlayerList.append(newP)  | 
|           | 
|     if not newPlayerList:  | 
|         return  | 
|       | 
|     if queryPlayerID:  | 
|         curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(queryPlayerID)  | 
|         if not curPlayer:  | 
|             return  | 
|         __updXiangongCanLikeTime(queryPlayerID, xiangongID, playerInfoList[-1]["AddTime"])  | 
|         clientPack = ChPyNetSendPack.tagGCXiangongNewPlayerInfo()  | 
|         clientPack.XiangongID = xiangongID  | 
|         clientPack.NewPlayerList = newPlayerList[-255:]  | 
|         clientPack.NewPlayerCount = len(clientPack.NewPlayerList)  | 
|         NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|         return  | 
|       | 
|     ## È«·þͬ²½  | 
|     clientPack = ChPyNetSendPack.tagGCXiangongNewPlayerInfo()  | 
|     clientPack.XiangongID = xiangongID  | 
|       | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for i in range(0, playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(i)  | 
|         if curPlayer == None or not curPlayer.GetInitOK():  | 
|             continue  | 
|         syncNewPlayerList = []  | 
|         for nIndex, newP in enumerate(newPlayerList):  | 
|             playerInfo = playerInfoList[nIndex]  | 
|             serverIDList = playerInfo["ServerIDList"]  | 
|             if not GameWorld.CheckServerIDInList(GameWorld.GetPlayerServerID(curPlayer), serverIDList):  | 
|                 continue  | 
|             syncNewPlayerList.append(newP)  | 
|             __updXiangongCanLikeTime(curPlayer.GetPlayerID(), xiangongID, playerInfo["AddTime"])  | 
|         if not syncNewPlayerList:  | 
|             continue  | 
|         clientPack.NewPlayerList = syncNewPlayerList[-255:]  | 
|         clientPack.NewPlayerCount = len(clientPack.NewPlayerList)  | 
|         NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|           | 
|     return  | 
|   | 
| def __updXiangongCanLikeTime(playerID, xiangongID, addTime):  | 
|     if playerID not in PyGameData.g_xiangongCanLikeTimeDict:  | 
|         PyGameData.g_xiangongCanLikeTimeDict[playerID] = {}  | 
|     timeDict = PyGameData.g_xiangongCanLikeTimeDict[playerID]  | 
|     canLikeTime = timeDict.get(xiangongID, 0)  | 
|     if addTime > canLikeTime:  | 
|         timeDict[xiangongID] = addTime  | 
|         GameWorld.DebugLog("¸üÐÂÍæ¼Ò¶ÔÓ¦Ïɹ¬¿ÉµãÔÞµÄ×îÐÂʱ¼ä´Á: xiangongID=%s,addTime=%s" % (xiangongID, addTime), playerID)  | 
|     return  | 
|   | 
| def __Client_QueryXiangongPlayer(msgData):  | 
|     ## ×Ó·þÊÕµ½ - ¿ç·þͬ²½µÄ²éѯÏÉÃû¼»Ø°ü  | 
|       | 
|     xiangongID = msgData["xiangongID"]  | 
|     playerInfoList = msgData["playerInfoList"]  | 
|     queryPlayerID = msgData.get("queryPlayerID", 0)  | 
|       | 
|     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(queryPlayerID)  | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     recPlayerList = []  | 
|     for playerInfo in playerInfoList:  | 
|         if not playerInfo:  | 
|             continue  | 
|         recP = ChPyNetSendPack.tagGCXiangongRecPlayer()  | 
|         recP.AddTime = playerInfo["AddTime"]  | 
|         recP.ServerID = playerInfo["ServerID"]  | 
|         recP.PlayerID = playerInfo["PlayerID"]  | 
|         recP.Name = playerInfo["Name"]  | 
|         recP.NameLen = len(recP.Name)  | 
|         recP.LV = playerInfo["LV"]  | 
|         recP.Job = playerInfo["Job"]  | 
|         recP.RealmLV = playerInfo["RealmLV"]  | 
|         recP.Face = playerInfo.get("Face", 0)  | 
|         recP.FacePic = playerInfo.get("FacePic", 0)  | 
|         recPlayerList.append(recP)  | 
|           | 
|     clientPack = ChPyNetSendPack.tagGCXiangongRecPlayerInfo()  | 
|     clientPack.XiangongID = xiangongID  | 
|     clientPack.RecPlayerList = recPlayerList  | 
|     clientPack.RecPlayerCount = len(clientPack.RecPlayerList)  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  |