#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerActXianXiaMJ # # @todo:ÏÉÏ»Ãؾ³ # @author hxp # @date 2021-05-26 # @version 1.0 # # ÏêϸÃèÊö: ÏÉÏ»Ãؾ³ # #------------------------------------------------------------------------------- #"""Version = 2021-05-26 11:30""" #------------------------------------------------------------------------------- import PyGameData import ShareDefine import PlayerControl import IpyGameDataPY import ItemControler import CrossRealmPlayer import PlayerBillboard import ChPyNetSendPack import NetPackCommon import PlayerActTask import ItemCommon import GameWorld import ChConfig Def_SuperLibType = 9 # ´ó½±¿âÀàÐ͹̶¨Îª9 def OnMixFirstLogin(curPlayer): for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_XianXiaMJ, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) if not actInfo.get(ShareDefine.ActKey_State): continue score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum) if not score: continue GameWorld.Log("ÏÉÏ»Ãؾ³ºÏ·þÊ×µÇͬ²½»ý·Ö°ñµ¥: actNum=%s,score=%s" % (actNum, score), curPlayer.GetPlayerID()) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_XianXiaMJScore, score, autoSort=True) break return def OnPlayerLogin(curPlayer): for actInfo in PyGameData.g_operationActionDict.get(ShareDefine.OperationActionName_XianXiaMJ, {}).values(): actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) isReset = __CheckPlayerXianXiaMJAction(curPlayer, actNum) if not isReset: # »î¶¯ÖÐͬ²½»î¶¯ÐÅÏ¢ if actInfo.get(ShareDefine.ActKey_State): Sync_XianXiaMJActionInfo(curPlayer, actNum) Sync_XianXiaMJLayerInfo(curPlayer, actNum) if not __CheckPlayerCrossActXianXiaMJ(curPlayer): Sync_CrossActXianXiaMJActionInfo(curPlayer) return def RefreshXianXiaMJActionInfo(actNum): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerXianXiaMJAction(curPlayer, actNum) return def __CheckPlayerXianXiaMJAction(curPlayer, actNum): ## ¼ì²éÍæ¼Ò»î¶¯Êý¾ÝÐÅÏ¢ playerID = curPlayer.GetPlayerID() actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJID % actNum) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("ÏÉÏ»Ãؾ³»î¶¯ID²»±ä£¬²»´¦Àí£¡actNum=%s,actID=%s" % (actNum, actID), playerID) layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum) if state and layerNum <= 0: GameWorld.Log("ÏÉÏ»Ãؾ³»î¶¯Öе«Êײ㽱³Øδˢгõʼ»¯£¬³¢ÊÔˢУ¡actNum=%s,actID=%s" % (actNum, actID), playerID) __InitFirstLayerData(curPlayer, actNum, actInfo) return actWorldLV = actInfo.get(ShareDefine.ActKey_WorldLV, 0) GameWorld.DebugLog("ÏÉÏ»Ãؾ³ÖØÖÃ! actNum=%s,actID=%s,playerActID=%s,state=%s,cfgID=%s" % (actNum, actID, playerActID, state, cfgID), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJID % actNum, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJLayerNum % actNum, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJScore % actNum, 0) if state: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJWorldLV % actNum, actWorldLV) Sync_XianXiaMJActionInfo(curPlayer, actNum) __InitFirstLayerData(curPlayer, actNum, actInfo) return True def __InitFirstLayerData(curPlayer, actNum, actInfo): ## ³õʼ»¯ÊײãÊý¾Ý state = actInfo.get(ShareDefine.ActKey_State, 0) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID) if cfgID else None templateID = ipyData.GetTemplateID() if ipyData else 0 awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID) if templateID else [] if awardIpyDataList: for awardIpyData in awardIpyDataList: libType = awardIpyData.GetAwardLibType() libItemCount = max(awardIpyData.GetAwardItemCountList()) for num in xrange(libItemCount): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), 0) itemAwardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo() for itemID in itemAwardTimesTotalInfo.keys(): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID), 0) # »î¶¯ÖУ¬Éú³Éн±³Ø if state: __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList) Sync_XianXiaMJLayerInfo(curPlayer, actNum) return True def RefreshCrossActXianXiaMJInfo(): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerCrossActXianXiaMJ(curPlayer) return def __CheckPlayerCrossActXianXiaMJ(curPlayer): playerID = curPlayer.GetPlayerID() actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) dayIndex = actInfo.get(ShareDefine.ActKey_DayIndex, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_XianXiaMJID) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("¿ç·þÏÉÏ»Ãؾ³»î¶¯ID²»±ä£¬²»´¦Àí£¡cfgID=%s,dayIndex=%s,actID=%s" % (cfgID, dayIndex, actID), playerID) return GameWorld.DebugLog("¿ç·þÏÉÏ»Ãؾ³»î¶¯ÖØÖÃ! cfgID=%s,actID=%s,playerActID=%s,state=%s" % (cfgID, actID, playerActID, state), playerID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_XianXiaMJID, actID) if not state: CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_XianXiaMJ) Sync_CrossActXianXiaMJActionInfo(curPlayer) return True def SendToGameServer_XianXiaMJ(curPlayer, msgType, dataMsg=""): playerID = curPlayer.GetPlayerID() msgList = str([msgType, dataMsg]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "XianXiaMJ", msgList, len(msgList)) GameWorld.Log("ÏÉÏ»Ãؾ³·¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID) return def AddPlayerLotteryScore(curPlayer, actNum, addScore, isRelationCrossAct): if addScore <= 0: return 0 lotteryScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum) updLotteryScore = lotteryScore + addScore PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJScore % actNum, updLotteryScore) PlayerBillboard.UpdatePlayerBillboard(curPlayer, ShareDefine.Def_BT_XianXiaMJScore, updLotteryScore, autoSort=True) SendToGameServer_XianXiaMJ(curPlayer, "AddLotteryScore", [addScore, updLotteryScore, isRelationCrossAct]) return updLotteryScore def GetLayerSetByList(layerNum, setList): if not setList: return 0 return setList[layerNum - 1] if len(setList) >= layerNum else setList[-1] #// AA 16 ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½± #tagCMActXianXiaMJSuperItem # #struct tagCMActXianXiaMJSuperItem #{ # tagHead Head; # BYTE ActNum; //»î¶¯±àºÅ # BYTE SuperItemCount; //Ñ¡ÔñÎïÆ·ÊýÁ¿ # DWORD SuperItemIDList[SuperItemCount]; //Ñ¡ÔñµÄ´ó½±¿âÎïÆ·IDÁÐ±í£¬Ã¿´ÎÖØÐÂÑ¡ÔñÐèÒª·¢ËÍÈ«²¿ÒÑÑ¡ÔñµÄ´ó½±ÎïÆ·ID£¬²»ÄÜÖ»·¢µ¥¸öÎïÆ·ID; #}; def OnActXianXiaMJSuperItem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) actNum = clientData.ActNum superItemIDList = clientData.SuperItemIDList GameWorld.DebugLog("ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½±: actNum=%s,superItemIDList=%s" % (actNum, superItemIDList)) actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.DebugLog(" ·Ç»î¶¯ÖÐ!") return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID) if not ipyData: return templateID = ipyData.GetTemplateID() if not templateID: return layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum) actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum) awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID) if not awardIpyDataList: return superAwardIpyData = None for awardIpyData in awardIpyDataList: libType = awardIpyData.GetAwardLibType() if libType == Def_SuperLibType: superAwardIpyData = awardIpyData break if not superAwardIpyData: GameWorld.ErrLog("ûÓÐÅäÖÃÏÉÏ»Ãؾ³»î¶¯´ó½±¿â! cfgID=%s,actNum=%s,templateID=%s" % (cfgID, actNum, templateID)) return superLibItemCount = GetLayerSetByList(layerNum, superAwardIpyData.GetAwardItemCountList()) if len(superItemIDList) != superLibItemCount: GameWorld.ErrLog("ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½±¸öÊý´íÎó! cfgID=%s,actNum=%s,templateID=%s,layerNum=%s,superLibItemCount=%s,reqSuperItemIDList=%s" % (cfgID, actNum, templateID, layerNum, superLibItemCount, superItemIDList)) return posNumItemIDList = [] # ÒѳéÖеĴó½±ÎïÆ·ID libType = superAwardIpyData.GetAwardLibType() for num in xrange(superLibItemCount): itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num)) if not itemInfoValue: break itemID, posNum = itemInfoValue / 100, itemInfoValue % 100 if posNum and itemID not in superItemIDList: GameWorld.ErrLog("ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½±ID´íÎó! ÒѳéÖеĴó½±IDΪ±ØÑ¡ID£¡ posNum=%s, itemID=%s not in superItemIDList=%s" % (posNum, itemID, superItemIDList)) return if posNum: posNumItemIDList.append(itemID) GameWorld.DebugLog(" ÒѳéÖеĴó½±ID! %s" % posNumItemIDList) libItemDict = __GetXianXiaMJAwardLibItem(superAwardIpyData.GetLibItemInfo(), actWorldLV) layerLimitInfo = superAwardIpyData.GetItemLayerLimitInfo() awardTimesTotalInfo = superAwardIpyData.GetItemAwardTimesTotalInfo() replaceSuperItemIDList = [] # ÐèÒªÌæ»»µÄ´ó½±IDÁбí for selectItemID in superItemIDList: if selectItemID in posNumItemIDList: GameWorld.DebugLog(" ÒѳéÖеĴó½±ID£¬²»ÑéÖ¤£¡selectItemID=%s" % (selectItemID)) continue if selectItemID not in libItemDict: GameWorld.ErrLog("ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½±ID´íÎó! ´ó½±ID²»´æÔڴ󽱿âÖУ¡ selectItemID=%s not in libItemDict=%s" % (selectItemID, libItemDict)) return layerLimit = layerLimitInfo.get(selectItemID, 0) if layerLimit > layerNum: GameWorld.ErrLog("ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½±ID´íÎó! ´ó½±ID¸Ã²ã²»ÄÜÑ¡Ôñ£¡ selectItemID=%s layerLimit(%s) > layerNum(%s)" % (selectItemID, layerLimit, layerNum)) return totalTimesLimit = awardTimesTotalInfo.get(selectItemID, 0) if totalTimesLimit: totalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, selectItemID)) if totalTimesNow >= totalTimesLimit: GameWorld.ErrLog("ÏÉÏ»Ãؾ³»î¶¯Ñ¡Ôñ´ó½±ID´íÎó! ´ó½±IDÒÑ´ïµ½×î´ó½±Àø´ÎÊý£¬²»ÄÜÑ¡Ôñ£¡ selectItemID=%s totalTimesNow(%s) >= totalTimesLimit(%s)" % (selectItemID, totalTimesNow, totalTimesLimit)) return replaceSuperItemIDList.append(selectItemID) GameWorld.DebugLog(" Ñé֤ͨ¹ý£¬¿ÉÌæ»»´ó½±ID! replaceSuperItemIDList=%s" % replaceSuperItemIDList) if not replaceSuperItemIDList: return for num in xrange(superLibItemCount): itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num)) itemID, posNum = itemInfoValue / 100, itemInfoValue % 100 if itemID in posNumItemIDList: GameWorld.DebugLog(" ÒѳéÖеĴó½±ID£¬²»Ìæ»»£¡itemID=%s" % (itemID)) continue replaceSuperItemID = replaceSuperItemIDList.pop(0) updItemInfoValue = replaceSuperItemID * 100 + posNum PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), updItemInfoValue) GameWorld.DebugLog(" Ìæ»»´ó½±IDÑ¡Ôñ£¡num=%s,itemID=%s,posNum=%s,replaceSuperItemID=%s,updItemInfoValue=%s" % (num, itemID, posNum, replaceSuperItemID, updItemInfoValue)) if not replaceSuperItemIDList: break Sync_XianXiaMJLayerInfo(curPlayer, actNum) return #// AA 18 ÏÉÏ»Ãؾ³»î¶¯½±³ØˢР#tagCMActXianXiaMJAwardPoolRefresh # #struct tagCMActXianXiaMJAwardPoolRefresh #{ # tagHead Head; # BYTE ActNum; //»î¶¯±àºÅ #}; def OnActXianXiaMJAwardPoolRefresh(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) actNum = clientData.ActNum GameWorld.DebugLog("ÏÉÏ»Ãؾ³»î¶¯½±³ØË¢ÐÂ: actNum=%s" % (actNum)) actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.DebugLog(" ·Ç»î¶¯ÖÐ!") return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID) if not ipyData: return templateID = ipyData.GetTemplateID() if not templateID: return awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID) if not awardIpyDataList: return if not __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList): return Sync_XianXiaMJLayerInfo(curPlayer, actNum) return def __RefreshXianXiaMJAwardPool(curPlayer, actInfo, ipyData, awardIpyDataList): ## ˢн±³ØÎïÆ· cfgID = actInfo.get(ShareDefine.ActKey_CfgID) actNum = actInfo.get(ShareDefine.ActKey_ActNum, 0) actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum) layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum) GameWorld.DebugLog("Ë¢ÐÂÏÉÏ»Ãؾ³½±³ØÎïÆ·: cfgID=%s,actNum=%s,actWorldLV=%s,layerNum=%s" % (cfgID, actNum, actWorldLV, layerNum)) if layerNum: # ·Ç0²ã£¬ÑéÖ¤´ó½±ÊÇ·ñÒѳéÍ꣬³éÍê²Å¿ÉÒÔˢн±³Ø²ã superLib = False for awardIpyData in awardIpyDataList: libType = awardIpyData.GetAwardLibType() if libType != Def_SuperLibType: continue superLib = True libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList()) for num in xrange(libItemCount): itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num)) if not itemInfoValue: GameWorld.ErrLog("δѡÔñ´ó½±£¡ÎÞ·¨Ë¢Ð½±³Ø! cfgID=%s,actNum=%s,layerNum=%s,num=%s" % (cfgID, actNum, layerNum, num)) return itemID, posNum = itemInfoValue / 100, itemInfoValue % 100 if itemID and not posNum: GameWorld.ErrLog("Óдó½±Î´³éÖУ¡ÎÞ·¨Ë¢Ð½±³Ø! cfgID=%s,actNum=%s,layerNum=%s,num=%s,itemID=%s,posNum=%s" % (cfgID, actNum, layerNum, num, itemID, posNum)) return break if not superLib: GameWorld.ErrLog("½±³ØÅäÖÃûÓд󽱿⣡ÎÞ·¨Ë¢Ð½±³Ø! cfgID=%s,actNum=%s,layerNum=%s,superLib=%s" % (cfgID, actNum, layerNum, superLib)) return layerNum = min(layerNum + 1, 65530) # ¿Éˢн±³Ø£¬Ä¬ÈÏ+1²ã GameWorld.DebugLog(" ¿Éˢн±³Ø£¡ÏÂÒ»²ã: layerNum=%s" % (layerNum)) refreshLibDict = {} for awardIpyData in awardIpyDataList: libType = awardIpyData.GetAwardLibType() libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList()) libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV) layerLimitInfo = awardIpyData.GetItemLayerLimitInfo() awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo() canRandItemDict = {} for itemID, libItemInfo in libItemDict.items(): _, weight = libItemInfo layerLimit = layerLimitInfo.get(itemID, 0) if layerLimit > layerNum: GameWorld.DebugLog(" ¸Ã²ã²»ÄÜÑ¡Ôñ¸Ã½±Æ·£¡ itemID=%s layerLimit(%s) > layerNum(%s)" % (itemID, layerLimit, layerNum)) continue totalTimesLimit = awardTimesTotalInfo.get(itemID, 0) if totalTimesLimit: totalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID)) if totalTimesNow >= totalTimesLimit: GameWorld.DebugLog(" ½±Æ·IDÒÑ´ïµ½×î´ó½±Àø´ÎÊý£¬²»ÄÜÑ¡Ôñ£¡ itemID=%s totalTimesNow(%s) >= totalTimesLimit(%s)" % (itemID, totalTimesNow, totalTimesLimit)) continue canRandItemDict[itemID] = [weight, itemID] if libItemCount > len(canRandItemDict): GameWorld.ErrLog("½±Æ·¿âÅäÖÿÉÑ¡Ôñ½±Æ·¸öÊý²»¹»£¡ÎÞ·¨Ë¢Ð½±³Ø! cfgID=%s,actNum=%s,libType=%s,layerNum=%s,libItemCount=%s > %s canRandItemDict(%s)" % (cfgID, actNum, libType, layerNum, libItemCount, len(canRandItemDict), canRandItemDict)) return refreshLibDict[libType] = [libItemCount, canRandItemDict] for libType, refreshInfo in refreshLibDict.items(): libItemCount, canRandItemDict = refreshInfo GameWorld.DebugLog(" Ëæ»ú½±³ØÎïÆ·: libType=%s,libItemCount=%s,canRandItemDict=%s, %s" % (libType, libItemCount, len(canRandItemDict), canRandItemDict)) if libType == Def_SuperLibType: # ´ó½±Ö±½ÓÖØÖã¬ÏµÍ³²»Éú³É£¬ÓÉÍæ¼ÒÊÖ¶¯Ñ¡Ôñ for num in xrange(libItemCount): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), 0) continue for num in xrange(libItemCount): weightList = canRandItemDict.values() randItemID = GameWorld.GetResultByWeightList(weightList) canRandItemDict.pop(randItemID, None) posNum = 0 itemInfoValue = randItemID * 100 + posNum PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), itemInfoValue) GameWorld.DebugLog(" Ëæ»úÉú³É½±Æ·! libType=%s,num=%s,randItemID=%s" % (libType, num, randItemID)) playCount = 0 # ÿ²ãÖØÖó齱´ÎÊý PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJLayerNum % actNum, layerNum) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, playCount) GameWorld.DebugLog(" Ë¢ÐÂÍê³É! layerNum=%s,playCount=%s" % (layerNum, playCount)) PlayerActTask.UpdActTaskValue(curPlayer, ChConfig.ActTaskType_XianXiaMJLayer, layerNum) if layerNum > 1: AddPlayerLotteryScore(curPlayer, actNum, ipyData.GetLayerAddScore(), ipyData.GetIsRelationCrossAct()) return True #// AA 17 ÏÉÏ»Ãؾ³»î¶¯³é½± #tagCMActXianXiaMJLottery # #struct tagCMActXianXiaMJLottery #{ # tagHead Head; # BYTE ActNum; //»î¶¯±àºÅ # BYTE PosNum; //Íæ¼Òµã»÷µÄ½±ÀøλÖñàºÅ£¬´Ó1¿ªÊ¼ #}; def OnActXianXiaMJLottery(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) actNum = clientData.ActNum reqPosNum = clientData.PosNum GameWorld.DebugLog("ÏÉÏ»Ãؾ³»î¶¯³é½±: actNum=%s,reqPosNum=%s" % (actNum, reqPosNum)) if reqPosNum <= 0: return actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum) if not actInfo.get(ShareDefine.ActKey_State): GameWorld.DebugLog(" ·Ç»î¶¯ÖÐ!") return playerID = curPlayer.GetPlayerID() cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID) if not ipyData: return if ipyData.GetIsRelationCrossAct(): crossActInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ) if crossActInfo.get(ShareDefine.ActKey_State, 0): if crossActInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start: GameWorld.Log("¿ç·þÏÉÏ»Ãؾ³·Ç²ÎÓë»î¶¯ÖÐ: actNum=%s" % actNum, playerID) return else: if actInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start: GameWorld.Log("ÏÉÏ»Ãؾ³·Ç²ÎÓë»î¶¯ÖÐ: actNum=%s" % actNum, playerID) return templateID = ipyData.GetTemplateID() if not templateID: return actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum) awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID) if not awardIpyDataList: return checkUseMoney = False costItemID = ipyData.GetUseItemID() costItemCount = 1 if costItemID: costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount) lackCnt = costItemCount - bindCnt - unBindCnt if lackCnt > 0: checkUseMoney = True else: checkUseMoney = True costMoneyType, costMoneyValue = ipyData.GetUseMoneyInfo() if checkUseMoney: if not costMoneyType or not costMoneyValue: return if not PlayerControl.HaveMoney(curPlayer, costMoneyType, costMoneyValue): GameWorld.DebugLog(" »õ±Ò²»×㣬ÎÞ·¨³é½±! costMoneyType=%s,costMoneyValue(%s) > curMoneyValue(%s)" % (costMoneyType, costMoneyValue, PlayerControl.GetMoney(curPlayer, costMoneyType))) return layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum) playCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJPlayCount % actNum) GameWorld.DebugLog("layerNum=%s,playCount=%s" % (layerNum, playCount)) posNumMax = 0 randLibItemDict = {} for awardIpyData in awardIpyDataList: libType = awardIpyData.GetAwardLibType() libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList()) unlockLimitTimes = GetLayerSetByList(layerNum, awardIpyData.GetUnlockAwardLimitTimesList()) libWeight = GetLayerSetByList(layerNum, awardIpyData.GetAwardLibWeightList()) posNumMax += libItemCount if libType == Def_SuperLibType: for num in xrange(libItemCount): itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num)) if not itemInfoValue: GameWorld.DebugLog(" δѡÔñ´ó½±£¡ÎÞ·¨³é½±! libType=%s,num=%s,itemInfoValue=%s" % (libType, num, itemInfoValue)) return if unlockLimitTimes and playCount < unlockLimitTimes: GameWorld.DebugLog(" ¸Ã¿âµ±Ç°³é½±´ÎÊýÎÞ·¨½âËø! libType=%s,playCount(%s) < unlockLimitTimes(%s)" % (libType, playCount, unlockLimitTimes)) continue awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo() libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV) canRandItemList = [] for num in xrange(libItemCount): itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num)) if not itemInfoValue: return itemID, posNum = itemInfoValue / 100, itemInfoValue % 100 if itemID not in libItemDict: continue if posNum: GameWorld.DebugLog(" ¸Ã½±Æ·Òѱ»³éÖÐ! libType=%s,itemID=%s,posNum=%s" % (libType, itemID, posNum)) if posNum == reqPosNum: GameWorld.ErrLog(" ¸ÃλÖÃÒѾ­Óг齱½á¹û£¬ÎÞ·¨Öظ´Ñ¡Ôñ³é½±! libType=%s,num=%s,itemInfoValue=%s,posNum=%s" % (libType, num, itemInfoValue, posNum)) return continue itemCount, weight = libItemDict[itemID] isAddTimes = (itemID in awardTimesTotalInfo) canRandItemList.append([weight, itemID, itemCount, num, isAddTimes]) if canRandItemList: randLibItemDict[libType] = [libWeight, libType, canRandItemList] GameWorld.DebugLog(" ¸Ã¿âÓлú»á³éµ½ÎïÆ·: libType=%s,libWeight=%s,canRandItemList=%s" % (libType, libWeight, canRandItemList)) else: GameWorld.DebugLog(" ¸Ã¿âÎïÆ·ÒÑÈ«±»³éÍê: libType=%s,libWeight=%s,canRandItemList=%s" % (libType, libWeight, canRandItemList)) if reqPosNum > posNumMax: GameWorld.DebugLog(" ÇëÇóλÖÃÒì³££¬ÎÞ·¨³é½±! reqPosNum(%s) > posNumMax(%s)" % (reqPosNum, posNumMax)) return if not randLibItemDict: GameWorld.DebugLog(" ûÓпɳ齱µÄ½±Æ·ÁË£¬ÎÞ·¨³é½±!") return randLibInfo = GameWorld.GetResultByWeightList(randLibItemDict.values()) if not randLibInfo: return libType, canRandItemList = randLibInfo randItemInfo = GameWorld.GetResultByWeightList(canRandItemList) if not randItemInfo: return itemID, itemCount, num, isAddTimes = randItemInfo # ¿Û³ýÏûºÄ if checkUseMoney: PlayerControl.PayMoney(curPlayer, costMoneyType, costMoneyValue, "ActXianXiaMJ") GameWorld.DebugLog("ÏûºÄ»õ±Ò: costMoneyType=%s,costMoneyValue=%s" % (costMoneyType, costMoneyValue)) else: GameWorld.DebugLog("ÏûºÄµÀ¾ß: costItemID=%s,costItemCount=%s %s" % (costItemID, costItemCount, costItemIndexList)) ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, costItemCount, "XianXiaMJ") # ¸üÐÂÒѳéÖÐÖµ updItemInfoValue = itemID * 100 + reqPosNum PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num), updItemInfoValue) totalTimesNow = 0 if isAddTimes: totalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID)) + 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID), totalTimesNow) playCount += 1 PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_XianXiaMJPlayCount % actNum, playCount) GameWorld.DebugLog(" ³éÖÐÎïÆ·: layerNum=%s,libType=%s,itemID=%s,itemCount=%s,num=%s,reqPosNum=%s,updItemInfoValue=%s,totalTimesNow=%s,playCount=%s" % (layerNum, libType, itemID, itemCount, num, reqPosNum, updItemInfoValue, totalTimesNow, playCount)) # ¸øÎïÆ· isAuctionItem = 0 itemList = [[itemID, itemCount, isAuctionItem]] ItemControler.GivePlayerItemOrMail(curPlayer, itemList, event=["XianXiaMJLottery", False, {}]) # ÈÎÎñ PlayerActTask.AddActTaskValue(curPlayer, ChConfig.ActTaskType_XianXiaMJLottery, 1) # ¹ã²¥ if libType == Def_SuperLibType: PlayerControl.WorldNotify(0, "XianXiaMJ%s" % actNum, [curPlayer.GetPlayerName(), itemID, itemCount]) # »ý·Ö lotteryScore = AddPlayerLotteryScore(curPlayer, actNum, ipyData.GetLotteryAddScore(), ipyData.GetIsRelationCrossAct()) # ֪ͨ³é½±½á¹û clientPack = ChPyNetSendPack.tagMCActXianXiaMJAwardItemResult() clientPack.ActNum = actNum clientPack.ItemLibType = libType clientPack.ItemID = itemID clientPack.ItemCount = itemCount clientPack.PosNum = reqPosNum clientPack.TotalTimesNow = totalTimesNow clientPack.LotteryScore = lotteryScore NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_XianXiaMJActionInfo(curPlayer, actNum): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID) if not ipyData: return costMoneyType, costMoneyValue = ipyData.GetUseMoneyInfo() personalTempID = ipyData.GetPersonalTemplateID() personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", personalTempID) if personalTempID else [] startDateStr, endDateStr = GameWorld.GetOperationActionDateStr(ipyData) clientPack = ChPyNetSendPack.tagMCActXianXiaMJInfo() clientPack.ActNum = actNum clientPack.StartDate = startDateStr clientPack.EndtDate = endDateStr clientPack.JoinStartTime = ipyData.GetJoinStartTime() clientPack.JoinEndTime = ipyData.GetJoinEndTime() clientPack.IsDayReset = ipyData.GetIsDayReset() clientPack.LimitLV = ipyData.GetLVLimit() clientPack.UseItemID = ipyData.GetUseItemID() clientPack.MoneyType = costMoneyType clientPack.MoneyValue = costMoneyValue clientPack.LotteryAddScore = ipyData.GetLotteryAddScore() clientPack.LayerAddScore = ipyData.GetLayerAddScore() clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList) clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def __GetXianXiaMJAwardLibItem(libItemInfo, actWorldLV): ## »ñÈ¡½±Àø¿âÎïÆ·ÐÅÏ¢×ֵ䣬֧³Ö°´ÊÀ½çµÈ¼¶·¶Î§ÅäÖõĸñʽ keyList = libItemInfo.keys() if not keyList: return {} if isinstance(keyList[0], tuple) and len(keyList[0]) == 2: return GameWorld.GetDictValueByRangeKey(libItemInfo, actWorldLV, {}) return libItemInfo def Sync_XianXiaMJLayerInfo(curPlayer, actNum): actInfo = GameWorld.GetActInfo(ShareDefine.OperationActionName_XianXiaMJ, actNum) if not actInfo.get(ShareDefine.ActKey_State): return cfgID = actInfo.get(ShareDefine.ActKey_CfgID) ipyData = IpyGameDataPY.GetIpyGameData("ActXianXiaMJ", cfgID) if not ipyData: return templateID = ipyData.GetTemplateID() if not templateID: return actWorldLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJWorldLV % actNum) layerNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJLayerNum % actNum) clientPack = ChPyNetSendPack.tagMCActXianXiaMJLayerInfo() clientPack.ActNum = actNum clientPack.LayerNum = layerNum clientPack.LotteryScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJScore % actNum) clientPack.AwardItemList = [] # ½±³ØÎïÆ·Áбí awardIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJAward", templateID) if awardIpyDataList: for awardIpyData in awardIpyDataList: libType = awardIpyData.GetAwardLibType() libItemCount = GetLayerSetByList(layerNum, awardIpyData.GetAwardItemCountList()) libItemDict = __GetXianXiaMJAwardLibItem(awardIpyData.GetLibItemInfo(), actWorldLV) layerLimitInfo = awardIpyData.GetItemLayerLimitInfo() awardTimesTotalInfo = awardIpyData.GetItemAwardTimesTotalInfo() # ½±³ØÎïÆ·ÁÐ±í£¬ÒÑÉú³ÉµÄ£¬°üº¬ÒÑÑ¡ÔñµÄ´ó½±ÎïÆ· for num in xrange(libItemCount): itemInfoValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemInfo % (actNum, libType, num)) if not itemInfoValue: break itemID, posNum = itemInfoValue / 100, itemInfoValue % 100 if itemID not in libItemDict: continue libItemInfo = libItemDict[itemID] layerItem = ChPyNetSendPack.tagMCActXianXiaMJLayerItem() layerItem.ItemLibType = libType layerItem.ItemID = itemID layerItem.ItemCount = libItemInfo[0] layerItem.PosNum = posNum layerItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0) layerItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID)) layerItem.LayerLimit = layerLimitInfo.get(itemID, 0) clientPack.AwardItemList.append(layerItem) # ´ó½±ÎïÆ·´ýÑ¡Ôñ¿â£¬È«²¿Í¬²½ if libType == Def_SuperLibType: for itemID, libItemInfo in libItemDict.items(): layerItem = ChPyNetSendPack.tagMCActXianXiaMJLayerItem() layerItem.ItemLibType = libType layerItem.ItemID = itemID layerItem.ItemCount = libItemInfo[0] layerItem.TotalTimesMax = awardTimesTotalInfo.get(itemID, 0) layerItem.TotalTimesNow = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XianXiaMJAwardItemTimes % (actNum, libType, itemID)) layerItem.LayerLimit = layerLimitInfo.get(itemID, 0) clientPack.SuperItemList.append(layerItem) clientPack.SuperItemCount = len(clientPack.SuperItemList) clientPack.SuperItemCanChooseCount = libItemCount clientPack.AwardItemCount = len(clientPack.AwardItemList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_CrossActXianXiaMJActionInfo(curPlayer): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_XianXiaMJ) if not actInfo: return if not actInfo.get(ShareDefine.ActKey_State): return ipyDataDict = actInfo.get(ShareDefine.ActKey_IpyDataInfo, {}) if not ipyDataDict: return personalTempID = ipyDataDict.get("PersonalTemplateID", 0) personalTempIpyDataList = IpyGameDataPY.GetIpyGameDataList("ActXianXiaMJBillTemp", personalTempID) if personalTempID else [] clientPack = ChPyNetSendPack.tagMCCrossActXianXiaMJInfo() clientPack.ServerIDRangeInfo = str(actInfo.get(ShareDefine.ActKey_ServerIDRangeList, [])) clientPack.ServerInfoLen = len(clientPack.ServerIDRangeInfo) clientPack.GroupValue1 = ipyDataDict.get("ZoneID", 0) clientPack.StartDate = ipyDataDict.get("StartDate", "") clientPack.EndtDate = ipyDataDict.get("EndDate", "") clientPack.JoinStartTime = ipyDataDict.get("JoinStartTime", "") clientPack.JoinEndTime = ipyDataDict.get("JoinEndTime", "") clientPack.IsDayReset = ipyDataDict.get("IsDayReset", 0) clientPack.PersonalBillboardInfoList = __GetTempRankBillPackList(personalTempIpyDataList) clientPack.PersonalBillCount = len(clientPack.PersonalBillboardInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def __GetTempRankBillPackList(ipyDataList): packBillList = [] if not ipyDataList: return packBillList for tempIpyData in ipyDataList: rankInfo = ChPyNetSendPack.tagMCActXianXiaMJBillard() rankInfo.Rank = tempIpyData.GetRank() rankInfo.AwardItemList = [] awardItemList = tempIpyData.GetAwardItemList() for itemID, itemCount, isAuctionItem in awardItemList: item = ChPyNetSendPack.tagMCActXianXiaMJItem() item.Clear() item.ItemID = itemID item.ItemCount = itemCount item.IsBind = isAuctionItem rankInfo.AwardItemList.append(item) rankInfo.Count = len(rankInfo.AwardItemList) # rankInfo.MemAwardItemList = [] # memAwardItemList = tempIpyData.GetMemAwardItemList() # for itemID, itemCount, isAuctionItem in memAwardItemList: # item = ChPyNetSendPack.tagMCActXianXiaMJItem() # item.Clear() # item.ItemID = itemID # item.ItemCount = itemCount # item.IsBind = isAuctionItem # rankInfo.MemAwardItemList.append(item) # rankInfo.MemCount = len(rankInfo.MemAwardItemList) rankInfo.NeedScore = tempIpyData.GetNeedScore() rankInfo.AwardItemExList = [] scoreAwardEx = tempIpyData.GetScoreAwardEx() scoreExList = scoreAwardEx.keys() scoreExList.sort() for scoreEx in scoreExList: itemExList = scoreAwardEx[scoreEx] awardEx = ChPyNetSendPack.tagMCActXianXiaMJAwardEx() awardEx.NeedScore = scoreEx awardEx.AwardItemList = [] for itemID, itemCount, isAuctionItem in itemExList: item = ChPyNetSendPack.tagMCActXianXiaMJItem() item.Clear() item.ItemID = itemID item.ItemCount = itemCount item.IsBind = isAuctionItem awardEx.AwardItemList.append(item) awardEx.Count = len(awardEx.AwardItemList) rankInfo.AwardItemExList.append(awardEx) rankInfo.CountEx = len(rankInfo.AwardItemExList) packBillList.append(rankInfo) return packBillList