| #!/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() | 
|     face = curPlayer.GetFace() | 
|     facePic = curPlayer.GetFacePic() | 
|     realmLV = curPlayer.GetOfficialRank() | 
|     _, updScore, isRelationCrossAct = dataMsg | 
|      | 
|     # ÏÉÃ˰ñ... | 
|      | 
|     if isRelationCrossAct: | 
|         #ͬ²½¿ç·þ | 
|         playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV, | 
|                       "playerScore":updScore, "face":face, "facePic":facePic} | 
|         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"] | 
|     face = playerInfo.get("face", 0) | 
|     facePic = playerInfo.get("facePic", 0) | 
|      | 
|     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, 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_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 |