#!/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 GameWorld def OnActStart(actNum): ## »î¶¯¿ªÆô 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 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_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 tempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActHorsePetTrainBillTemp", 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("ActHorsePetTrainPlayer", [playerID], awardItemList, [rank]) 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 personlLimit = ipyData.GetRankLimitPersonal() 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) 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 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() __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_HorsePetTrainScore) 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("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 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("ActHorsePetTrainCrossPlayer", [playerID], awardItemList, [playerRank], crossMail=True) orderCount += 1 billboardIndex += 1 return