#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
##@package PlayerActHorsePetTrain
|
#
|
# @todo:Æï³èÑø³É»î¶¯
|
# @author hxp
|
# @date 2024-08-14
|
# @version 1.0
|
#
|
# ÏêϸÃèÊö: Æï³èÑø³É»î¶¯
|
#
|
#-------------------------------------------------------------------------------
|
#"""Version = 2024-08-14 16:30"""
|
#-------------------------------------------------------------------------------
|
|
import ShareDefine
|
import IpyGameDataPY
|
import DataRecordPack
|
import PlayerDBGSEvent
|
import PlayerBillboard
|
import PlayerCompensation
|
import CrossActionControl
|
import CrossBillboard
|
import PyDataManager
|
import CrossRealmMsg
|
import GameXiangong
|
import GameWorship
|
import GameWorld
|
|
def OnActStart(actNum, ipyData):
|
## »î¶¯¿ªÆô
|
if not ipyData:
|
return
|
personalTemplateID = ipyData.GetPersonalTemplateID()
|
if not personalTemplateID:
|
GameWorld.DebugLog("Æï³èÑø³É»î¶¯Ã»Óаñµ¥½±Àø£¬²»´¦ÀíOnActStart! actNum=%s" % (actNum))
|
return
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActHorsePetTrainAward % actNum, 0)
|
PlayerBillboard.ClearBillboardByIndex(ShareDefine.Def_BT_HorsePetTrainScore)
|
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) # ¼æÈݻûÓÐÅäÖòÎÓëʱ¼ä¶ÎµÄÔڻ½áÊø²¹´¥·¢½áËã½±Àø
|
|
GameWorld.Log("=================================================================================")
|
return
|
|
def OnActInStateRefresh(actNum, ipyData):
|
## »î¶¯ÖÐˢУ¬Ã¿´Î¶¼ÐèҪˢеÄÂß¼£¬°üº¬ÖضÁÅäÖõÈ
|
if not ipyData:
|
return
|
personalTemplateID = ipyData.GetPersonalTemplateID()
|
if not personalTemplateID:
|
return
|
orderRuleList = GetOrderRuleList(personalTemplateID)
|
|
billboardMgr = PlayerBillboard.GetBillboardMgr()
|
billboardObj = billboardMgr.GetBillboardObj(ShareDefine.Def_BT_HorsePetTrainScore)
|
billboardObj.SetOrderRuleList(orderRuleList)
|
return
|
|
def OnActJoinEnd(actNum, ipyData, dayIndex):
|
## »î¶¯²ÎÓë½áÊø
|
__OnEndAward(actNum, ipyData, dayIndex)
|
return
|
|
def __OnEndAward(actNum, ipyData, dayIndex):
|
## ½áËã½±Àø
|
if not ipyData:
|
return
|
cfgID = ipyData.GetCfgID()
|
personalTemplateID = ipyData.GetPersonalTemplateID()
|
if not personalTemplateID:
|
GameWorld.DebugLog("Æï³èÑø³É»î¶¯Ã»Óаñµ¥½±Àø£¬²»½áËã°ñµ¥½±Àø! actNum=%s" % (actNum))
|
return
|
awardState = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActHorsePetTrainAward % actNum)
|
if awardState:
|
#ÒѾ½áËã¹ý¸Ã»î¶¯
|
GameWorld.Log("Æï³èÑø³É»î¶¯ÒѾ½áËã¹ý½±ÀøÁË! actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
|
return
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActHorsePetTrainAward % actNum, 1)
|
|
GameWorld.Log("=== ±¾·þÆï³èÑø³É»î¶¯·¢·Å°ñµ¥½±Àø£¡ === actNum=%s,cfgID=%s,dayIndex=%s" % (actNum, cfgID, dayIndex))
|
|
__OnEndAward_Personal(ipyData.GetPersonalTemplateID(), ShareDefine.Def_BT_HorsePetTrainScore)
|
|
DataRecordPack.DR_BillboardData(ShareDefine.Def_BT_HorsePetTrainScore, "ActHorsePetTrain", {"actNum":actNum, "cfgID":cfgID, "dayIndex":dayIndex})
|
GameWorld.Log("=================================================================================")
|
return
|
|
def __OnEndAward_Personal(templateID, billboardType):
|
billBoard = GameWorld.GetBillboard().FindBillboard(billboardType)
|
if not billBoard:
|
return
|
if not templateID:
|
GameWorld.Log("±¾´Î»î¶¯Ã»ÓиöÈ˰ñ½±Àø!")
|
return
|
billboardDataCount = billBoard.GetCount()
|
billBoard.Sort()
|
|
GameWorld.Log("½áËã¸öÈ˰ñµ¥½±Àø: billboardType=%s,templateID=%s,billboardDataCount=%s" % (billboardType, templateID, billboardDataCount))
|
|
orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", 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 = billBoard.At(index)
|
playerID = billBoardData.GetID()
|
name2 = billBoardData.GetName2()
|
cmpValue = billBoardData.GetCmpValue()
|
|
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("ActHorsePetTrainPlayer", [playerID], finalAwardItemList, [playerRank])
|
|
orderCountTotal -= 1
|
billboardIndex += 1
|
|
return
|
|
def MapServer_HorsePetTrain(curPlayer, msgList):
|
mapID = curPlayer.GetRealMapID()
|
playerID = curPlayer.GetPlayerID()
|
GameWorld.DebugLog("MapServer_HorsePetTrain mapID=%s,msgList=%s" % (mapID, msgList), playerID)
|
if not msgList:
|
return
|
|
msgType, dataMsg = msgList
|
ret = None
|
|
if msgType == "AddHorsePetTrainScore":
|
ret = __OnAddHorsePetTrainScore(curPlayer, dataMsg)
|
|
if ret == None:
|
return
|
return msgList + (ret if isinstance(ret, list) else [ret])
|
|
def __OnAddHorsePetTrainScore(curPlayer, dataMsg):
|
## µØÍ¼Ôö¼Ó»ý·Ö
|
playerID = curPlayer.GetPlayerID()
|
accID = curPlayer.GetAccID()
|
playerName = curPlayer.GetName()
|
job = curPlayer.GetJob()
|
realmLV = curPlayer.GetOfficialRank()
|
_, updScore, isRelationCrossAct = dataMsg
|
|
# ÏÉÃ˰ñ...
|
|
if isRelationCrossAct:
|
#ͬ²½¿ç·þ
|
playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV,
|
"playerScore":updScore}
|
SyncHorsePetTrainToCrossServer(curPlayer, playerInfo)
|
return
|
|
def SyncHorsePetTrainToCrossServer(curPlayer, playerInfo):
|
## ͬ²½µ½¿ç·þ·þÎñÆ÷
|
actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_HorsePetTrain)
|
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_HorsePetTrainScore, dataMsg)
|
return
|
|
##------------------------------------------ ¿ç·þÆï³èÑø³É»î¶¯ ---------------------------------------
|
def ClientServerMsg_HorsePetTrainScore(serverGroupID, msgData):
|
## ÊÕµ½×Ó·þ - ͬ²½»ý·Ö
|
|
cfgID = msgData["cfgID"]
|
zoneID = msgData["zoneID"]
|
playerInfo = msgData["playerInfo"]
|
|
actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_HorsePetTrain, 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("CrossActHorsePetTrain", cfgID)
|
if not ipyData:
|
return
|
PersonalTemplateID = ipyData.GetPersonalTemplateID()
|
rankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", 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"]
|
playerScore = playerInfo["playerScore"]
|
|
groupValue1 = zoneID
|
|
if playerScore >= personlLimit:
|
name2, type2, value1, value2 = accID, job, realmLV, 0
|
CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_HorsePetTrainScore, groupValue1, playerID, playerName,
|
name2, type2, value1, value2, playerScore, autoSort=False)
|
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_ActHorsePetTrainAwardC % zoneID, 0)
|
|
groupValue1 = zoneID
|
billboardMgr = PyDataManager.GetCrossBillboardManager()
|
billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_HorsePetTrainScore, 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_HorsePetTrainScore, 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_HorsePetTrainScore, groupValue1)
|
billboardObj.SetOrderRuleList(orderRuleList)
|
return
|
|
def GetOrderRuleList(templateID):
|
orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", 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_ActHorsePetTrainAwardC % zoneID)
|
if awardState:
|
#ÒѾ½áËã¹ý¸Ã»î¶¯
|
GameWorld.Log("¿ç·þÆï³èÑø³É»î¶¯ÒѾ½áËã¹ý½±ÀøÁË! cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
return
|
PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActHorsePetTrainAwardC % zoneID, 1)
|
|
GameWorld.Log("=== ¿ç·þÆï³èÑø³É»î¶¯·¢·Å°ñµ¥½±Àø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID))
|
|
PersonalTemplateID = ipyData.GetPersonalTemplateID()
|
serverIDRangeList = ipyData.GetServerIDRangeList()
|
|
__GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_HorsePetTrainScore, 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("ActHorsePetTrainBillTemp", templateID)
|
if not orderIpyDataList:
|
return
|
|
worshipType = ShareDefine.Def_WorshipType_CrossHorsePetTrain
|
syncNewWorshipList = []
|
syncNewXiangongDict = {}
|
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()
|
xiangongID = ipyData.GetXiangongID()
|
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("ActHorsePetTrainCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True)
|
|
orderCountTotal -= 1
|
billboardIndex += 1
|
|
GameXiangong.AddXiangongPlayer(xiangongID, playerID, serverIDRangeList, playerRank, syncNewXiangongDict)
|
GameWorship.AddWorshipPlayer(worshipType, playerRank, playerID, serverIDRangeList, syncList=syncNewWorshipList)
|
GameWorship.SendNewWorshipPlayer(syncNewWorshipList)
|
GameXiangong.SendNewXiangongPlayerToClientServer(syncNewXiangongDict)
|
return
|