#!/usr/bin/python # -*- coding: GBK -*- #------------------------------------------------------------------------------- # ##@package Player.PlayerActLianqi # # @todo:Á¶Æ÷»î¶¯ # @author hxp # @date 2025-01-09 # @version 1.0 # # ÏêϸÃèÊö: Á¶Æ÷»î¶¯ # #------------------------------------------------------------------------------- #"""Version = 2025-01-09 17:30""" #------------------------------------------------------------------------------- import ShareDefine import PlayerControl import IpyGameDataPY import NetPackCommon import ChPyNetSendPack import CrossRealmPlayer import PlayerZhanling import ItemControler import ItemCommon import GameWorld import ChConfig import random import time Def_Size = 4 # ÐÐÁÐÊý Def_MaxLV = 11 # ×î´óµÈ¼¶£¬2048 def OnPlayerLogin(curPlayer): if not __CheckPlayerCrossActLianqi(curPlayer): Sync_CrossActLianqiActionInfo(curPlayer) Sync_LianqiPlayerInfo(curPlayer) return def RefreshCrossActLianqiInfo(): ## ÊÕµ½GameServerͬ²½µÄ»î¶¯ÐÅÏ¢£¬Ë¢Ð»ÐÅÏ¢ playerManager = GameWorld.GetPlayerManager() for index in xrange(playerManager.GetPlayerCount()): curPlayer = playerManager.GetPlayerByIndex(index) if not GameWorld.IsNormalPlayer(curPlayer): continue __CheckPlayerCrossActLianqi(curPlayer) return def __CheckPlayerCrossActLianqi(curPlayer): playerID = curPlayer.GetPlayerID() actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Lianqi) cfgID = actInfo.get(ShareDefine.ActKey_CfgID, 0) actID = actInfo.get(ShareDefine.ActKey_ID, 0) state = actInfo.get(ShareDefine.ActKey_State, 0) playerActID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_LianqiID) # Íæ¼ÒÉíÉϵĻID # »î¶¯ID ÏàͬµÄ»°²»´¦Àí if actID == playerActID: GameWorld.DebugLog("¿ç·þÁ¶Æ÷»î¶¯ID²»±ä£¬²»´¦Àí£¡cfgID=%s,actID=%s" % (cfgID, actID), playerID) return GameWorld.DebugLog("¿ç·þÁ¶Æ÷»î¶¯ÖØÖÃ! cfgID=%s,actID=%s,playerActID=%s,state=%s" % (cfgID, actID, playerActID, state), playerID) PlayerZhanling.ResetZhanling(curPlayer, PlayerZhanling.ZhanlingType_Lianqi) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_CA_LianqiID, actID) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiScore, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiScoreHighest, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergy, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergyTime, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiLVAwardMax, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiLVAwardState, 0) for row in range(Def_Size): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiRowData % row, 0) for itemID in IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 1): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiItemUse % itemID, 0) # »ØÊÕµÀ¾ß for itemID in IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 5): ItemControler.RecycleItem(curPlayer, itemID, "ActLianqiRecycleItem") if state: SetLianqiEnergy(curPlayer, IpyGameDataPY.GetFuncCfg("LianqiSet", 1)) ReStartGame(curPlayer, isNotify=False) Sync_CrossActLianqiActionInfo(curPlayer) Sync_LianqiPlayerInfo(curPlayer) else: CrossRealmPlayer.NotifyCrossActEnd(curPlayer, ShareDefine.CrossActName_Lianqi) return True def ReStartGame(curPlayer, opType=0, isNotify=True): ## ÖØÐ¿ªÊ¼ÓÎÏ· # ÖØÖûý·Ö PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiScore, 0) # ÖØÖõ¥¾ÖʹÓõÀ¾ß´ÎÊý for itemID in IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 1): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiItemUse % itemID, 0) # ³õʼ»¯ÆåÅÌ initRandCount = IpyGameDataPY.GetFuncCfg("LianqiRand", 1) randList = range(Def_Size * Def_Size) random.shuffle(randList) randList = randList[:initRandCount] gridDataList = [] for row in range(Def_Size): rowDataList = [] for col in range(Def_Size): lv = 1 if (row * Def_Size + col) in randList else 0 rowDataList.append(lv) gridDataList.append(rowDataList) PrintGridData(curPlayer, gridDataList, "ÖØÐ¿ªÊ¼Á¶Æ÷: %s" % randList) SaveGridData(curPlayer, gridDataList) if isNotify: Sync_LianqiPlayerInfo(curPlayer, opType) return def GetGridDataList(curPlayer): ## »ñÈ¡ÐÐÁÐÊý¾ÝÁбí gridDataList = [] for row in range(Def_Size): rowDataValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiRowData % row) rowDataList = [] for _ in range(Def_Size): colValue = rowDataValue % 100 rowDataValue = rowDataValue / 100 rowDataList.insert(0, colValue) gridDataList.append(rowDataList) return gridDataList def PrintGridData(curPlayer, gridDataList, printTitle): GameWorld.DebugLog("%s" % printTitle, curPlayer.GetPlayerID()) for rowData in gridDataList: rowStr = "" for lv in rowData: if rowStr: rowStr += ", " if lv < 10: rowStr += " " rowStr += str(lv) GameWorld.DebugLog("[%s]" % rowStr, curPlayer.GetPlayerID()) return def SaveGridData(curPlayer, gridDataList): ## ±£´æÐÐÁÐÊý¾Ý for row in range(Def_Size): rowDataStr = "" for col in range(Def_Size): rowDataStr += "%02d" % gridDataList[row][col] rowDataValue = int(rowDataStr) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiRowData % row, rowDataValue) return #// AA 25 Á¶Æ÷²Ù×÷ #tagCMActLianqiOP # #struct tagCMActLianqiOP #{ # tagHead Head; # BYTE OPType; // 1-ÒÆ¶¯£»2-ʹÓõÀ¾ß£»3-ÖØÐ¿ªÊ¼£»4-ÁìÈ¡µÈ¼¶½±Àø # DWORD OPValue; // ÒÆ¶¯Ê±-·¢1ÉÏ2ÏÂ3×ó4ÓÒ£»Ê¹ÓõÀ¾ßʱ-·¢Ê¹ÓøöÊý*10+µÀ¾ßIDËùÔÚÅäÖÃË÷Òý£»µÈ¼¶½±ÀøÊ±-·¢ÁìÈ¡µÄ½±ÀøµÈ¼¶ # DWORD OPValue2; // ʹÓõÀ¾ßʱ-·¢Ñ¡Öиñ×ÓAµÄÐÐÁÐÖµ ÐÐ*10+ÁÐ # DWORD OPValue3; // ʹÓõÀ¾ßʱ-·¢Ñ¡Öиñ×ÓBµÄÐÐÁÐÖµ ÐÐ*10+ÁÐ #}; def OnActLianqiOP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() OPType = clientData.OPType OPValue = clientData.OPValue OPValue2 = clientData.OPValue2 OPValue3 = clientData.OPValue3 if OPType not in [4]: actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Lianqi) if not actInfo: GameWorld.DebugLog("·ÇÁ¶Æ÷»î¶¯ÖУ¬ÎÞ·¨²Ù×÷! OPType=%s" % OPType, playerID) return if actInfo.get(ShareDefine.ActKey_StateJoin) != ShareDefine.ActStateJoin_Start: GameWorld.DebugLog("·ÇÁ¶Æ÷»î¶¯²ÎÓëÖУ¬ÎÞ·¨²Ù×÷! OPType=%s" % OPType, playerID) return if OPType == 1: OnMove(curPlayer, OPType, OPValue) elif OPType == 2: OnUseItem(curPlayer, OPType, OPValue, OPValue2, OPValue3) elif OPType == 3: ReStartGame(curPlayer, OPType) elif OPType == 4: OnGetLVAward(curPlayer, OPType, OPValue) return def GetGridLV(r, c, gridDataList): ## »ñÈ¡¸ñ×ÓÖеÄͼ¿éµÈ¼¶ # @return: None-Ô½½ç£»0-¿ÕλÖã»>0-¶ÔÓ¦µÈ¼¶ if 0 <= r < len(gridDataList) and 0 <= c < len(gridDataList[r]): lv = gridDataList[r][c] return lv return def OnMove(curPlayer, opType, moveDir): ## ÒÆ¶¯ playerID = curPlayer.GetPlayerID() curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergy) if not curEnergy: GameWorld.DebugLog("Á¶Æ÷ÎÞÌåÁ¦£¬ÎÞ·¨Òƶ¯!", playerID) return moveDirCn = "" v = [] # ÒÆ¶¯ÐÐÁÐÏòÁ¿ if moveDir == 1: # ÉÏ v = (-1, 0) moveDirCn = "ÉÏ" elif moveDir == 2: # Ï v = (1, 0) moveDirCn = "ÏÂ" elif moveDir == 3: # ×ó v = (0, -1) moveDirCn = "×ó" elif moveDir == 4: # ÓÒ v = (0, 1) moveDirCn = "ÓÒ" else: GameWorld.DebugLog("Á¶Æ÷·½Ïò´íÎó£¬ÎÞ·¨Òƶ¯! moveDir=%s" % moveDir, playerID) return GameWorld.DebugLog("Á¶Æ÷ÒÆ¶¯: moveDir=%s%s,v=%s,curEnergy=%s" % (moveDir, moveDirCn, v, curEnergy), playerID) gridDataList = GetGridDataList(curPlayer) PrintGridData(curPlayer, gridDataList, "ÒÆ¶¯Ç°") vr, vc = v loopList = range(Def_Size) if (vr < 0 or vc < 0) else range(Def_Size)[::-1] lvUPRCList = [] # ÒѾ­Éý¼¶¹ýµÄλÖÃÁÐ±í£¬Ã¿´ÎÒÆ¶¯µ¥¸öλÖÃÖ»ÄÜÉý¼¶Ò»´Î moveList = [] # ÒÆ¶¯ÐÅÏ¢ addScoreTotal = 0 for r in loopList: for c in loopList: lv = GetGridLV(r, c, gridDataList) moveTo = [] if not lv: #¿ÕλÖà continue toR, toC = r, c isUp = False for _ in range(Def_Size): toR += vr toC += vc if [toR, toC] in lvUPRCList: # ÒѾ­Éý¼¶¹ýµÄλÖÃÊÓΪÕϰ­µã, toR, toC break lvTo = GetGridLV(toR, toC, gridDataList) if lvTo == None: # ³¬³ö±ß½çÁË, toR, toC break if not lvTo: moveTo = [toR, toC] isUp = False # ¿ÕλÖÃÖ±½ÓÌæ»», toR, toC elif lv == lvTo and lv < Def_MaxLV: moveTo = [toR, toC] isUp = True # ¿ÉÉý¼¶, toR, toC else: # ÆäËûÇé¿ö¾ùÊÓΪÕϰ­µã£¬±»¶ÂסÁË, toR, toC break if moveTo: toR, toC = moveTo gridDataList[r][c] = 0 # ԭλÖÃÖÃ¿Õ if isUp: lv += 1 addScore = pow(2, lv) addScoreTotal += addScore GameWorld.DebugLog("ºÏ³ÉµÈ¼¶: %s,addScore=%s,addScoreTotal=%s, RC(%s,%s) to (%s,%s)" % (lv, addScore, addScoreTotal, r, c, toR, toC), playerID) lvUPRCList.append([toR, toC]) gridDataList[toR][toC] = lv # Ìæ»»µ½ÐÂλÖà moveList.append([r, c, toR, toC]) GameWorld.DebugLog("ÒÆ¶¯¶ÓÁÐ: %s" % moveList, playerID) if not moveList: PlayerControl.NotifyCode(curPlayer, "LianqiMoveUnable") return # Ëæ»úÉú³ÉÐÂͼ¿é maxLVNow = 0 emptyGridList = [] for row in range(Def_Size): for col in range(Def_Size): lv = gridDataList[row][col] if not lv: emptyGridList.append([row, col]) else: if lv >= Def_MaxLV and maxLVNow >= Def_MaxLV: maxLVNow += 1 else: maxLVNow = max(lv, maxLVNow) if emptyGridList: row, col = random.choice(emptyGridList) randRateList = [] randRateDict = IpyGameDataPY.GetFuncEvalCfg("LianqiRand", 2, {}) for lvRange in randRateDict.keys(): if isinstance(lvRange, tuple) and len(lvRange) == 2 and lvRange[0] <= maxLVNow <= lvRange[1]: randRateList = randRateDict[lvRange] randLV = GameWorld.GetResultByRandomList(randRateList, 1) gridDataList[row][col] = randLV GameWorld.DebugLog("Ëæ»úÌí¼Ó: maxLVNow=%s,row=%s,col=%s,randLV=%s, %s" % (maxLVNow, row, col, randLV, randRateList), playerID) PrintGridData(curPlayer, gridDataList, "ÒÆ¶¯ºó") SetLianqiEnergy(curPlayer, curEnergy - 1) AddLianqiScore(curPlayer, addScoreTotal, maxLVNow) SaveGridData(curPlayer, gridDataList) Sync_LianqiPlayerInfo(curPlayer, opType, moveList) return True def OnUseItem(curPlayer, opType, useInfo, opValue2, opValue3): ## ʹÓø¨ÖúµÀ¾ß playerID = curPlayer.GetPlayerID() itemIDList = IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 1) useItemCount = max(1, useInfo / 10) # ÖÁÉÙ1¸ö useIndex = useInfo % 10 if useIndex < 0 or useIndex >= len(itemIDList): GameWorld.DebugLog("Á¶Æ÷¸¨ÖúµÀ¾ßË÷Òý²»´æÔÚ! useIndex=%s" % (useIndex), playerID) return itemID = itemIDList[useIndex] useLimitDict = IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 2) limitCnt = useLimitDict.get(str(itemID), 0) alreadyUsedCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiItemUse % itemID) if limitCnt > 0 and alreadyUsedCnt >= limitCnt: GameWorld.DebugLog("Á¶Æ÷µ¥¾ÖʹÓøõÀ¾ß´ÎÊýÒÑ´ïÉÏÏÞ! useIndex=%s,itemID=%s,alreadyUsedCnt=%s >= %s" % (useIndex, itemID, alreadyUsedCnt, limitCnt), playerID) return costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, itemID, useItemCount) lackCount = max(0, useItemCount - bindCnt - unBindCnt) if lackCount > 0: GameWorld.DebugLog("Á¶Æ÷¸¨ÖúµÀ¾ß²»×ã! useIndex=%s,itemID=%s,lackCount=%s" % (useIndex, itemID, lackCount), playerID) return rA, cA = opValue2 / 10, opValue2 % 10 rB, cB = opValue3 / 10, opValue3 % 10 gridDataList = GetGridDataList(curPlayer) # ËéÌì´¸£¬Ïû³ýÈÎÒâλÖã¬ÇÒ²»¼õ·Ö if useIndex == 0: lvA = GetGridLV(rA, cA, gridDataList) if not lvA: GameWorld.DebugLog("Á¶Æ÷µ±Ç°¸ñ×Ó²»´æÔÚ»òΪ¿Õ£¬ÎÞÐèʹÓøõÀ¾ß! useIndex=%s,itemID=%s,rA=%s,cA=%s,lvA=%s" % (useIndex, itemID, rA, cA, lvA), playerID) return GameWorld.DebugLog("Á¶Æ÷ʹÓÃÏû³ýÈÎÒâλÖõÀ¾ß! useIndex=%s,itemID=%s,rA=%s,cA=%s,lvA=%s" % (useIndex, itemID, rA, cA, lvA), playerID) PrintGridData(curPlayer, gridDataList, "ʹÓÃǰ") gridDataList[rA][cA] = 0 SaveGridData(curPlayer, gridDataList) PrintGridData(curPlayer, gridDataList, "ʹÓúó") # Ô컯ÁéÓñ£¬½»»»ÈÎÒâÁ½¸öλÖà elif useIndex == 1: lvA = GetGridLV(rA, cA, gridDataList) lvB = GetGridLV(rB, cB, gridDataList) if not lvA or not lvB: GameWorld.DebugLog("Á¶Æ÷A»òB¸ñ×Ó²»´æÔÚ»òΪ¿Õ£¬ÎÞÐèʹÓøõÀ¾ß! useIndex=%s,itemID=%s,rA=%s,cA=%s,lvA=%s,rB=%s,cB=%s,lvB=%s" % (useIndex, itemID, rA, cA, lvA, rB, cB, lvB), playerID) return GameWorld.DebugLog("Á¶Æ÷ʹÓý»»»ÈÎÒâÁ½¸öλÖõÀ¾ß! useIndex=%s,itemID=%s,rA=%s,cA=%s,lvA=%s,rB=%s,cB=%s,lvB=%s" % (useIndex, itemID, rA, cA, lvA, rB, cB, lvB), playerID) PrintGridData(curPlayer, gridDataList, "ʹÓÃǰ") gridDataList[rA][cA] = lvB gridDataList[rB][cB] = lvA SaveGridData(curPlayer, gridDataList) PrintGridData(curPlayer, gridDataList, "ʹÓúó") # ¾ÅÌìÔÉÌú£¬½«ÈÎÒâ1¸ö7½×ÒÔϽø½×£¬²¢»ñµÃ»ý·Ö¼°½âËøµÈ¼¶½±Àø elif useIndex == 2: lvA = GetGridLV(rA, cA, gridDataList) lvLimit = IpyGameDataPY.GetFuncCfg("LianqiUseItem", 3) if not lvA or lvA >= lvLimit: GameWorld.DebugLog("Á¶Æ÷µ±Ç°¸ñ×Ó²»Âú×ãʹÓõȼ¶£¬ÎÞÐèʹÓøõÀ¾ß! useIndex=%s,itemID=%s,rA=%s,cA=%s,lvA=%s,lvLimit=%s" % (useIndex, itemID, rA, cA, lvA, lvLimit), playerID) return GameWorld.DebugLog("Á¶Æ÷ʹÓýø½×µÀ¾ß! useIndex=%s,itemID=%s,rA=%s,cA=%s,lvA=%s" % (useIndex, itemID, rA, cA, lvA), playerID) PrintGridData(curPlayer, gridDataList, "ʹÓÃǰ") lvA += 1 gridDataList[rA][cA] = lvA SaveGridData(curPlayer, gridDataList) PrintGridData(curPlayer, gridDataList, "ʹÓúó") addScore = pow(2, lvA) AddLianqiScore(curPlayer, addScore, lvA) # ¸Ê¶ÏÉÒº£¬ÌåÁ¦¼Ó15 elif useIndex == 3: curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergy) energyMax = IpyGameDataPY.GetFuncCfg("LianqiSet", 1) if curEnergy >= energyMax: GameWorld.DebugLog("Á¶Æ÷ÌåÁ¦ÒÑÂú£¬ÎÞÐèʹÓøõÀ¾ß! useIndex=%s,itemID=%s,curEnergy=%s >= %s" % (useIndex, itemID, curEnergy, energyMax), playerID) return addEnergy = IpyGameDataPY.GetFuncCfg("LianqiUseItem", 4) * useItemCount updEnergy = curEnergy + addEnergy updEnergy = SetLianqiEnergy(curPlayer, updEnergy) GameWorld.DebugLog("Á¶Æ÷ʹÓÃÌåÁ¦µÀ¾ß! useIndex=%s,itemID=%s,useItemCount=%s,addEnergy=%s,curEnergy=%s,updEnergy=%s" % (useIndex, itemID, useItemCount, addEnergy, curEnergy, updEnergy), playerID) ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, useItemCount, "Lianqi") updUseCnt = alreadyUsedCnt + useItemCount PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiItemUse % itemID, updUseCnt) GameWorld.DebugLog("¸üе¥¾ÖµÀ¾ßʹÓôÎÊý: useIndex=%s,itemID=%s,updUseCnt=%s" % (useIndex, itemID, updUseCnt), playerID) Sync_LianqiPlayerInfo(curPlayer, opType) return def OnProcess(curPlayer): if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_LianqiID): return curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergy) energyMax = IpyGameDataPY.GetFuncCfg("LianqiSet", 1) if curEnergy >= energyMax: #GameWorld.DebugLog("Á¶Æ÷ÌåÁ¦ÒÑÂú£¬ÎÞÐè»Ö¸´! curEnergy=%s >= %s" % (curEnergy, energyMax), curPlayer.GetPlayerID()) return needSeconds = IpyGameDataPY.GetFuncCfg("LianqiSet", 2) if not needSeconds: return curTime = int(time.time()) lastTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergyTime) if not lastTime: lastTime = curTime PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergyTime, lastTime) return passTime = curTime - lastTime addEnergy = passTime / needSeconds if addEnergy <= 0: return GameWorld.DebugLog("ʱ¼ä»Ö¸´Á¶Æ÷ÌåÁ¦: passTime=%s(%s-%s),addEnergy=%s" % (passTime, curTime, lastTime, addEnergy), curPlayer.GetPlayerID()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergyTime, curTime) SetLianqiEnergy(curPlayer, min(curEnergy + addEnergy, energyMax)) Sync_LianqiPlayerInfo(curPlayer) return def SetLianqiEnergy(curPlayer, setEnergy): ## ÉèÖÃÁ¶Æ÷ÌåÁ¦ # @param byTime: ÓÉʱ¼ä»Ö¸´µÄ£¬´«ÈëµÄÊǵ±Ç°Ê±¼ä´Á curEnergy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergy) updEnergy = min(65000, setEnergy) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergy, updEnergy) energyMax = IpyGameDataPY.GetFuncCfg("LianqiSet", 1) if updEnergy >= energyMax: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergyTime, 0) elif curEnergy >= energyMax and updEnergy < energyMax: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiEnergyTime, int(time.time())) return updEnergy def AddLianqiScore(curPlayer, addScore, actLV=0): ## Ôö¼ÓÁ¶Æ÷»ý·Ö if addScore <= 0: return curScore = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiScore) GameWorld.DebugLog("Á¶Æ÷»î¶¯»ý·ÖÔö¼Ó: curScore=%s,addScore=%s,actLV=%s" % (curScore, addScore, actLV), curPlayer.GetPlayerID()) SetLianqiScore(curPlayer, curScore + addScore, actLV) PlayerZhanling.AddZhanlingValue(curPlayer, PlayerZhanling.ZhanlingType_Lianqi, addScore) return def SetLianqiScore(curPlayer, setScore, actLV=0): ## ÉèÖÃÁ¶Æ÷»ý·Ö # @param actLV: ¼¤»îµÄºÏ³ÉµÈ¼¶ updBillboard = False lvHighest = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiLVAwardMax) if actLV > lvHighest: lvHighest = actLV PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiLVAwardMax, lvHighest) updBillboard = True updScore = min(setScore, ChConfig.Def_UpperLimit_DWord) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiScore, updScore) scoreHighest = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiScoreHighest) if updScore > scoreHighest: scoreHighest = updScore PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiScoreHighest, scoreHighest) updBillboard = True GameWorld.DebugLog("Á¶Æ÷»î¶¯»ý·Ö¸üÐÂ: updScore=%s,scoreHighest=%s,lvHighest=%s" % (updScore, scoreHighest, lvHighest), curPlayer.GetPlayerID()) if updBillboard: SendToGameServer_Lianqi(curPlayer, "ScoreHighest", [scoreHighest, lvHighest]) return updScore def SendToGameServer_Lianqi(curPlayer, msgType, dataMsg=""): playerID = curPlayer.GetPlayerID() msgList = str([msgType, dataMsg]) GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "ActLianqi", msgList, len(msgList)) GameWorld.Log("Á¶Æ÷»î¶¯·¢ËÍGameServer: %s, %s" % (msgType, dataMsg), playerID) return def OnGetLVAward(curPlayer, opType, awardLV): ## ÁìÈ¡Á¶Æ÷µÈ¼¶½±Àø playerID = curPlayer.GetPlayerID() curAwardLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiLVAwardMax) if curAwardLV < awardLV: GameWorld.DebugLog("Á¶Æ÷½±ÀøµÈ¼¶²»×ã! curAwardLV=%s < %s" % (curAwardLV, awardLV), playerID) return lvAwardItemDict = IpyGameDataPY.GetFuncEvalCfg("LianqiSet", 3, {}) if str(awardLV) not in lvAwardItemDict: return awardItemList = lvAwardItemDict[str(awardLV)] awardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiLVAwardState) if awardState&pow(2, awardLV): GameWorld.DebugLog("Á¶Æ÷½±ÀøµÈ¼¶ÒÑÁìÈ¡! awardLV=%s,awardState=%s" % (awardLV, awardState), playerID) return ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["Lianqi", False, {}]) updAwardState = awardState|pow(2, awardLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LianqiLVAwardState, updAwardState) GameWorld.DebugLog("Á¶Æ÷ÁìÈ¡½±ÀøµÈ¼¶! awardLV=%s,awardState=%s,updAwardState=%s,%s" % (awardLV, awardState, updAwardState, awardItemList), playerID) Sync_LianqiPlayerInfo(curPlayer, opType) return def Sync_LianqiPlayerInfo(curPlayer, opType=0, moveList=[]): if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CA_LianqiID): return clientPack = ChPyNetSendPack.tagMCActLianqiPlayerInfo() clientPack.Score = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiScore) clientPack.ScoreHighest = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiScoreHighest) clientPack.Energy = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergy) clientPack.EnergyTime = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiEnergyTime) clientPack.LVAwardMax = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiLVAwardMax) clientPack.LVAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiLVAwardState) clientPack.UseItemCntList = [] for itemID in IpyGameDataPY.GetFuncEvalCfg("LianqiUseItem", 1): clientPack.UseItemCntList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LianqiItemUse % itemID)) clientPack.UseItemLen = len(clientPack.UseItemCntList) clientPack.GridData = str(GetGridDataList(curPlayer)).replace(" ", "") clientPack.GridDataLen = len(clientPack.GridData) clientPack.MoveList = [] for moveInfo in moveList: if not isinstance(moveInfo, list) or len(moveInfo) != 4: continue tileMove = ChPyNetSendPack.tagMCActLianqiTileMove() row, col, toRow, toCol = moveInfo tileMove.Row = row tileMove.Col = col tileMove.ToRow = toRow tileMove.ToCol = toCol clientPack.MoveList.append(tileMove) clientPack.OPType = opType clientPack.MoveCount = len(clientPack.MoveList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def Sync_CrossActLianqiActionInfo(curPlayer): ## ֪ͨ»î¶¯ÐÅÏ¢ actInfo = CrossRealmPlayer.GetPlayerCrossActInfo(curPlayer, ShareDefine.CrossActName_Lianqi) 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("ActLianqiBillTemp", personalTempID) if personalTempID else [] clientPack = ChPyNetSendPack.tagMCCrossActLianqiInfo() 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.LimitLV = ipyDataDict.get("LVLimit", 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.tagMCCrossActLianqiBillard() rankInfo.Rank = tempIpyData.GetRank() rankInfo.AwardItemList = [] awardItemList = tempIpyData.GetAwardItemList() for itemID, itemCount, isAuctionItem in awardItemList: item = ChPyNetSendPack.tagMCCrossActLianqiItem() item.Clear() item.ItemID = itemID item.ItemCount = itemCount item.IsBind = isAuctionItem rankInfo.AwardItemList.append(item) rankInfo.Count = len(rankInfo.AwardItemList) rankInfo.NeedScore = tempIpyData.GetNeedScore() rankInfo.AwardItemExList = [] scoreAwardEx = tempIpyData.GetScoreAwardEx() scoreExList = scoreAwardEx.keys() scoreExList.sort() for scoreEx in scoreExList: itemExList = scoreAwardEx[scoreEx] awardEx = ChPyNetSendPack.tagMCCrossActLianqiAwardEx() awardEx.NeedScore = scoreEx awardEx.AwardItemList = [] for itemID, itemCount, isAuctionItem in itemExList: item = ChPyNetSendPack.tagMCCrossActLianqiItem() 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