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