#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package PlayerActLianqi # # @todo:Á¶Æ÷»î¶¯ # @author hxp # @date 2025-01-09 # @version 1.0 # # ÏêϸÃèÊö: Á¶Æ÷»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2025-01-09 17:30""" #------------------------------------------------------------------------------- import ShareDefine import IpyGameDataPY import PlayerDBGSEvent import PlayerCompensation import CrossActionControl import CrossBillboard import PyDataManager import CrossRealmMsg import GameWorld def MapServer_Lianqi(curPlayer, msgList): mapID = curPlayer.GetRealMapID() playerID = curPlayer.GetPlayerID() GameWorld.DebugLog("MapServer_Lianqi mapID=%s,msgList=%s" % (mapID, msgList), playerID) if not msgList: return msgType, dataMsg = msgList ret = None if msgType == "ScoreHighest": ret = __OnLianqiScoreHighest(curPlayer, dataMsg) if ret == None: return return msgList + (ret if isinstance(ret, list) else [ret]) def __OnLianqiScoreHighest(curPlayer, dataMsg): ## µØÍ¼Í¬²½×î¸ß»ý·Ö¼Ç¼ playerID = curPlayer.GetPlayerID() accID = curPlayer.GetAccID() playerName = curPlayer.GetName() job = curPlayer.GetJob() face = curPlayer.GetFace() facePic = curPlayer.GetFacePic() realmLV = curPlayer.GetOfficialRank() scoreHighest, lvHighest = dataMsg isRelationCrossAct = True if isRelationCrossAct: #ͬ²½¿ç·þ playerInfo = {"playerID":playerID, "playerName":playerName, "accID":accID, "job":job, "realmLV":realmLV, "scoreHighest":scoreHighest, "lvHighest":lvHighest, "face":face, "facePic":facePic} SyncLianqiToCrossServer(curPlayer, playerInfo) return def SyncLianqiToCrossServer(curPlayer, playerInfo): ## ͬ²½µ½¿ç·þ·þÎñÆ÷ actInfo = CrossActionControl.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Lianqi) 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_LianqiScore, dataMsg) return ##------------------------------------------ ¿ç·þÁ¶Æ÷»î¶¯ --------------------------------------- def ClientServerMsg_LianqiScore(serverGroupID, msgData): ## ÊÕµ½×Ó·þ - ͬ²½»ý·Ö cfgID = msgData["cfgID"] zoneID = msgData["zoneID"] playerInfo = msgData["playerInfo"] actInfo = CrossActionControl.GetCrossActInfoByCfgID(ShareDefine.CrossActName_Lianqi, 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("CrossActLianqi", cfgID) if not ipyData: return PersonalTemplateID = ipyData.GetPersonalTemplateID() rankIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActLianqiBillTemp", 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"] face = playerInfo.get("face", 0) facePic = playerInfo.get("facePic", 0) scoreHighest = playerInfo["scoreHighest"] lvHighest = playerInfo["lvHighest"] groupValue1 = zoneID if scoreHighest >= personlLimit: name2, type2, value1, value2 = accID, job, realmLV, 0 CrossBillboard.UpdCrossBillboard(ShareDefine.Def_CBT_LianqiScore, groupValue1, playerID, playerName, name2, type2, value1, value2, scoreHighest, cmpValue2=lvHighest, 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_ActLianqiAwardC % zoneID, 0) groupValue1 = zoneID billboardMgr = PyDataManager.GetCrossBillboardManager() billboardObj = billboardMgr.GetCrossBillboard(ShareDefine.Def_CBT_LianqiScore, 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_LianqiScore, 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_LianqiScore, groupValue1) billboardObj.SetOrderRuleList(orderRuleList) return def GetOrderRuleList(templateID): orderIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActLianqiBillTemp", 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_ActLianqiAwardC % zoneID) if awardState: #ÒѾ­½áËã¹ý¸Ã»î¶¯ GameWorld.Log("¿ç·þÁ¶Æ÷»î¶¯ÒѾ­½áËã¹ý½±ÀøÁË! cfgID=%s,zoneID=%s" % (cfgID, zoneID)) return PlayerDBGSEvent.SetDBGSTrig_ByKey(PlayerDBGSEvent.Def_ActLianqiAwardC % zoneID, 1) GameWorld.Log("=== ¿ç·þÁ¶Æ÷»î¶¯·¢·Å°ñµ¥½±Àø£¡ === cfgID=%s,zoneID=%s" % (cfgID, zoneID)) PersonalTemplateID = ipyData.GetPersonalTemplateID() serverIDRangeList = ipyData.GetServerIDRangeList() __GiveCrossOrderAwardPersonal(cfgID, zoneID, PersonalTemplateID, ShareDefine.Def_CBT_LianqiScore, 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("ActLianqiBillTemp", 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 = 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("ActLianqiCrossPlayer", [playerID], finalAwardItemList, [playerRank], crossMail=True) orderCountTotal -= 1 billboardIndex += 1 return