#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package PlayerActLianqi
|
#
|
# @todo:Á¶Æ÷»î¶¯
|
# @author hxp
|
# @date 2025-01-09
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: Á¶Æ÷»î¶¯
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2025-01-09 17:30"""
|
#-------------------------------------------------------------------------------
|
|
import ShareDefine
|
import IpyGameDataPY
|
import PlayerDBGSEvent
|
import PlayerCompensation
|
import CrossActionControl
|
import CrossBillboard
|
import PyDataManager
|
import CrossRealmMsg
|
import GameWorld
|
|
def MapServer_Lianqi(curPlayer, msgList):
|
mapID = curPlayer.GetRealMapID()
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("MapServer_Lianqi mapID=%s,msgList=%s" % (mapID, msgList), playerID)
|
if not msgList:
|
return
|
|
msgType, dataMsg = msgList
|
ret = None
|
|
if msgType == "ScoreHighest":
|
ret = __OnLianqiScoreHighest(curPlayer, dataMsg)
|
|
if ret == None:
|
return
|
return msgList + (ret if isinstance(ret, list) else [ret])
|
|
def __OnLianqiScoreHighest(curPlayer, dataMsg):
|
## µØÍ¼Í¬²½×î¸ß»ý·Ö¼Ç¼
|
playerID = curPlayer.GetPlayerID()
|
accID = curPlayer.GetAccID()
|
playerName = curPlayer.GetName()
|
job = curPlayer.GetJob()
|
face = curPlayer.GetFace()
|
facePic = curPlayer.GetFacePic()
|
realmLV = curPlayer.GetOfficialRank()
|
scoreHighest, lvHighest = dataMsg
|
isRelationCrossAct = True
|
|
if isRelationCrossAct:
|
#ͬ²½¿ç·þ
|
playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
|
"scoreHighest":scoreHighest, "lvHighest":lvHighest, "face":face, "facePic":facePic}
|
SyncLianqiToCrossServer(curPlayer, playerInfo)
|
return
|
|
def SyncLianqiToCrossServer(curPlayer, playerInfo):
|
## ͬ²½µ½¿ç·þ·þÎñÆ÷
|
actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Lianqi)
|
if not actInfo.get(ShareDefine.ActKey_State):
|
return
|
cfgID = actInfo.get(ShareDefine.ActKey_CfgID)
|
ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {})
|
if not ipyDataDict:
|
return
|
zoneID = ipyDataDict.get("ZoneID")
|
if not cfgID or not zoneID:
|
return
|
|
dataMsg = {"cfgID":cfgID, "zoneID":zoneID, "playerInfo":playerInfo}
|
CrossRealmMsg.SendMsgToCrossServer(ShareDefine.ClientServerMsg_LianqiScore, dataMsg)
|
return
|
|
##------------------------------------------ ¿ç·þÁ¶Æ÷»î¶¯ ---------------------------------------
|
def ClientServerMsg_LianqiScore(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þ - ͬ²½»ý·Ö
|
|
cfgID = msgData["cfgID"]
|
zoneID = msgData["zoneID"]
|
playerInfo = msgData["playerInfo"]
|
|
actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_Lianqi, cfgID, zoneID)
|
if not actInfo or not actInfo[ShareDefine.ActKey_State]:
|
GameWorld.ErrLog("¿ç·þÁ¶Æ÷·Ç»î¶¯ÖУ¬ÎÞ·¨¸üÐÂ! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
|
return
|
if actInfo[ShareDefine.ActKey_StateJoin] != ShareDefine.ActStateJoin_Start:
|
GameWorld.ErrLog("¿ç·þÁ¶Æ÷·Ç¿É²ÎÓë״̬£¬ÎÞ·¨¸üÐÂ! cfgID=%s, zoneID=%s" % (cfgID, zoneID))
|
return
|
ipyData = IpyGameDataPY.GetIpyGameData("CrossActLianqi", cfgID)
|
if not ipyData:
|
return
|
PersonalTemplateID = ipyData.GetPersonalTemplateID()
|
rankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActLianqiBillTemp", PersonalTemplateID)
|
if not rankIpyDataList:
|
return
|
lastRankIpyData = rankIpyDataList[-1] # È¡×îºóÒ»¸öΪ×îµÍÉϰñ»ý·ÖÏÞÖÆ
|
personlLimit = lastRankIpyData.GetNeedScore()
|
|
playerID = playerInfo["playerID"]
|
playerName = playerInfo["playerName"]
|
job = playerInfo["job"]
|
accID = playerInfo["accID"]
|
realmLV = playerInfo["realmLV"]
|
face = playerInfo.get("face", 0)
|
facePic = playerInfo.get("facePic", 0)
|
scoreHighest = playerInfo["scoreHighest"]
|
lvHighest = playerInfo["lvHighest"]
|
|
groupValue1 = zoneID
|
|
if scoreHighest >= personlLimit:
|
name2, type2, value1, value2 = accID, job, realmLV, 0
|
CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_LianqiScore, groupValue1, playerID, playerName,
|
name2, type2, value1, value2, scoreHighest, cmpValue2=lvHighest, autoSort=False, value3=face, value4=facePic)
|
return
|
|
def OnCrossActIDChange(cfgID, zoneID, ipyData, state):
|
## ¿ç·þ»î¶¯ID±ä¸ü
|
if state:
|
OnCrossActStart(cfgID, zoneID, ipyData)
|
else:
|
OnCrossActEnd(cfgID, zoneID, ipyData)
|
return
|
|
def OnCrossActStart(cfgID, zoneID, ipyData):
|
## ¿ç·þ»î¶¯¿ªÆô
|
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActLianqiAwardC % zoneID, 0)
|
|
groupValue1 = zoneID
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_LianqiScore, groupValue1)
|
billboardObj.ClearData() # ÐÂ»î¶¯ÖØÖðñµ¥Êý¾Ý
|
return
|
|
def OnCrossActEnd(cfgID, zoneID, ipyData):
|
## ¿ç·þ»î¶¯½áÊø
|
|
groupValue1 = zoneID
|
GameWorld.Log("=== ¿ç·þÁ¶Æ÷»î¶¯½áÊø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
__OnCrossEndAward(cfgID, zoneID, ipyData)
|
|
# ±¸·Ý¡¢Çå³ý°ñµ¥Êý¾Ý
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_LianqiScore, groupValue1)
|
billboardObj.ClearData()
|
|
GameWorld.Log("=================================================================================")
|
return
|
|
def OnCrossActInStateRefresh(cfgID, zoneID, ipyData):
|
## »î¶¯ÖÐˢУ¬Ã¿´Î¶¼ÐèҪˢеÄÂß¼£¬°üº¬ÖضÁÅäÖõÈ
|
if not ipyData:
|
return
|
PersonalTemplateID = ipyData.GetPersonalTemplateID()
|
orderRuleList = GetOrderRuleList(PersonalTemplateID)
|
|
groupValue1 = zoneID
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_LianqiScore, groupValue1)
|
billboardObj.SetOrderRuleList(orderRuleList)
|
return
|
|
def GetOrderRuleList(templateID):
|
orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActLianqiBillTemp", templateID)
|
if not orderIpyDataList:
|
return
|
orderRuleList = []
|
for ipyData in orderIpyDataList:
|
orderRuleList.append([ipyData.GetRank(), ipyData.GetNeedScore()])
|
return orderRuleList
|
|
def OnCrossActJoinEnd(cfgID, zoneID, ipyData):
|
## ¿ç·þ»î¶¯²ÎÓë½áÊø
|
__OnCrossEndAward(cfgID, zoneID, ipyData)
|
return
|
|
def __OnCrossEndAward(cfgID, zoneID, ipyData):
|
## ½áËã¿ç·þ½±Àø
|
awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActLianqiAwardC % zoneID)
|
if awardState:
|
#ÒѾ½áËã¹ý¸Ã»î¶¯
|
GameWorld.Log("¿ç·þÁ¶Æ÷»î¶¯ÒѾ½áËã¹ý½±ÀøÁË! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
return
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActLianqiAwardC % zoneID, 1)
|
|
GameWorld.Log("=== ¿ç·þÁ¶Æ÷»î¶¯·¢·Å°ñµ¥½±Àø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
|
PersonalTemplateID = ipyData.GetPersonalTemplateID()
|
serverIDRangeList = ipyData.GetServerIDRangeList()
|
|
__GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_LianqiScore, serverIDRangeList)
|
GameWorld.Log("=================================================================================")
|
return
|
|
def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType, serverIDRangeList):
|
|
groupValue1 = zoneID
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1)
|
billboardDataCount = billboardObj.GetCount()
|
if not billboardDataCount:
|
GameWorld.Log("¿ç·þÁ¶Æ÷¸öÈËÅÅÐÐÊý¾ÝΪ¿Õ! billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s" % (billboardType, zoneID, cfgID, templateID))
|
return
|
|
# ½áËãʱÅÅÐò²¢±£´æ°ñµ¥Êý¾ÝÁ÷Ïò
|
billboardObj.SortData()
|
billboardObj.SaveDRData("Award", {"cfgID":cfgID, "zoneID":zoneID})
|
|
GameWorld.Log("½áËã¿ç·þÁ¶Æ÷¸öÈËÅÅÐн±Àø: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
|
% (billboardType, zoneID, cfgID, templateID, billboardDataCount))
|
|
orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActLianqiBillTemp", templateID)
|
if not orderIpyDataList:
|
return
|
|
rankPre = 0
|
billboardIndex = 0
|
for ipyData in orderIpyDataList:
|
rank = ipyData.GetRank()
|
needScore = ipyData.GetNeedScore()
|
scoreAwardEx = ipyData.GetScoreAwardEx()
|
scoreAwardExList = scoreAwardEx.keys()
|
scoreAwardExList.sort()
|
awardItemList = ipyData.GetAwardItemList()
|
orderCountTotal = rank - rankPre # ½±ÀøÃû´ÎÊýÁ¿
|
rankPre = rank
|
|
for index in xrange(billboardIndex, billboardDataCount):
|
if orderCountTotal <= 0:
|
break
|
|
billboardData = billboardObj.At(index)
|
playerID = billboardData.ID
|
name2 = billboardData.Name2
|
cmpValue = billboardData.CmpValue
|
if cmpValue < needScore:
|
GameWorld.Log(" »ý·Ö²»×ã¸Ã°ñµ¥ËùÐè»ý·Ö£¬Ìø¹ý¸ÃÃû´Î: index=%s,rank=%s,playerID=%s,cmpValue=%s < %s" % (index, rank, playerID, cmpValue, needScore))
|
break
|
|
awardItemExList = []
|
for scoreEx in scoreAwardExList:
|
if cmpValue < scoreEx:
|
break
|
awardItemExList = scoreAwardEx[scoreEx] # È¡×î´óÂú×ãÌõ¼þµÄÒ»µµ
|
finalAwardItemList = awardItemList + awardItemExList
|
|
playerRank = rank - orderCountTotal + 1
|
GameWorld.Log(" ·¢·ÅÁ¶Æ÷¸öÈ˰ñµ¥½±Àø: index=%s,rank=%s,playerRank=%s,playerID=%s,cmpValue=%s,awardItemList=%s,scoreAwardEx=%s,finalAwardItemList=%s, %s"
|
% (index, rank, playerRank, playerID, cmpValue, awardItemList, scoreAwardEx, finalAwardItemList, name2))
|
PlayerCompensation.SendMailByKey("ActLianqiCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True)
|
|
orderCountTotal -= 1
|
billboardIndex += 1
|
|
return
|