#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package PlayerActXianXiaMJ
|
#
|
# @todo:ÏÉÏ»ÃØ¾³
|
# @author hxp
|
# @date 2024-07-18
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: ÏÉÏ»ÃØ¾³
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2024-07-18 18:00"""
|
#-------------------------------------------------------------------------------
|
|
import ShareDefine
|
import IpyGameDataPY
|
import DataRecordPack
|
import PlayerDBGSEvent
|
import PlayerBillboard
|
import PlayerCompensation
|
import CrossActionControl
|
import CrossBillboard
|
import PyDataManager
|
import CrossRealmMsg
|
import GameWorld
|
|
def OnActStart(actNum):
|
## »î¶¯¿ªÆô
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum, 0)
|
PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_XianXiaMJScore)
|
return
|
|
def OnActEnd(actNum, ipyData, dayIndex):
|
## »î¶¯½áÊø
|
cfgID = ipyData.GetCfgID() if ipyData else 0
|
GameWorld.Log("=== ÏÉÏ»ÃØ¾³»î¶¯½áÊø£¡ === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
|
|
__OnEndAward(actNum, ipyData, dayIndex) # ¼æÈݻûÓÐÅäÖòÎÓëʱ¼ä¶ÎµÄÔڻ½áÊø²¹´¥·¢½áËã½±Àø
|
|
DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_XianXiaMJScore, "XianXiaMJ", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
|
GameWorld.Log("=================================================================================")
|
return
|
|
def OnActJoinEnd(actNum, ipyData, dayIndex):
|
## »î¶¯²ÎÓë½áÊø
|
__OnEndAward(actNum, ipyData, dayIndex)
|
return
|
|
def __OnEndAward(actNum, ipyData, dayIndex):
|
## ½áËã½±Àø
|
if not ipyData:
|
return
|
cfgID = ipyData.GetCfgID()
|
awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum)
|
if awardState:
|
#ÒѾ½áËã¹ý¸Ã»î¶¯
|
GameWorld.Log("ÏÉÏ»ÃØ¾³»î¶¯ÒѾ½áËã¹ý½±ÀøÁË! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
|
return
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAward % actNum, 1)
|
|
GameWorld.Log("=== ±¾·þÏÉÏ»ÃØ¾³»î¶¯·¢·Å°ñµ¥½±Àø£¡ === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
|
|
__OnEndAward_Personal(ipyData.GetPersonalTemplateID(), ShareDefine.Def_BT_XianXiaMJScore)
|
GameWorld.Log("=================================================================================")
|
return
|
|
def __OnEndAward_Personal(templateID, billboardType):
|
billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
|
if not billBoard:
|
return
|
if not templateID:
|
GameWorld.Log("±¾´Î»î¶¯Ã»ÓиöÈ˰ñ½±Àø!")
|
return
|
tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", templateID)
|
if not tempIpyDataList:
|
return
|
|
rankAwardDict = {}
|
for tempIpyData in tempIpyDataList:
|
rankAwardDict[tempIpyData.GetRank()] = tempIpyData.GetAwardItemList()
|
|
GameWorld.Log("½áËã¸öÈ˰ñµ¥½±Àø: templateID=%s,rankAwardDict=%s" % (templateID, rankAwardDict))
|
billBoard.Sort()
|
for index in xrange(billBoard.GetCount()):
|
billBoardData = billBoard.At(index)
|
if not billBoardData:
|
continue
|
|
rank = index + 1
|
|
awardItemList = GameWorld.GetOrderValueByDict(rankAwardDict, rank, False)
|
if not awardItemList:
|
break
|
|
playerID = billBoardData.GetID()
|
name2 = billBoardData.GetName2()
|
cmpValue = billBoardData.GetCmpValue()
|
|
GameWorld.Log(" ·¢·ÅÏÉÏ»ÃØ¾³¸öÈ˰ñµ¥½±Àø: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s"
|
% (rank, playerID, cmpValue, awardItemList, name2))
|
|
PlayerCompensation.SendMailByKey("XianXiaMJPlayer", [playerID], awardItemList, [rank])
|
|
return
|
|
def MapServer_XianXiaMJ(curPlayer, msgList):
|
mapID = curPlayer.GetRealMapID()
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("MapServer_XianXiaMJ mapID=%s,msgList=%s" % (mapID, msgList), playerID)
|
if not msgList:
|
return
|
|
msgType, dataMsg = msgList
|
ret = None
|
|
if msgType == "AddLotteryScore":
|
ret = __OnAddLotteryScore(curPlayer, dataMsg)
|
|
if ret == None:
|
return
|
return msgList + (ret if isinstance(ret, list) else [ret])
|
|
def __OnAddLotteryScore(curPlayer, dataMsg):
|
## µØÍ¼Ôö¼Ó»ý·Ö
|
playerID = curPlayer.GetPlayerID()
|
accID = curPlayer.GetAccID()
|
playerName = curPlayer.GetName()
|
job = curPlayer.GetJob()
|
realmLV = curPlayer.GetOfficialRank()
|
_, updLotteryScore = dataMsg
|
|
#ͬ²½¿ç·þ
|
playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
|
"playerLotteryScore":updLotteryScore}
|
SyncXianXiaMJToCrossServer(curPlayer, playerInfo)
|
return
|
|
def SyncXianXiaMJToCrossServer(curPlayer, playerInfo):
|
## ͬ²½µ½¿ç·þ·þÎñÆ÷
|
actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ)
|
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_XianXiaMJScore, dataMsg)
|
return
|
|
##------------------------------------------ ¿ç·þÏÉÏ»ÃØ¾³»î¶¯ ---------------------------------------
|
def ClientServerMsg_XianXiaMJScore(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þ - ͬ²½»ý·Ö
|
|
cfgID = msgData["cfgID"]
|
zoneID = msgData["zoneID"]
|
playerInfo = msgData["playerInfo"]
|
|
actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_XianXiaMJ, 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("CrossActXianXiaMJ", cfgID)
|
if not ipyData:
|
return
|
personlLimit = ipyData.GetRankLimitPersonal()
|
|
playerID = playerInfo["playerID"]
|
playerName = playerInfo["playerName"]
|
job = playerInfo["job"]
|
accID = playerInfo["accID"]
|
realmLV = playerInfo["realmLV"]
|
playerLotteryScore = playerInfo["playerLotteryScore"]
|
|
groupValue1 = zoneID
|
|
if playerLotteryScore >= personlLimit:
|
name2, type2, value1, value2 = accID, job, realmLV, 0
|
CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, groupValue1, playerID, playerName,
|
name2, type2, value1, value2, playerLotteryScore)
|
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_ActXianXiaMJAwardC % zoneID, 0)
|
|
groupValue1 = zoneID
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_XianXiaMJScore, 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_XianXiaMJScore, groupValue1)
|
billboardObj.ClearData()
|
|
GameWorld.Log("=================================================================================")
|
return
|
|
def OnCrossActJoinEnd(cfgID, zoneID, ipyData):
|
## ¿ç·þ»î¶¯²ÎÓë½áÊø
|
__OnCrossEndAward(cfgID, zoneID, ipyData)
|
return
|
|
def __OnCrossEndAward(cfgID, zoneID, ipyData):
|
## ½áËã¿ç·þ½±Àø
|
awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAwardC % zoneID)
|
if awardState:
|
#ÒѾ½áËã¹ý¸Ã»î¶¯
|
GameWorld.Log("¿ç·þÏÉÏ»ÃØ¾³»î¶¯ÒѾ½áËã¹ý½±ÀøÁË! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
return
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActXianXiaMJAwardC % zoneID, 1)
|
|
GameWorld.Log("=== ¿ç·þÏÉÏ»ÃØ¾³»î¶¯·¢·Å°ñµ¥½±Àø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
|
PersonalTemplateID = ipyData.GetPersonalTemplateID()
|
|
__GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_XianXiaMJScore)
|
GameWorld.Log("=================================================================================")
|
return
|
|
def __GiveCrossOrderAwardPersonal(cfgID, zoneID, templateID, billboardType):
|
|
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()
|
|
GameWorld.Log("½áËã¿ç·þÏÉÏ»ÃØ¾³¸öÈËÅÅÐн±Àø: billboardType=%s,zoneID=%s,cfgID=%s,templateID=%s,billboardDataCount=%s"
|
% (billboardType, zoneID, cfgID, templateID, billboardDataCount))
|
|
orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", templateID)
|
if orderIpyDataList:
|
rankPre = 0
|
billboardIndex = 0
|
for ipyData in orderIpyDataList:
|
rank = ipyData.GetRank()
|
awardItemList = ipyData.GetAwardItemList()
|
orderCountTotal = rank - rankPre # ½±ÀøÃû´ÎÊýÁ¿
|
rankPre = rank
|
orderCount = 0
|
|
for index in xrange(billboardIndex, billboardDataCount):
|
if orderCount >= orderCountTotal:
|
break
|
|
billboardData = billboardObj.At(index)
|
playerID = billboardData.ID
|
name2 = billboardData.Name2
|
cmpValue = billboardData.CmpValue
|
|
playerRank = index + 1
|
GameWorld.Log(" ·¢·ÅÏÉÏ»ÃØ¾³¸öÈ˰ñµ¥½±Àø: rank=%s,playerID=%s,cmpValue=%s,awardItemList=%s, %s"
|
% (rank, playerID, cmpValue, awardItemList, name2))
|
PlayerCompensation.SendMailByKey("XianXiaMJCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True)
|
|
orderCount += 1
|
billboardIndex += 1
|
|
return
|