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