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