#!/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