#!/usr/bin/python
|
# -*- coding: GBK -*-
|
#-------------------------------------------------------------------------------
|
#
|
#-------------------------------------------------------------------------------
|
##@package ChEquip
|
# ×°±¸Âß¼´¦Àí
|
#
|
# @author alee
|
# @date 2017-07-29 00:30
|
# @version 1.0
|
#
|
# ÐÞ¸Äʱ¼ä ÐÞ¸ÄÈË ÐÞ¸ÄÄÚÈÝ
|
#------------------------------------------------------------------------------
|
#"""Version = 2017-07-29 00:30"""
|
#------------------------------------------------------------------------------
|
import IPY_GameWorld
|
import GameWorld
|
import ItemControler
|
import PlayerControl
|
import ChConfig
|
import ItemCommon
|
import ShareDefine
|
import ChPyNetSendPack
|
import NetPackCommon
|
import IpyGameDataPY
|
import OpenServerCampaign
|
import FormulaControl
|
import PlayerOnline
|
|
def RefreshRoleEquipAttr(curPlayer):
|
## Ë¢ÐÂÖ÷¹«×°±¸ÊôÐÔ
|
CalcRoleEquipAttr(curPlayer)
|
PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr()
|
return
|
|
def CalcRoleEquipAttr(curPlayer):
|
## ¼ÆËãÖ÷¹«×°±¸ÊôÐÔ
|
playerID = curPlayer.GetPlayerID()
|
mainEquipAttrDict = {}
|
|
packType = IPY_GameWorld.rptEquip
|
equipPack = curPlayer.GetItemManager().GetPack(packType)
|
|
# Ö÷×°±¸
|
for equipPlace in ChConfig.Def_MainEquipPlaces:
|
equipIndex = equipPlace - 1
|
if equipIndex < 0 or equipIndex >= equipPack.GetCount():
|
continue
|
curEquip = equipPack.GetAt(equipIndex)
|
if not curEquip or curEquip.IsEmpty():
|
continue
|
#itemColor = curEquip.GetItemColor()
|
|
baseAttrIDCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrID)
|
baseAttrValueCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetBaseAttrValue)
|
if baseAttrIDCnt == baseAttrValueCnt:
|
for i in xrange(baseAttrIDCnt):
|
attrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrID, i)
|
attrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetBaseAttrValue, i)
|
mainEquipAttrDict[attrID] = mainEquipAttrDict.get(attrID, 0) + attrValue
|
|
legendAttrIDCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrID)
|
legendAttrValueCnt = curEquip.GetUserAttrCount(ShareDefine.Def_IudetLegendAttrValue)
|
if legendAttrIDCnt == legendAttrValueCnt:
|
for i in xrange(legendAttrIDCnt):
|
attrID = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrID, i)
|
attrValue = curEquip.GetUserAttrByIndex(ShareDefine.Def_IudetLegendAttrValue, i)
|
mainEquipAttrDict[attrID] = mainEquipAttrDict.get(attrID, 0) + attrValue
|
|
GameWorld.DebugLog("Ö÷Ïß×°±¸ÊôÐÔ: %s" % mainEquipAttrDict, playerID)
|
PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_MainEquip, mainEquipAttrDict)
|
return
|
|
## Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐԵĸıä
|
# @param self ÀàʵÀý
|
# @return ·µ»ØÖµÎÞÒâÒå
|
# @remarks Ë¢ÐÂ×°±¸¶ÔÈËÎïÊôÐԵĸıä
|
def RefreshPlayerEquipAttribute(curPlayer, classLV=0):
|
return
|
|
#// A3 18 ÁéÆ÷Í»ÆÆ #tagCMLingQiEquipBreak
|
#
|
#struct tagCMLingQiEquipBreak
|
#{
|
# tagHead Head;
|
# DWORD ItemID; //Í»ÆÆµÄÎïÆ·ID
|
#};
|
def OnLingQiEquipBreak(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
breakItemID = clientData.ItemID
|
ipyData = IpyGameDataPY.GetIpyGameData('LingQiAttr', breakItemID)
|
if not ipyData:
|
return
|
nextItemID = ipyData.GetNextItemID() #Í»ÆÆºóµÄÎïÆ·ID
|
if not IpyGameDataPY.GetIpyGameData('LingQiAttr', nextItemID):
|
return
|
breakItemData = GameWorld.GetGameData().GetItemByTypeID(breakItemID)
|
nextItemData = GameWorld.GetGameData().GetItemByTypeID(nextItemID)
|
if not breakItemData or not nextItemData:
|
return
|
equipIndex = ItemCommon.GetEquipPackIndex(breakItemData)
|
if equipIndex != ItemCommon.GetEquipPackIndex(nextItemData):
|
GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·ºÍÍ»ÆÆºóµÄÎïÆ·²»ÊÇͬ¸ö×°±¸Î»£¡breakItemID=%s,nextItemID=%s"
|
% (breakItemID, nextItemID))
|
return
|
equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
|
curEquip = equipPack.GetAt(equipIndex)
|
if not curEquip or curEquip.IsEmpty():
|
GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·Î´´©´÷£¡breakItemID=%s"
|
% (breakItemID))
|
return
|
if curEquip.GetEndureReduceType():
|
GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·ÊÇʱЧÎïÆ·£¡breakItemID=%s"
|
% (breakItemID))
|
return
|
if curEquip.GetItemTypeID() != breakItemID:
|
GameWorld.DebugLog("Í»ÆÆµÄÎïÆ·Î´´©´÷£¡breakItemID=%s"
|
% (breakItemID))
|
return
|
|
|
costItemDict = ipyData.GetUpCostItem()
|
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
|
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(costItemDict, itemPack)
|
if lackItemDict:
|
GameWorld.DebugLog("Í»ÆÆÏûºÄÎïÆ·²»×㣡breakItemID=%s,costItemDict=%s,lackItemDict=%s"
|
% (breakItemID, costItemDict, lackItemDict))
|
return
|
|
#¿ÛÏûºÄ
|
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, 'LingQiEquipBreak')
|
ItemCommon.DelItem(curPlayer, curEquip, 1, False, ChConfig.ItemDel_LingQiEquipBreak, {}, True)
|
#¸øÍ»ÆÆºóÁéÆ÷
|
if not ItemControler.PutItemInTempSwap(curPlayer, nextItemID):
|
GameWorld.Log("ÁéÆ÷Í»ÆÆºóID(%s)·ÅÈëÁÙʱ½»»»±³°üʧ°Ü!" % (nextItemID), curPlayer.GetID())
|
return
|
ItemCommon.DoLogicSwitchItemEx(curPlayer, ShareDefine.rptTempSwap, IPY_GameWorld.rptEquip, 0, equipIndex)
|
|
changeItemStarLV = 0 #curItem.GetItemStarLV()
|
changeItemStoneCnt = 0 #curItem.GetUseStoneCount()
|
changeItemHoleCnt = 0 #curItem.GetCanPlaceStoneCount()
|
changeItemUseData = ''
|
curPlayer.ChangeEquip(nextItemID, equipIndex, changeItemStarLV, changeItemHoleCnt, changeItemStoneCnt, changeItemUseData)
|
#Ë¢ÊôÐÔ
|
RefreshPlayerLingQiEquipAttr(curPlayer)
|
playControl = PlayerControl.PlayerControl(curPlayer)
|
playControl.RefreshPlayerAttrState()
|
#֪ͨ½á¹û
|
resultPack = ChPyNetSendPack.tagMCLingQiEquipBreakResult()
|
resultPack.Clear()
|
resultPack.MakeItemID = nextItemID
|
NetPackCommon.SendFakePack(curPlayer, resultPack)
|
PlayerControl.WorldNotify(0, 'SpiritOrgan', [curPlayer.GetName(), breakItemID, nextItemID])
|
return
|
|
#// A3 27 ÁéÆ÷ÅàÑø #tagCMLingQiTrain
|
#
|
#struct tagCMLingQiTrain
|
#{
|
# tagHead Head;
|
# BYTE EquipPlace; //ÁéÆ÷×°±¸Î»
|
# BYTE TrainType; //ÅàÑøÀàÐÍ£º 1-»ù´¡ÅàÑø£¬2-ÌØÊâÅàÑø£¬3-°Ù·Ö±ÈÅàÑø
|
# WORD UseItemCnt; //ÏûºÄ²ÄÁϸöÊý
|
#};
|
def OnLingQiTrain(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
|
equipPlace = clientData.EquipPlace # ÁéÆ÷×°±¸Î»
|
trainType = clientData.TrainType # ÅàÑøÀàÐÍ
|
costItemCount = clientData.UseItemCnt # ÏûºÄ²ÄÁϸöÊý
|
|
trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType))
|
curEatItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType))
|
GameWorld.DebugLog("ÁéÆ÷ÅàÑø: equipPlace=%s,trainType=%s,trainLV=%s,costItemCount=%s,curEatItemCount=%s"
|
% (equipPlace, trainType, trainLV, costItemCount, curEatItemCount))
|
|
if equipPlace not in ChConfig.EquipPlace_LingQi:
|
return
|
|
if trainType <= 0 or trainType > GetLingQiTrainTypes(equipPlace):
|
return
|
|
if trainLV <= 0:
|
GameWorld.DebugLog(" ÅàÑøÎ´¼¤»î trainType=%s" % trainType)
|
return
|
|
trainIpyData = IpyGameDataPY.GetIpyGameData("LingQiTrain", equipPlace, trainType, trainLV)
|
if not trainIpyData:
|
return
|
|
needRealmLV = trainIpyData.GetNeedRealmLV()
|
curRealmLV = PlayerControl.GetTrainRealmLVReal(curPlayer, 3)
|
if curRealmLV < needRealmLV:
|
GameWorld.DebugLog(" ¾³½ç²»×㣬ÎÞ·¨ÅàÑø£¡ curRealmLV(%s) < needRealmLV(%s)" % (curRealmLV, needRealmLV))
|
return
|
|
needEatCountTotal = trainIpyData.GetEatCntTotal()
|
if not needEatCountTotal:
|
GameWorld.DebugLog(" ¸ÃÅàÑøÒÑÂú¼¶£¡")
|
return
|
|
costItemIDList = IpyGameDataPY.GetFuncEvalCfg("LingQiTrain", 1, {}).get(str(equipPlace), [])
|
costItemID = costItemIDList[trainType - 1]
|
if not costItemID or not costItemCount:
|
return
|
|
costItemIndexList, bindCnt, unBindCnt = ItemCommon.GetPackItemBindStateIndexInfo(curPlayer, costItemID, costItemCount)
|
lackCnt = costItemCount - bindCnt - unBindCnt
|
if lackCnt > 0:
|
GameWorld.DebugLog(" ÏûºÄµÀ¾ß²»×㣬ÎÞ·¨ÅàÑø!costItemID=%s,costItemCount=%s,bindCnt=%s,unBindCnt=%s,lackCnt=%s"
|
% (costItemID, costItemCount, bindCnt, unBindCnt, lackCnt))
|
return
|
|
delCnt = costItemCount
|
|
# ¿Û³ýÏûºÄ
|
if delCnt:
|
ItemCommon.DelCostItemByBind(curPlayer, costItemIndexList, bindCnt, unBindCnt, delCnt, "LingQiTrain")
|
|
updClassLV = trainLV
|
updEatItemCount = curEatItemCount + costItemCount
|
GameWorld.DebugLog(" updEatItemCount=%s,needEatCountTotal=%s" % (updEatItemCount, needEatCountTotal))
|
|
if updEatItemCount >= needEatCountTotal:
|
updClassLV += 1
|
updEatItemCount -= needEatCountTotal
|
GameWorld.DebugLog(" ½ø½×: updClassLV=%s,updEatItemCount=%s" % (updClassLV, updEatItemCount))
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType), updClassLV)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType), updEatItemCount)
|
|
# Éý½×
|
if updClassLV > trainLV:
|
pass
|
|
Sync_LingQiTrainData(curPlayer, equipPlace)
|
# Ë¢ÊôÐÔ
|
RefreshPlayerLingQiEquipAttr(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
return
|
|
def GetLingQiTrainTypes(equipPlace):
|
return len(IpyGameDataPY.GetFuncEvalCfg("LingQiTrain", 1, {}).get(str(equipPlace), []))
|
|
def Sync_LingQiTrainData(curPlayer, equipPlace):
|
clientPack = ChPyNetSendPack.tagMCLingQiTrainInfo()
|
clientPack.EquipPlace = equipPlace
|
clientPack.TrainLVList = []
|
clientPack.TrainItemCountList = []
|
for trainType in xrange(1, GetLingQiTrainTypes(equipPlace) + 1):
|
trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType))
|
if trainLV == 0:
|
trainLV = 1
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType), trainLV)
|
clientPack.TrainLVList.append(trainLV)
|
clientPack.TrainItemCountList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType)))
|
clientPack.TrainTypes = len(clientPack.TrainLVList)
|
NetPackCommon.SendFakePack(curPlayer, clientPack)
|
return
|
|
def RefreshPlayerLingQiEquipAttr(curPlayer):
|
''' Ë¢ÐÂÍæ¼ÒÁéÆ÷×°±¸ÊôÐÔ
|
'''
|
return
|
classLV = 0 # ÁéÆ÷½×ĬÈÏΪ0
|
allAttrList = [{} for _ in range(4)]
|
lingQiAttrList = [{} for _ in range(4)]
|
equipPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
|
equipScoreTotal = 0
|
lv = curPlayer.GetLV()
|
lqAttrFormatDict = IpyGameDataPY.GetFuncEvalCfg("OutOfPrintValue", 2, {})
|
|
for equipPlace in ChConfig.EquipPlace_LingQi:
|
|
ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
|
if not ipyData:
|
continue
|
|
equipIndex = ipyData.GetGridIndex()
|
curEquip = equipPack.GetAt(equipIndex)
|
if not curEquip or curEquip.IsEmpty():
|
continue
|
|
if not ItemCommon.CheckItemCanUseByExpireTime(curEquip):
|
# ¹ýÆÚ
|
continue
|
|
equipScoreTotal += ItemCommon.GetEquipGearScore(curEquip)
|
|
itemID = curEquip.GetItemTypeID()
|
#»ù´¡ÊôÐÔЧ¹û
|
for effIndex in xrange(curEquip.GetEffectCount()):
|
curEff = curEquip.GetEffectByIndex(effIndex)
|
effID = curEff.GetEffectID()
|
if effID == 0:
|
break
|
PlayerControl.CalcAttrDict_Type(effID, curEff.GetEffectValue(0), lingQiAttrList)
|
|
#ÁéÆ÷ÊôÐÔ
|
lingQiIpyData = IpyGameDataPY.GetIpyGameDataNotLog("LingQiAttr", itemID)
|
if lingQiIpyData:
|
lingQiAttrIDList = lingQiIpyData.GetLingQiAttrID()
|
lingQiAttrValueList = lingQiIpyData.GetLingQiAttrValue()
|
for lqIndex, lqAttrID in enumerate(lingQiAttrIDList):
|
if str(lqAttrID) in lqAttrFormatDict:
|
attrFormat = lqAttrFormatDict[str(lqAttrID)]
|
maxOOPValue = lingQiAttrValueList[lqIndex]
|
lqAttrValue = eval(FormulaControl.GetCompileFormula("LingQiAttrFormat_%s" % lqAttrID, attrFormat))
|
else:
|
lqAttrValue = lingQiAttrValueList[lqIndex]
|
|
PlayerControl.CalcAttrDict_Type(lqAttrID, lqAttrValue, lingQiAttrList)
|
|
# ÐÂÅàÑøÊôÐÔ
|
guardTrainAttrList = [{} for _ in range(4)]
|
wingTrainAttrList = [{} for _ in range(4)]
|
peerlessWeaponTrainAttrList = [{} for _ in range(4)]
|
peerlessWeapon2TrainAttrList = [{} for _ in range(4)]
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetLingQiTrainCount()):
|
trainIpyData = ipyDataMgr.GetLingQiTrainByIndex(index)
|
equipPlace = trainIpyData.GetEquipPlace()
|
trainType = trainIpyData.GetTrainType()
|
dataTrainLV = trainIpyData.GetTrainLV()
|
|
if equipPlace == ShareDefine.retGuard1:
|
lingQiTrainAttrList = guardTrainAttrList
|
elif equipPlace == ShareDefine.retWing:
|
lingQiTrainAttrList = wingTrainAttrList
|
elif equipPlace == ShareDefine.retPeerlessWeapon:
|
lingQiTrainAttrList = peerlessWeaponTrainAttrList
|
elif equipPlace == ShareDefine.retPeerlessWeapon2:
|
lingQiTrainAttrList = peerlessWeapon2TrainAttrList
|
else:
|
continue
|
|
trainLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainLV % (equipPlace, trainType))
|
|
if dataTrainLV > trainLV:
|
continue
|
elif dataTrainLV == trainLV:
|
trainItemCount = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_LingQiTrainItemCount % (equipPlace, trainType))
|
else:
|
trainItemCount = trainIpyData.GetEatCntTotal()
|
|
# µÈ½×¶îÍâÊôÐÔ
|
lvAttrTypeList = trainIpyData.GetLVAttrTypeList()
|
lvAttrValueList = trainIpyData.GetLVAttrValueList()
|
for i, attrID in enumerate(lvAttrTypeList):
|
attrValue = lvAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue, lingQiTrainAttrList)
|
|
# ÅàÑøµ¤Ôö¼ÓÊôÐÔ
|
eatCntEverytime = trainIpyData.GetEatCntEverytime()
|
if trainItemCount and eatCntEverytime:
|
eatItemAttrTypeList = trainIpyData.GetEatItemAttrTypeList()
|
eatItemAttrValueList = trainIpyData.GetEatItemAttrValueList()
|
attrMultiple = trainItemCount / eatCntEverytime
|
for i, attrID in enumerate(eatItemAttrTypeList):
|
attrValue = eatItemAttrValueList[i]
|
PlayerControl.CalcAttrDict_Type(attrID, attrValue * attrMultiple, lingQiTrainAttrList)
|
|
#GameWorld.DebugLog("ÊØ»¤ÅàÑøÊôÐÔ: %s" % guardTrainAttrList)
|
#GameWorld.DebugLog("³á°òÅàÑøÊôÐÔ: %s" % wingTrainAttrList)
|
#GameWorld.DebugLog("ÃðÊÀÅàÑøÊôÐÔ: %s" % peerlessWeaponTrainAttrList)
|
#GameWorld.DebugLog("ÊÉ»êÅàÑøÊôÐÔ: %s" % peerlessWeapon2TrainAttrList)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_GuardTarin, guardTrainAttrList)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_WingTarin, wingTrainAttrList)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PeerlessWeaponTrain, peerlessWeaponTrainAttrList)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_PeerlessWeapon2Train, peerlessWeapon2TrainAttrList)
|
|
lqFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
|
PlayerControl.SetMFPExFightPower(curPlayer, ShareDefine.Def_MFPType_LingQi, lqFightPowerEx)
|
|
#GameWorld.DebugLog("ÁéÆ÷ÊôÐÔ1: %s" % allAttrList)
|
#GameWorld.DebugLog("ÁéÆ÷ÊôÐÔ2: %s" % lingQiAttrList)
|
#GameWorld.DebugLog("ÁéÆ÷ÆÀ·ÖÕ½Á¦: equipScoreTotal=%s, %s" % (equipScoreTotal, lqFightPowerEx))
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_LingQi, allAttrList)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_LingQiAttr, lingQiAttrList)
|
return
|
|
def CalcAttr_LegendAttr(curPlayer, curEquip, allAttrListEquip, legendAttrDict={}):
|
## ¼ÆËã´«ÆæÊôÐÔ
|
return
|
|
#// A5 C6 ×°±¸²¿Î»ÐǼ¶Ì××°¼¤»î #tagCMEquipPartSuiteActivate
|
#
|
#struct tagCMEquipPartSuiteActivate
|
#{
|
# tagHead Head;
|
# BYTE ClassLV; // ËùÊô×°±¸½×
|
# WORD SuiteID; // Ì××°ID
|
# BYTE SuiteCount; // ¼þÊý
|
# BYTE Star; // ÐÇÊý
|
#};
|
def OnEquipPartSuiteActivate(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
classLV = clientData.ClassLV
|
suiteID = clientData.SuiteID
|
suiteCount = clientData.SuiteCount
|
star = clientData.Star
|
ipyDataList = IpyGameDataPY.GetIpyGameDataList('EquipSuitAttr', suiteID)
|
if not ipyDataList:
|
return
|
|
actIpyData = None
|
for ipyData in ipyDataList:
|
needCount = ipyData.GetSuiteCnt()
|
needStar = ipyData.GetStar()
|
if suiteCount == needCount and star == needStar:
|
actIpyData = ipyData
|
break
|
|
if not actIpyData:
|
return
|
activateIndex = actIpyData.GetActivateIndex()
|
# ÕâÀï¾Í²»ÅжÏÊÇ·ñÂú×ã¼þÊý¡¢ÐÇÊýÌõ¼þÁË£¬ËãÊôÐÔµÄʱºò±¾ÉíÒ²ÊÇÌõ¼þÖ®Ò»£¬ÊÇ·ñ¼¤»îÖ»ÊǸ½¼ÓÌõ¼þ£¬ÕâÀïÖ»´¦Àí¼¤»î״̬±ä¸ü£¬ÄÜ·ñ¼¤»îǰ¶ËÅжϼ´¿É
|
isActivate = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex)
|
if isActivate:
|
return
|
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_EquipPartSuiteActivate, activateIndex, 1)
|
Sync_EquipPartSuiteActivateInfo(curPlayer)
|
|
#¹ã²¥
|
notifyMark = actIpyData.GetIsNotify()
|
if notifyMark:
|
PlayerControl.WorldNotify(0, 'AllStarLevelUp' if needStar else 'AllStarLevelUp2', [curPlayer.GetPlayerName(), suiteID, suiteCount, star])
|
|
RefreshPlayerEquipAttribute(curPlayer, classLV)
|
#Ë¢ÐÂËùÓÐÊôÐÔ
|
playControl = PlayerControl.PlayerControl(curPlayer)
|
playControl.RefreshPlayerAttrState()
|
return
|
|
def Sync_EquipPartSuiteActivateInfo(curPlayer):
|
## ͬ²½×°±¸Î»ÐǼ¶Ì××°¼¤»î״̬ÐÅÏ¢
|
#keyCount = 10
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
dataCount = ipyDataMgr.GetEquipSuitAttrCount()
|
if not dataCount:
|
return
|
lastIpyData = ipyDataMgr.GetEquipSuitAttrByIndex(dataCount - 1)
|
if not lastIpyData:
|
return
|
keyCount = 1 + lastIpyData.GetActivateIndex() / 31
|
activateStateList = []
|
for i in xrange(keyCount):
|
activateStateList.append(curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartSuiteActivate % i))
|
if activateStateList.count(0) == keyCount:
|
return
|
activateInfo = ChPyNetSendPack.tagMCEquipPartSuiteActivateInfo()
|
activateInfo.SuiteActivateStateInfo = activateStateList
|
activateInfo.Count = len(activateInfo.SuiteActivateStateInfo)
|
NetPackCommon.SendFakePack(curPlayer, activateInfo)
|
return
|
|
def ChangeEquipEffectByPlusMaster(curPlayer, classLV):
|
# Ç¿»¯´óÊ¦ÌØÐ§
|
if (classLV != GetEquipFacadeClassLV(curPlayer)):
|
return
|
|
masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
|
## Ç¿»¯´óʦӰÏì½ÇÉ«Íâ¹ÛÏÔʾ Ç¿»¯´óʦµÈ¼¶ * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°
|
oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()
|
updEquipShowSwitch = oldEquipShowSwitch % 1000 + oldEquipShowSwitch / 1000000 * 1000000+ 1000 * masterPlusLV
|
GameWorld.DebugLog('Ç¿»¯´óʦӰ±ä»¯Ó°Ïì½ÇÉ«Íâ¹ÛÏÔʾ,oldEquipShowSwitch=%s,updEquipShowSwitch=%s'%
|
(oldEquipShowSwitch, updEquipShowSwitch))
|
if oldEquipShowSwitch != updEquipShowSwitch:
|
curPlayer.SetEquipShowSwitch(updEquipShowSwitch)
|
return
|
|
|
def ChangeEquipfacadeByHorsePetSkin(curPlayer, skinType, skinIndex):
|
##Æï³è¾õÐÑÍâ¹Û±ä¸ü Áé³èÍâ¹ÛË÷Òý*10000000+×øÆïÍâ¹ÛË÷Òý*1000000+Áé¸ùÌØÐ§±íkey * 1000+µÚ¼¸Ì×*10+ÊÇ·ñÓÐÌ××°
|
oldEquipShowSwitch = curPlayer.GetEquipShowSwitch()
|
if skinType == 1:
|
updEquipShowSwitch = GameWorld.ChangeDataByDigitPlace(oldEquipShowSwitch, 7, skinIndex)
|
else:
|
updEquipShowSwitch = GameWorld.ChangeDataByDigitPlace(oldEquipShowSwitch, 8, skinIndex)
|
|
if oldEquipShowSwitch == updEquipShowSwitch:
|
return
|
curPlayer.SetEquipShowSwitch(updEquipShowSwitch)
|
return
|
|
def GetPlayerMaxEquipClassLV(curPlayer):
|
## »ñÈ¡Íæ¼Òµ±Ç°½âËøµÄ×°±¸½×
|
key = "RealmEquipClassLVMap"
|
RealmEquipClassLVMap = IpyGameDataPY.GetConfigEx(key)
|
if not RealmEquipClassLVMap:
|
RealmEquipClassLVMap = {}
|
infoDict = {}
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for index in xrange(ipyDataMgr.GetEquipControlCount()):
|
ipyData = ipyDataMgr.GetEquipControlByIndex(index)
|
infoDict[ipyData.GetNeedRealmLV()] = ipyData.GetClassLV()
|
needReamlLVList = infoDict.keys()
|
needReamlLVList.sort() # ÉýÐòÅÅ
|
for i, realmLV in enumerate(needReamlLVList):
|
classLV = infoDict[realmLV]
|
if i == len(needReamlLVList) - 1:
|
RealmEquipClassLVMap[realmLV] = classLV
|
if i == 0:
|
continue
|
else:
|
preRealmLV = needReamlLVList[i - 1]
|
preClassLV = infoDict[preRealmLV]
|
for pRealmLV in range(preRealmLV, realmLV):
|
RealmEquipClassLVMap[pRealmLV] = preClassLV
|
GameWorld.DebugLog("¼ÓÔØ¾³½ç¶ÔÓ¦¿ª·Å×î´ó×°±¸½×ÉèÖÃ: %s" % RealmEquipClassLVMap)
|
IpyGameDataPY.SetConfigEx(key, RealmEquipClassLVMap)
|
|
playerRealmLV = curPlayer.GetOfficialRank()
|
if playerRealmLV in RealmEquipClassLVMap:
|
return RealmEquipClassLVMap[playerRealmLV]
|
|
maxRealmLV = max(RealmEquipClassLVMap)
|
if playerRealmLV >= maxRealmLV:
|
return RealmEquipClassLVMap[maxRealmLV]
|
|
return 0
|
|
#»ñÈ¡µ±Ç°Êǵڼ¸Ì××°±¸Íâ¹Û
|
def GetEquipFacadeClassLV(curPlayer):return curPlayer.GetEquipShowSwitch()%1000/10
|
|
## »ñÈ¡¹«¹²²¿Î»Ç¿»¯ÊìÁ·¶È
|
def GetEquipPartProficiency(curPlayer, packType, index):
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartProficiency % (packType, index))
|
|
## ÉèÖù«¹²²¿Î»Ç¿»¯ÊìÁ·¶È
|
def SetEquipPartProficiency(curPlayer, packType, index, value):
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartProficiency % (packType, index), value)
|
return
|
|
## »ñÈ¡¹«¹²²¿Î»Ç¿»¯µÈ¼¶
|
def GetEquipPartPlusLV(curPlayer, packType, index):
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusLV % (packType, index))
|
|
## ÉèÖù«¹²²¿Î»Ç¿»¯µÈ¼¶
|
def SetEquipPartPlusLV(curPlayer, packType, index, curEquip, setPlusLV):
|
befPlusLV = GetEquipPartPlusLV(curPlayer, packType, index)
|
if befPlusLV == setPlusLV:
|
return
|
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusLV % (packType, index), setPlusLV)
|
#===========================================================================
|
# if curEquip and not curEquip.IsEmpty():
|
# curEquip.SetItemStarLV(starLV)
|
#===========================================================================
|
|
# ͬ²½¸üÐÂÇ¿»¯×ܵȼ¶
|
befTotalPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusLV)
|
updTotalPlusLV = max(0, befTotalPlusLV + setPlusLV - befPlusLV)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalPlusLV, updTotalPlusLV)
|
GameWorld.DebugLog("ÉèÖÃÇ¿»¯µÈ¼¶: index=%s,befPlusLV=%s,setPlusLV=%s,befTotalPlusLV=%s,updTotalPlusLV=%s"
|
% (index, befPlusLV, setPlusLV, befTotalPlusLV, updTotalPlusLV))
|
return
|
|
## »ñÈ¡¹«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶
|
def GetEquipPartPlusEvolveLV(curPlayer, packType, index):
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))
|
|
|
## ÉèÖù«¹²²¿Î»Ç¿»¯½ø»¯µÈ¼¶
|
def SetEquipPartPlusEvolveLV(curPlayer, packType, index, setEvolveLV):
|
befEvolveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index))
|
if befEvolveLV == setEvolveLV:
|
return
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartPlusEvolveLV % (packType, index), setEvolveLV)
|
|
# ͬ²½¸üнø»¯×ܵȼ¶
|
befTotalPlusEvolveLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusEvolveLV)
|
updTotalPlusEvolveLV = max(0, befTotalPlusEvolveLV + setEvolveLV - befEvolveLV)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalPlusEvolveLV, updTotalPlusEvolveLV)
|
GameWorld.DebugLog("ÉèÖýø»¯µÈ¼¶: index=%s,befEvolveLV=%s,setEvolveLV=%s,befTotalPlusEvolveLV=%s,updTotalPlusEvolveLV=%s"
|
% (index, befEvolveLV, setEvolveLV, befTotalPlusEvolveLV, updTotalPlusEvolveLV))
|
return
|
|
## ֪ͨ¹«¹²²¿Î»Ç¿»¯µÈ¼¶
|
def NotifyEquipPartPlusLV(curPlayer, packType=IPY_GameWorld.rptEquip, index=None):
|
ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartPlusInfo()
|
ePartStarLVPack.Clear()
|
ePartStarLVPack.InfoList = []
|
|
syncIndexList = []
|
if index == None:
|
equipMaxClasslv = IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')
|
for equipPlace in ChConfig.Pack_EquipPart_CanPlusStar.get(packType, []):
|
for classlv in xrange(1, equipMaxClasslv+1):
|
ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)
|
if not ipyData:
|
continue
|
syncIndexList.append(ipyData.GetGridIndex())
|
else:
|
syncIndexList = [index]
|
|
for i in syncIndexList:
|
ePartStarLV = ChPyNetSendPack.tagMCEquipPartPlusLV()
|
ePartStarLV.Clear()
|
ePartStarLV.PackType = packType
|
ePartStarLV.EquipIndex = i
|
ePartStarLV.EquipPartStarLV = GetEquipPartPlusLV(curPlayer, packType, i)
|
ePartStarLV.Proficiency = GetEquipPartProficiency(curPlayer, packType, i)
|
ePartStarLV.EvolveLV = GetEquipPartPlusEvolveLV(curPlayer, packType, i)
|
ePartStarLVPack.InfoList.append(ePartStarLV)
|
|
ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)
|
NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)
|
return
|
|
|
## È«ÉíÇ¿»¯µÈ¼¶
|
def GetTotalPlusLV(curPlayer, isActive=True):
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusLV)
|
|
## È«Éí½ø»¯µÈ¼¶
|
def GetTotalPlusEvolveLV(curPlayer):
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalPlusEvolveLV)
|
|
## È«Éí³È×°¼°ÒÔÉÏ×°±¸Êý
|
def GetEquipOrangeCount(curPlayer):
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PlayerKey_EquipOrangeCount)
|
|
|
# »ñȡװ±¸µÄÇ¿»¯ÀàÐÍ
|
def GetEquipPlusType(curEquip):
|
equipPlace = curEquip.GetEquipPlace()
|
plusTypeDict = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelLimit", 1)
|
if not plusTypeDict:
|
GameWorld.ErrLog("ûÓÐÇ¿»¯ÀàÐÍÓ³Éä±í")
|
return
|
|
return plusTypeDict.get(equipPlace)
|
|
|
# »ñÈ¡ÂúÌ××°»¯µÄ×îµÍ½×Êý£¬Èç5¼þÌ×£¬4¼þ5¼¶£¬1¼þ3¼¶£¬Ôò·µ»Ø3
|
def GetEquipSuitsLVByType(curPlayer, suitType, groupType):
|
return 0
|
# suiteLV = 999
|
# equipSuitTypeDict = IpyGameDataPY.GetFuncEvalCfg('EquipSuitType')
|
# if groupType not in equipSuitTypeDict:
|
# return 0
|
# maxCnt = len(equipSuitTypeDict[groupType])
|
# cnt = 0
|
# for equipPlace in equipSuitTypeDict[groupType]:
|
# curSuiteLV = GetEquipPartSuiteLV(curPlayer, equipPlace, suitType)
|
# if curSuiteLV > 0:
|
# cnt += 1
|
# suiteLV = min(curSuiteLV, suiteLV)
|
#
|
# if cnt != maxCnt:
|
# return 0
|
# return 0 if suiteLV == 999 else suiteLV
|
|
|
|
def SetEquipPartStar(curPlayer, index, setStarLV):
|
#ÉèÖù«¹²²¿Î»ÐÇÊý
|
|
befStarLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStar % index)
|
if befStarLV == setStarLV:
|
return
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartStar % index, setStarLV)
|
|
# ͬ²½¸üÐÂÐǼ¶×ܵȼ¶
|
befTotalStarLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalEquipStar)
|
updTotalStarLV = max(0, befTotalStarLV + setStarLV - befStarLV)
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_TotalEquipStar, updTotalStarLV)
|
# ¿ª·þ»î¶¯Êý¾Ý
|
OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_StarLV, updTotalStarLV)
|
GameWorld.DebugLog("ÉèÖò¿Î»ÐǼ¶: index=%s,befStarLV=%s,setStarLV=%s,befTotalStarLV=%s,updTotalStarLV=%s"
|
% (index, befStarLV, setStarLV, befTotalStarLV, updTotalStarLV))
|
return
|
|
|
def GetEquipPartStar(curPlayer, equipPackindex):
|
#»ñÈ¡¹«¹²²¿Î»ÐÇÊý
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartStar % equipPackindex)
|
|
|
## »ñÈ¡¹«¹²²¿Î»ÉúЧµÄÐÇÊý, Òò×°±¸µÄ×î¸ß¿Éµ½ÐÇÊýÓ°Ï죬ÓÃÓÚË㵱ǰװ±¸ÊôÐÔʹÓ㬠²»Ó°ÏìÈ«ÉíÐǼ¶
|
def GetEquipPartStarByRank(curPlayer, equipPackindex, curEquip):
|
maxStarLV = ItemCommon.GetItemMaxStar(curEquip)
|
return min(GetEquipPartStar(curPlayer, equipPackindex), maxStarLV)
|
|
def GetTotalEquipStars(curPlayer):
|
##»ñÈ¡²¿Î»×ÜÐÇÊý
|
return curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalEquipStar)
|
|
## ֪ͨ¹«¹²²¿Î»ÐÇÊý
|
def NotifyEquipPartStar(curPlayer, index=None):
|
ePartStarLVPack = ChPyNetSendPack.tagMCEquipPartStarInfo()
|
ePartStarLVPack.Clear()
|
ePartStarLVPack.InfoList = []
|
syncIndexList = []
|
if index == None:
|
equipMaxClasslv = IpyGameDataPY.GetFuncCfg('EquipMaxClasslv')
|
for equipPlace in ChConfig.Pack_EquipPart_CanPlusStar.get(IPY_GameWorld.rptEquip, []):
|
for classlv in xrange(1, equipMaxClasslv+1):
|
ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classlv, equipPlace)
|
if not ipyData:
|
continue
|
syncIndexList.append(ipyData.GetGridIndex())
|
else:
|
syncIndexList = [index]
|
|
for index in syncIndexList:
|
ePartStarLV = ChPyNetSendPack.tagMCEquipPartStar()
|
ePartStarLV.Clear()
|
ePartStarLV.EquipPackIndex = index
|
ePartStarLV.Star = GetEquipPartStar(curPlayer, index)
|
ePartStarLVPack.InfoList.append(ePartStarLV)
|
|
ePartStarLVPack.Count = len(ePartStarLVPack.InfoList)
|
NetPackCommon.SendFakePack(curPlayer, ePartStarLVPack)
|
return
|
|