| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package CrossFamilyFlagwar  | 
| #  | 
| # @todo:¿ç·þÏÉÃ˶áÆìÕ½/Öð¹Íò½ç  | 
| # @author hxp  | 
| # @date 2023-04-25  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¿ç·þÏÉÃ˶áÆìÕ½  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2023-04-25 15:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import CrossRealmMsg  | 
| import IpyGameDataPY  | 
| import CrossBillboard  | 
| import PlayerCompensation  | 
| import CrossRealmPlayer  | 
| import PlayerControl  | 
| import PyDataManager  | 
| import ShareDefine  | 
| import ChConfig  | 
|   | 
| def DoOnWeekEx():  | 
|       | 
|     if not GameWorld.IsCrossServer():  | 
|         return  | 
|       | 
|     billboardMgr = PyDataManager.GetCrossBillboardManager()  | 
|     groupList = billboardMgr.GetBillboardGroupList(ShareDefine.Def_CBT_FamilyFlagwarWeek)  | 
|     for billboardType, groupValue1, groupValue2 in groupList:  | 
|         billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)  | 
|         zoneID = groupValue1  | 
|         zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossFamilyFlagwar, zoneID)  | 
|         serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []  | 
|           | 
|         syncFamilyList = []  | 
|         for index in range(billboardObj.GetCount()):  | 
|             billboardData = billboardObj.At(index)  | 
|             familyID = billboardData.ID  | 
|             familyRank = index + 1  | 
|             syncFamilyList.append([familyRank, familyID])  | 
|               | 
|         billboardObj.ClearData()  | 
|           | 
|         # Í¨Öª×Ó·þ  | 
|         sendMsg = {"zoneID":zoneID, "syncFamilyList":syncFamilyList, "isWeek":True}  | 
|         CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FamilyFlagwarOver, sendMsg, serverGroupIDList)  | 
|           | 
|     return  | 
|   | 
| def MapServer_CrossFamilyFlagwarOver(msgList):  | 
|     ## µØÍ¼½áËã  | 
|       | 
|     zoneID, battleFamilyList = msgList  | 
|     GameWorld.Log("¿ç·þÏÉÃ˶áÆìÕ½/Öð¹Íò½çµØÍ¼Í¬²½½á¹û: zoneID=%s" % zoneID, zoneID)  | 
|       | 
|     billboardMgr = PyDataManager.GetCrossBillboardManager()  | 
|     groupValue1 = zoneID  | 
|     billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_FamilyFlagwar, groupValue1)  | 
|     billboardObj.ClearData() # µ¥³¡°ñÿ´Î¸üÐÂÇ°ÖØÖà  | 
|       | 
|     billboardObjWeek = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_FamilyFlagwarWeek, groupValue1)  | 
|       | 
|     syncFamilyList = []  | 
|     championFamilyName = ""  | 
|     for familyInfo in battleFamilyList:  | 
|         familyRank, familyID, familyName, familyScore, battlePlayerList = familyInfo  | 
|           | 
|         if familyRank == 1:  | 
|             championFamilyName = familyName  | 
|               | 
|         billboardDataWeek = billboardObjWeek.FindByID(familyID)  | 
|         weekScore = billboardDataWeek.CmpValue if billboardDataWeek else 0  | 
|         weekScore += familyScore  | 
|           | 
|         dataID, name1, name2 = familyID, familyName, ""  | 
|         type2, value1, value2 = 0, 0, 0  | 
|           | 
|         # ÖÜ×ܰñ  | 
|         cmpValue = weekScore  | 
|         CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_FamilyFlagwarWeek, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)  | 
|           | 
|         # µ¥³¡°ñ  | 
|         cmpValue = familyScore  | 
|         CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_FamilyFlagwar, groupValue1, dataID, name1, name2, type2, value1, value2, cmpValue)  | 
|           | 
|         syncFamilyList.append([familyRank, familyID, familyScore, battlePlayerList])  | 
|           | 
|     billboardObj.SortData()  | 
|     billboardObjWeek.SortData()  | 
|       | 
|     zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByZoneID(ChConfig.Def_FBMapID_CrossFamilyFlagwar, zoneID)  | 
|     serverGroupIDList = zoneIpyData.GetServerGroupIDList() if zoneIpyData else []  | 
|       | 
|     # Í¨Öª×Ó·þ  | 
|     sendMsg = {"zoneID":zoneID, "syncFamilyList":syncFamilyList}  | 
|     CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_FamilyFlagwarOver, sendMsg, serverGroupIDList)  | 
|       | 
|     # ½áËã¹ã²¥  | 
|     if championFamilyName:  | 
|         PlayerControl.WorldNotifyCross(serverGroupIDList, 0, "CrossFamilyFlagwarFlagOver", [championFamilyName])  | 
|           | 
|     return  | 
|   | 
| def CrossServerMsg_FamilyFlagwarOver(msgData):  | 
|     ## ×Ó·þÊÕµ½ ½áËã½á¹ûͬ²½  | 
|       | 
|     if "isWeek" in msgData:  | 
|         __doFamilyFlagwarOverWeek(msgData)  | 
|         return  | 
|       | 
|     #zoneID = msgData["zoneID"]  | 
|     syncFamilyList = msgData["syncFamilyList"]  | 
|       | 
|     playerScoreAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarAward", 1, {}) # µ¥³¡¸öÈËÀۼƻý·Ö¶ÔÓ¦½±ÀøÎïÆ·Áбí {"»ý·Ö":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...}   | 
|     playerScoreIntAwardDict = {int(k):v for k, v in playerScoreAwardDict.items()}  | 
|       | 
|     playerHurtAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarAward", 2, {}) # µ¥³¡¸öÈËÀÛ¼ÆÉ˺¦¶ÔÓ¦½±ÀøÎïÆ·Áбí {"É˺¦":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...}  | 
|     playerHurtIntAwardDict = {int(k):v for k, v in playerHurtAwardDict.items()}  | 
|       | 
|     # µ¥³¡ÏÉÃË»ý·ÖÅÅÃû½±ÀøÁбí {"Ãû´Î":[[[²ÎÓë½±ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], [ÏÉÃ˽±ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...]], ...}  | 
|     # Î´²ÎÓëµÄÍæ¼ÒÖ»ÓÐÏÉÃ˽±Àø£¬Ã»ÓвÎÓë½±  | 
|     familyRankAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarAward", 3, {})  | 
|     familyRankIntAwardDict = {int(k):v for k, v in familyRankAwardDict.items()}  | 
|       | 
|     for familyInfo in syncFamilyList:  | 
|         familyRank, familyID, familyScore, battlePlayerList = familyInfo  | 
|         family = GameWorld.GetFamilyManager().FindFamily(familyID)  | 
|         if not family:  | 
|             ## ÕÒ²»µ½µÄ²»´¦Àí£¬¿ÉÄܲ»ÊDZ¾·þµÄÏÉÃË  | 
|             continue  | 
|           | 
|         # ËùÓгÉÔ±  | 
|         memPlayerIDList = []  | 
|         for i in range(family.GetCount()):  | 
|             member = family.GetAt(i)  | 
|             memPlayerIDList.append(member.GetPlayerID())  | 
|               | 
|         joinPlayerIDList = []  | 
|         for playerInfo in battlePlayerList:  | 
|             playerID, score, hurtTotal = playerInfo  | 
|             joinPlayerIDList.append(playerID)  | 
|               | 
|             # ¸öÈËÀۼƻý·Ö½±Àø  | 
|             for scoreNeed, itemList in playerScoreIntAwardDict.items():  | 
|                 if score < scoreNeed:  | 
|                     continue  | 
|                 PlayerCompensation.SendMailByKey("CrossFamilyFlagwarPlayerScore", [playerID], itemList, [scoreNeed])  | 
|                   | 
|             # ¸öÈËÀÛ¼ÆÉ˺¦½±Àø  | 
|             for hurtNeed, itemList in playerHurtIntAwardDict.items():  | 
|                 if hurtTotal < hurtNeed:  | 
|                     continue  | 
|                 PlayerCompensation.SendMailByKey("CrossFamilyFlagwarPlayerHurt", [playerID], itemList, [hurtNeed])  | 
|                   | 
|         if familyScore:  | 
|             pass  | 
|           | 
|         rankAwardList = GameWorld.GetOrderValueByDict(familyRankIntAwardDict, familyRank, False)  | 
|         if rankAwardList and len(rankAwardList) == 2:  | 
|             # ²ÎÓë½±Àø  | 
|             addItemList = rankAwardList[0]  | 
|             paramList = [familyRank]  | 
|             PlayerCompensation.SendMailByKey("CrossFamilyFlagwarRankJoin", joinPlayerIDList, addItemList, paramList)  | 
|               | 
|             # È«Ô±½±Àø  | 
|             addItemList = rankAwardList[1]  | 
|             paramList = [familyRank]  | 
|             PlayerCompensation.SendMailByKey("CrossFamilyFlagwarRank", memPlayerIDList, addItemList, paramList)  | 
|         else:  | 
|             GameWorld.ErrLog("Öð¹Íò½çÕÒ²»µ½ÏÉÃ˶ÔÓ¦Ãû´Î½±Àø! familyRank=%s,familyID=%s" % (familyRank, familyID))  | 
|               | 
|     return  | 
|   | 
| def __doFamilyFlagwarOverWeek(msgData):  | 
|       | 
|     syncFamilyList = msgData["syncFamilyList"]  | 
|       | 
|     weekRankAwardDict = IpyGameDataPY.GetFuncEvalCfg("CrossFamilyFlagwarAward", 4, {}) # Ã¿ÖÜÏÉÃËÀۼƻý·ÖÅÅÃû½±ÀøÁбí {"Ãû´Î":[[ÎïÆ·ID,¸öÊý,ÊÇ·ñÅÄÆ·], ...], ...}  | 
|     weekRankIntAwardDict = {int(k):v for k, v in weekRankAwardDict.items()}  | 
|       | 
|     for familyInfo in syncFamilyList:  | 
|         familyRank, familyID = familyInfo  | 
|         family = GameWorld.GetFamilyManager().FindFamily(familyID)  | 
|         if not family:  | 
|             ## ÕÒ²»µ½µÄ²»´¦Àí£¬¿ÉÄܲ»ÊDZ¾·þµÄÏÉÃË  | 
|             continue  | 
|           | 
|         # ËùÓгÉÔ±  | 
|         memPlayerIDList = []  | 
|         for i in range(family.GetCount()):  | 
|             member = family.GetAt(i)  | 
|             memPlayerIDList.append(member.GetPlayerID())  | 
|               | 
|         awardItemList = GameWorld.GetOrderValueByDict(weekRankIntAwardDict, familyRank, False)  | 
|         if awardItemList:  | 
|             paramList = [familyRank]  | 
|             PlayerCompensation.SendMailByKey("CrossFamilyFlagwarRankWeek", memPlayerIDList, awardItemList, paramList)  | 
|               | 
|     return  | 
|   |