#!/usr/bin/python
# -*- coding: GBK -*-
#-------------------------------------------------------------------------------
#
##@package Player.PlayerMagicWeapon
#
# @todo:·¨±¦ÏµÍ³
# @author xdh
# @date 2017-05-18
# @version 1.0
#
# ÏêϸÃèÊö: ·¨±¦ÏµÍ³
#
#-------------------------------------------------------------------------------
#"""Version = 2017-05-18 12:00"""
#-------------------------------------------------------------------------------
import ItemCommon
import ShareDefine
import NetPackCommon
import DataRecordPack
import ChPyNetSendPack
import PlayerControl
import IPY_GameWorld
import SkillCommon
import GameWorld
import ChConfig
import IpyGameDataPY
import SkillShell
import GameFuncComm
import PlayerSuccess
import EventShell
import PassiveBuffEffMng
import OpenServerCampaign
import ItemControler
import PlayerActivity
import ChEquip
import PlayerVip
g_succInfoDict = {}
g_potentialsSkillDict = {}
##µÇ¼´¦Àí
# @param curPlayer Íæ¼Ò
# @return None
def PlayerMagicWeaponLogin(curPlayer):
NotifyMagicWeapon(curPlayer, True)
Sycn_MagicWeaponRefineLV(curPlayer)
SyncXBXZAwardRecord(curPlayer)
Sycn_MagicWeaponLV(curPlayer)
Sycn_MWPrivilegeData(curPlayer)
return
def OnDay(curPlayer):
#ÖØÖ÷¨±¦Ö®»êÿÈÕÁìÈ¡¼Ç¼
for privilege in ChConfig.MWPrivilegeList:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulGotItemState % privilege, 0)
Sycn_MWPrivilegeData(curPlayer, isForce=True)
return
def DoMagicWeaponOpen(curPlayer):
## ·¨±¦¹¦ÄÜ¿ªÆô ¼¤»îµÚÒ»¸ö·¨±¦
# ipyData = IpyGameDataPY.IPY_Data().GetTreasureByIndex(0)
# mwID = ipyData.GetID()
# GameWorld.DebugLog("·¨±¦¹¦ÄÜ¿ªÆô ¼¤»îµÚÒ»¸ö·¨±¦ mwID=%s"%mwID)
# DoActiveMW(curPlayer, mwID)
# NotifyMagicWeapon(curPlayer)
return True
def GetIsActiveMagicWeapon(curPlayer, mwID, lv=0):
#»ñÈ¡·¨±¦ÊÇ·ñ¼¤»î
#ͨ¹ýÍæ¼Ò×ÖµäÖµ¿ÉÖ±½ÓÅжÏÊÇ·ñÒѾ¼¤»î£¬ÕâÀï¿É²»ÑéÖ¤·¨±¦IDÊÇ·ñ´æÔÚ£¬¼´Ê¹´«Èë²»´æÔÚµÄÒ²ÊÇ·µ»ØÎ´¼¤»î
#if not GetWMIpyData(mwID):
# return False
if lv:
curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID)
return curMWLV >= lv
return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsActive, mwID % 100, True, [mwID / 100])
def SetMagicWeaponActiveState(curPlayer, mwID, isActive=True):
#ÉèÖ÷¨±¦¼¤»î״̬
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsActive, mwID % 100, isActive, True, [mwID / 100])
return
def ActiveMagicWeapon(curPlayer, succID):
##¼¤»î·¨±¦
mwID = GetMWIDBySuccID(succID)
if mwID == None:
return
isActive = GetIsActiveMagicWeapon(curPlayer, mwID)
if isActive:
return
succIDList = GetNeedSuccIDByMWID(mwID)
needExp = len(succIDList)
curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponExp % mwID)
if curExp >= needExp:
return
newExp = min(needExp, curExp + 1)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponExp % mwID, newExp)
DataRecordPack.DR_MagicWeaponExp(curPlayer, mwID, succID, newExp, needExp)
ipyData = GetWMIpyData(mwID)
needItemDict = ipyData.GetNeedItem()
#GameWorld.DebugLog(' ¼¤»î·¨±¦ mwID=%s,curExp=%s,succIDList=%s' % (mwID, newExp,succIDList))
if newExp >= needExp and not needItemDict:
#³É¾ÍÌõ¼þ´ï³É ¼¤»î·¨±¦
DoActiveMW(curPlayer, mwID)
return
def DoActiveMW(curPlayer, mwID, mwLV=0):
if not GetWMIpyData(mwID):
return
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponLV % mwID, mwLV)
if mwLV == 0:
SetMagicWeaponActiveState(curPlayer, mwID)
#֪ͨ
NotifyMagicWeapon(curPlayer)
if mwID in IpyGameDataPY.GetFuncEvalCfg('UnblockTreasure'):
PlayerControl.NotifyCode(curPlayer, 'UnblockTreasure', [curPlayer.GetName(), mwID])
else:
PlayerControl.WorldNotify(0, 'UnblockTreasure', [curPlayer.GetName(), mwID])
#ÈÎÎñ
EventShell.EventRespons_OnActiveMagicWeapon(curPlayer, mwID)
else:
#֪ͨ¿Í»§¶ËµÈ¼¶
Sycn_MagicWeaponLV(curPlayer, mwID)
EventShell.EventRespons_MagicWeaponLV(curPlayer, mwID, mwLV)
#³É¾Í
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_GetMagicWeapon, 1, [mwID, mwLV])
#½âËø¼¼ÄÜ
upIpyData = IpyGameDataPY.GetIpyGameData('TreasureUp', mwID, mwLV)
if upIpyData:
skillIDList = upIpyData.GetUnLockSkill()
for skillID in skillIDList:
GiveSkill(curPlayer, skillID, GameWorld.GetGameWorld().GetTick())
if upIpyData.GetPrivilegeID():
PlayerControl.WorldNotify(0, 'TreasureSoulWakeUp', [curPlayer.GetName(), upIpyData.GetPrivilegeID()])
CalcMagicWeaponAttr(curPlayer)
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
GameWorld.DebugLog(' ¼¤»î·¨±¦ mwID=%s,mwLV=%s' % (mwID, mwLV))
vipAddAtkMWID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIPɱ¹Ö¼ÓÊôÐÔËùÐ輤»î·¨±¦
if mwID == vipAddAtkMWID:
PlayerVip.RefreshVIPAttr(curPlayer)
#½âËø¹¦ÄÜ
GameFuncComm.DoFuncOpenLogic(curPlayer)
DataRecordPack.DR_MagicWeaponActive(curPlayer, mwID, mwLV)
return True
def GetWMIpyData(mwID):return IpyGameDataPY.GetIpyGameData('Treasure', mwID)
def GetNeedSuccIDByMWID(mwID, ipyData=None):
##»ñÈ¡·¨±¦ID¿ªÆôÐèÒªÍê³ÉµÄ³É¾ÍID
if not ipyData:
ipyData = GetWMIpyData(mwID)
if not ipyData:
return []
succIDList = list(ipyData.GetSuccID())
return succIDList
def GetMWIDBySuccID(succID):
global g_succInfoDict
if not g_succInfoDict:
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetTreasureCount()):
ipyData = ipyDataMgr.GetTreasureByIndex(i)
mwID = ipyData.GetID()
succIDList = GetNeedSuccIDByMWID(mwID, ipyData)
for succid in succIDList:
if succid in g_succInfoDict:
GameWorld.ErrLog(' ´æÔÚÏàͬ³É¾Í¼¤»îÌõ¼þµÄ·¨±¦ %s ºÍ %s' % (mwID, g_succInfoDict[succid]))
g_succInfoDict[succid] = mwID
return g_succInfoDict.get(succID)
def GetMWActiveCntTotal(curPlayer):
## »ñÈ¡¼¤»îµÄ·¨±¦×ܸöÊý
activeCnt = 0
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetTreasureCount()):
ipyData = ipyDataMgr.GetTreasureByIndex(i)
magicWeaponID = ipyData.GetID()
if GetIsActiveMagicWeapon(curPlayer, magicWeaponID):
activeCnt += 1
return activeCnt
def GetMWActiveCntByType(curPlayer, mwType):
## ¸ù¾Ý·¨±¦ÀàÐÍ»ñÈ¡ÒѼ¤»îÊýÁ¿
dataList = IpyGameDataPY.GetIpyGameDataByCondition('Treasure', {'TreasureType':mwType}, True, False)
if not dataList:
return 0
activeCnt = 0
for ipydata in dataList:
isActive = GetIsActiveMagicWeapon(curPlayer, ipydata.GetID())
if isActive:
activeCnt += 1
return activeCnt
def GetMWIDByPotentialsSkillID(skillID):
#ͨ¹ýDZÁ¦¼¼ÄÜID»ñÈ¡¶ÔÓ¦µÄ·¨±¦ID
global g_potentialsSkillDict
if not g_potentialsSkillDict:
g_potentialsSkillDict = {}
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetTreasureCount()):
ipyData = ipyDataMgr.GetTreasureByIndex(i)
mwID = ipyData.GetID()
skillIDList = ipyData.GetPotentials()
for curSkillID in skillIDList:
g_potentialsSkillDict[curSkillID] = mwID
return g_potentialsSkillDict.get(skillID, 0)
## ¸ø¼¼ÄÜ
# @param curPlayer
# @param skillResID ¼¼ÄÜÔ´ID
# @param tick ʱ¼ä´Á
# @return None
def GiveSkill(curPlayer, skillResID, tick, isShowSys=True):
skillData = GameWorld.GetGameData().FindSkillByType(skillResID, 1)
if skillData == None:
GameWorld.DebugLog("__GiveSkill() hasn't find skill(%s)" % skillResID)
return
if not SkillCommon.CheckSkillJob(curPlayer, skillData):
return
if not SkillShell.CheckLearnSkillCondition(curPlayer, skillData):
GameWorld.DebugLog("__GiveSkill() learn skill(%s) condition isn't enough" % skillResID)
return
skillManager = curPlayer.GetSkillManager()
if skillManager.FindSkillBySkillTypeID(skillResID):
GameWorld.DebugLog("__GiveSkill() have learned skill(%s)" % skillResID)
return
GameWorld.DebugLog(' ¼¤»î·¨±¦ ¼¤»î¼¼ÄÜ skillResID=%s' % (skillResID))
skillManager.LVUpSkillBySkillTypeID(skillResID)
if isShowSys:
PlayerControl.NotifyCode(curPlayer, "GetSkillInfo", [skillResID])
DataRecordPack.DR_LearnORUPSkill(curPlayer, skillResID, 0)
#·¨±¦±»¶¯¼¼ÄÜÐè×°±¸²ÅÉúЧ
if skillData.GetFuncType() != ChConfig.Def_SkillFuncType_FbPassiveSkill:
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, skillResID)
if SkillCommon.isPassiveAttr(skillData):
curControl = PlayerControl.PlayerControl(curPlayer)
curControl.RefreshPlayerAttrState()
PlayerControl.PlayerControl(curPlayer).RefreshSkillFightPowerEx(skillResID, 0)
return
#// A5 0D Éý¼¶·¨±¦¼¼ÄÜ #tagCMMagicWeaponSkillUp
#
#struct tagCMMagicWeaponSkillUp
#{
# tagHead Head;
# WORD SkillTypeID;
# BYTE CostIndex;
#};
def OnMagicWeaponSkillUp(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
skillTypeID = clientData.SkillTypeID
costIndex = clientData.CostIndex #0´ú±íδѡÖÐ 1´ú±íµÚÒ»¸ö
curSkillType = None
SPSkillTypeDict = IpyGameDataPY.GetFuncEvalCfg('SPSkillType')
for skillType, skillIDList in SPSkillTypeDict.items():
if skillTypeID in skillIDList:
curSkillType = int(skillType)
break
if curSkillType == None:
#²»ÊÇ·¨±¦¼¼ÄÜ
return
#»ñµÃÍæ¼Ò¼¼ÄܹÜÀíÆ÷
skillManager = curPlayer.GetSkillManager()
#»ñµÃ¼¼ÄÜ
curSkill = skillManager.FindSkillBySkillTypeID(skillTypeID)
if curSkill == None:
curSkillLV = 0
beforeFightPower = 0
else:
curSkillLV = curSkill.GetSkillLV()
beforeFightPower = curSkill.GetFightPower()
if curSkillLV == curSkill.GetSkillMaxLV():
#ÒѾÊÇ×î¸ßµÈ¼¶
PlayerControl.NotifyCode(curPlayer, "UseMagicLost16")
return
upSkillLv = curSkillLV + 1
curSkillID = skillTypeID if not curSkill else curSkill.GetSkillID()
upSkill = GameWorld.GetGameData().FindSkillByType(skillTypeID, upSkillLv)
if not upSkill:
GameWorld.DebugLog("¼¼ÄÜÉý¼¶Åä±í´íÎó ID=%s lv=%s"%(skillTypeID, upSkillLv))
return
if not SkillShell.CheckLearnSkillCondition(curPlayer, upSkill):
return
#Éý¼¶¼¼ÄÜÏûºÄ
ipyData = IpyGameDataPY.GetIpyGameData('TreasureSkill', curSkillType, upSkillLv)
if not ipyData:
return
needSP = ipyData.GetNeedPoint()
if PlayerControl.GetZhenQi(curPlayer) < needSP:
GameWorld.DebugLog("·¨±¦sp²»×㣬ÎÞ·¨Éý¼¶¼¼ÄÜ£¡needSP=%s,skillTypeID=%s" % (needSP, skillTypeID), curPlayer.GetPlayerID())
return
initRate = ipyData.GetInitRate() #³õʼ¸ÅÂÊ
itemIndexList = []
if initRate != ShareDefine.Def_MaxRateValue and costIndex > 0:
#Âú¸ÅÂʲ»ÏûºÄµÀ¾ß
needItemIDList = ipyData.GetNeedItemID()
needItemCntList = ipyData.GetNeedItemCnt()
maxRateList = ipyData.GetMaxRate()
if costIndex - 1 >= len(needItemIDList):
GameWorld.Log("·¨±¦¼¼ÄÜÉý¼¶£¬costIndex=%s ´íÎó" % costIndex)
return
needItemID, needItemCnt, initRate = needItemIDList[costIndex - 1], needItemCntList[costIndex - 1], maxRateList[costIndex - 1]
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
isEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(needItemID, itemPack, needItemCnt)
if not isEnough:
GameWorld.DebugLog("Éý¼¶·¨±¦¼¼ÄÜ() up skill(%s) item(%s) no enough" \
% (upSkill.GetSkillID(), needItemID))
return
#¿ÛÎïÆ·
if itemIndexList:
ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, needItemCnt, False, ChConfig.ItemDel_MagicWeapon,
{"SkillTypeID":skillTypeID, "SkillLV":curSkillLV})
#¸¶Ç®
#infoDict = {"SkillID":skillTypeID, "SkillLV":upSkillLv, ChConfig.Def_Cost_Reason_SonKey:upSkill.GetSkillName()}
if not PlayerControl.PlayerLostZhenQi(curPlayer, needSP):
return
if not GameWorld.CanHappen(initRate):
GameWorld.DebugLog("·¨±¦¼¼ÄÜÉý¼¶£¬curSkillID=%s, maxRate=%s Éý¼¶Ê§°Ü" % (curSkillID, initRate))
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMagicWeaponSkillUp, 0)
return
curControl = PlayerControl.PlayerControl(curPlayer)
skillManager.LVUPSkillByID(curSkillID)
#´¥·¢Ñ§Ï°Ð¼¼ÄÜ
newSkillIsPassive = False
potentialSkillLearnDict = IpyGameDataPY.GetFuncEvalCfg('PotentialSkillLearn')
if str(skillTypeID) in potentialSkillLearnDict:
needSkllLV, newSkillID = potentialSkillLearnDict[str(skillTypeID)]
if upSkillLv == needSkllLV:
if not skillManager.FindSkillBySkillTypeID(newSkillID):
newSkill = GameWorld.GetGameData().FindSkillByType(newSkillID, 1)
if newSkill:
skillManager.LVUPSkillByID(newSkillID)
GameWorld.DebugLog(' ·¨±¦¼¼ÄÜÉý¼¶ skillTypeID=%s, upSkillLv=%s, ´¥·¢Ñ§Ï°¼¼ÄÜ%s' % (skillTypeID, upSkillLv, newSkillID))
curControl.RefreshSkillFightPowerEx(newSkillID, beforeFightPower)
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, newSkillID)
if SkillCommon.isPassiveAttr(newSkill):
newSkillIsPassive = True
if SkillCommon.isPassiveAttr(upSkill) or newSkillIsPassive:
curControl.RefreshPlayerAttrState()
curControl.RefreshSkillFightPowerEx(upSkill.GetSkillID(), beforeFightPower)
PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, upSkill.GetSkillID())
#֪ͨ¼¼ÄÜÒÑÉý¼¶³É¹¦ GeRen_admin_31379
#¹§Ï²Äú½«ÉýÖÁ{%S2%}¼¶!
#PlayerControl.NotifyCode(curPlayer, "GeRen_admin_31379", [skillTypeID, upSkillLv])
#»ñµÃ¼¼Äܵȼ¶
#curSkillLV = curSkill.GetSkillLV()
GameWorld.DebugLog(' ·¨±¦¼¼ÄÜÉý¼¶ skillTypeID=%s, upSkillLv=%s' % (skillTypeID, upSkillLv))
DataRecordPack.DR_LearnORUPSkill(curPlayer, skillTypeID, upSkillLv)
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMagicWeaponSkillUp, 1)
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_MWSkillUp, 1, [skillTypeID])
EventShell.EventRespons_MWSkillUp(curPlayer)
return
def NotifyMagicWeapon(curPlayer, isLogin=False):
#֪ͨ·¨±¦ÐÅÏ¢
packData = ChPyNetSendPack.tagMCMagicWeaponData()
packData.Clear()
packData.MagicWeaponID = []
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetTreasureCount()):
ipyData = ipyDataMgr.GetTreasureByIndex(i)
magicWeaponID = ipyData.GetID()
isActive = GetIsActiveMagicWeapon(curPlayer, magicWeaponID)
if not isActive:
continue
packData.MagicWeaponID.append(magicWeaponID)
packData.Num = len(packData.MagicWeaponID)
if packData.Num or isLogin:
NetPackCommon.SendFakePack(curPlayer, packData)
return
##--------------------------------------------------------------------------------------------------
def GetMWRefineIpyData(treasureID, treasureLV):
#»ñÈ¡·¨±¦µÈ¼¶ÐÅÏ¢
return IpyGameDataPY.GetIpyGameDataNotLog("TreasureRefine", treasureID, treasureLV)
def CalcMagicWeaponAttr(curPlayer):
## ¼ÆËã·¨±¦ÊôÐÔ
allAttrList1 = [{} for _ in range(4)] #ÈË×å·¨±¦
allAttrList2 = [{} for _ in range(4)] #ħ×å·¨±¦
allAttrList3 = [{} for _ in range(4)] #ÏÉ×å·¨±¦
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetTreasureCount()):
treasureIpyData = ipyDataMgr.GetTreasureByIndex(i)
magicWeaponID = treasureIpyData.GetID()
isActive = GetIsActiveMagicWeapon(curPlayer, magicWeaponID)
if not isActive:
continue
allAttrDict = {}
#=======================================================================
# #ÖýÁ¶ÊôÐÔ
# mwRefineLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % magicWeaponID)
# refineipyData = GetMWRefineIpyData(magicWeaponID, mwRefineLv)
# if refineipyData:
# attrDict = refineipyData.GetTreasureAttr()
# GameWorld.AddDictValue(allAttrDict, attrDict)
#=======================================================================
#µÈ¼¶ÊôÐÔ
curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % magicWeaponID)
for lv in xrange(curMWLV+1):
upIpyData = IpyGameDataPY.GetIpyGameDataNotLog('TreasureUp', magicWeaponID, lv)
if upIpyData:
attrDict = upIpyData.GetAddAttr()
GameWorld.AddDictValue(allAttrDict, attrDict)
privilegeID = upIpyData.GetPrivilegeID()
if privilegeID:
# ·¨±¦Ö®»ê
attrDict = GetMagicWeaponPrivilegeAttr(curPlayer, privilegeID)
GameWorld.AddDictValue(allAttrDict, attrDict)
treasureType = treasureIpyData.GetTreasureType()
for effID, value in allAttrDict.items():
if treasureType == 1:
PlayerControl.CalcAttrDict_Type(effID, value, allAttrList1)
elif treasureType == 2:
PlayerControl.CalcAttrDict_Type(effID, value, allAttrList2)
elif treasureType == 3:
PlayerControl.CalcAttrDict_Type(effID, value, allAttrList3)
else:
GameWorld.ErrLog("δ֪·¨±¦ÊôÐÔ, magicWeaponID=%s,treasureType=%s,effID=%s,value=%s"
% (magicWeaponID, treasureType, effID, value), curPlayer.GetPlayerID())
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon1, allAttrList1)
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon2, allAttrList2)
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon3, allAttrList3)
return
#// A5 77 Íæ¼Ò¾«Á¶·¨±¦ #tagCMMWRefine
#
#struct tagCMMWRefine
#{
# tagHead Head;
# DWORD MWID; // ·¨±¦ID
# DWORD MaterialID; //²ÄÁÏID
#};
def PlayerMWRefine(index, clientPack, tick):
mwID = clientPack.MWID # ·¨±¦ID
materialID = clientPack.MaterialID # ÌáÉý¸ÅÂÊÎïÆ·ID
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
playerID = curPlayer.GetPlayerID()
allTreasureItemIDList = IpyGameDataPY.GetFuncEvalCfg("TreasureUpRateItem")
if mwID not in allTreasureItemIDList:
GameWorld.DebugLog("¸Ã·¨±¦²»ÄÜÖýÁ¶-·¨±¦ID:%s" % mwID, playerID)
return
isActive = GetIsActiveMagicWeapon(curPlayer, mwID)
if not isActive:
GameWorld.DebugLog("·¨±¦Î´¼¤»î£¬²»ÄÜÖýÁ¶-·¨±¦ID:%s" % mwID, playerID)
return
nextRefineLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % mwID) + 1
mwRefineIpyData = GetMWRefineIpyData(mwID, nextRefineLv)
if not mwRefineIpyData:
GameWorld.DebugLog("·¨±¦ÒÑÂú¼¶£¬²»ÄÜÖýÁ¶-·¨±¦ID:%s, nextRefineLv=%s" % (mwID, nextRefineLv), playerID)
return
# ËùÐèÁ¶µ¤Â¯µÈ¼¶
alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
if alchemyLV < mwRefineIpyData.GetNeedAlchemyLV():
GameWorld.DebugLog("Á¶µ¤Â¯µÈ¼¶²»×㣬ÎÞ·¨ÖýÁ¶·¨±¦-·¨±¦ID:%s, nextRefineLv=%s,alchemyLV=%s,NeedAlchemyLV=%s"
% (mwID, nextRefineLv, alchemyLV, mwRefineIpyData.GetNeedAlchemyLV()), playerID)
return
# ËùÐèËùÓз¨±¦µÈ¼¶
needAllTreasureLV = mwRefineIpyData.GetNeedAllTreasureLV()
for tID in allTreasureItemIDList:
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % tID) < needAllTreasureLV:
GameWorld.DebugLog("ËùÓз¨±¦Ðè´ïµ½¶ÔÓ¦µÈ¼¶ºó²Å¿É¼ÌÐøÖýÁ¶! needAllTreasureLV=%s" % needAllTreasureLV, playerID)
return
needItemDict = mwRefineIpyData.GetMaterial()
fujiaRate = 0
if materialID:
treasureUpRateItem = IpyGameDataPY.GetFuncEvalCfg("TreasureUpRateItem", 2)
if materialID not in treasureUpRateItem:
GameWorld.ErrLog("¸ÃÎïÆ·IDÎÞ·¨ÓÃÓÚÌáÉý·¨±¦ÖýÁ¶¸ÅÂÊ£¡itemID=%s" % (materialID), playerID)
return
rateItemData = GameWorld.GetGameData().GetItemByTypeID(materialID)
if not rateItemData:
return
fujiaRate = rateItemData.GetEffectByIndex(0).GetEffectValue(0)
needItemDict[materialID] = 1
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemDict, itemPack)
if lackItemDict:
GameWorld.DebugLog("·¨±¦ÖýÁ¶²ÄÁϲ»×㣡·¨±¦ID:%s, nextRefineLv=%s,needItemDict=%s,lackItemDict=%s,hasItemDict=%s"
% (mwID, nextRefineLv, needItemDict, lackItemDict, delInfoDict), playerID)
return
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_MagicWeapon)
successRate = mwRefineIpyData.GetSuccessRate() + fujiaRate
if GameWorld.CanHappen(successRate):
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponRefineLV % mwID, nextRefineLv)
skillID = mwRefineIpyData.GetOpenSkill()
if skillID:
GiveSkill(curPlayer, skillID, tick)
CalcMagicWeaponAttr(curPlayer)
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
#֪ͨ¿Í»§¶Ë
Sycn_MagicWeaponRefineLV(curPlayer, mwID)
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMWUpLevel, ChConfig.Def_ComposeState_Sucess)
GameWorld.DebugLog("·¨±¦ÖýÁ¶³É¹¦! ·¨±¦ID:%s, upRefineLv=%s,successRate=%s" % (mwID, nextRefineLv, successRate), playerID)
else:
curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMWUpLevel, ChConfig.Def_ComposeState_Fail)
GameWorld.DebugLog("·¨±¦ÖýÁ¶Ê§°Ü! ·¨±¦ID:%s, nextRefineLv=%s,successRate=%s" % (mwID, nextRefineLv, successRate), playerID)
return
def Sycn_MagicWeaponRefineLV(curPlayer, mwID= -1):
if mwID == -1:
needCalList = IpyGameDataPY.GetFuncEvalCfg("TreasureUpRateItem")
else:
needCalList = [mwID]
sendPack = ChPyNetSendPack.tagMCMagicWeaponMsg()
sendPack.MWInfo = []
for mwID in needCalList:
mwRefineLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponRefineLV % mwID)
if not mwRefineLv:
continue
pack = ChPyNetSendPack.tagMCMagicWeaponLV()
pack.MWID = mwID
pack.MWLV = mwRefineLv
sendPack.MWInfo.append(pack)
sendPack.Count = len(sendPack.MWInfo)
if sendPack.Count:
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
#// A5 0E ¿ªÆô·¨±¦ #tagCMOpenMagicWeapon
#
#struct tagCMOpenMagicWeapon
#
#{
# tagHead Head;
# DWORD MWID;
#};
def OnOpenMagicWeapon(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
mwID = clientData.MWID
isActive = GetIsActiveMagicWeapon(curPlayer, mwID)
if isActive:
GameWorld.DebugLog(' ¸Ã·¨±¦ÒÑ¿ªÆô£¡ mwID=%s' % mwID)
return
succIDList = GetNeedSuccIDByMWID(mwID)
curExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponExp % mwID)
if curExp < len(succIDList):
GameWorld.DebugLog(' ¸Ã·¨±¦ËùÐè³É¾ÍδÍê³É£¡ mwID=%s£¬ curExp=%s, succIDList=%s' % (mwID, curExp, succIDList))
return
#ÏûºÄÎïÆ·ÅжÏ
ipyData = GetWMIpyData(mwID)
needItemDict = ipyData.GetNeedItem()
if needItemDict:
#ͨ¹ý´Ë;¾¶½âËø·¨±¦ ±ØÐëÒªÅäÏûºÄÎïÆ·
itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
lackItemDict, delInfoDict = ItemCommon.GetCostItemIndexList(needItemDict, itemPack, False)
if lackItemDict:
GameWorld.DebugLog(" ¿ªÆô·¨±¦ ²ÄÁϲ»×㣡mwID=%s,needItemDict=%s,lackItemDict=%s,delInfoDict=%s"
% (mwID, needItemDict, lackItemDict, delInfoDict))
return
#¿ÛÏûºÄ
ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_MagicWeapon)
else:
ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('XBXZ', {'MWID':mwID}, True, False)
if not ipyDataList:
return
for ipyData in ipyDataList:
if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, ipyData.GetID()):
return
DoActiveMW(curPlayer, mwID)
return
#-------------------------------------------------------------------------------
def OnGetXBXZAward(curPlayer, index):
##Ïɱ¦Ñ°Ö÷Áì½±
ipyData = IpyGameDataPY.GetIpyGameData('XBXZ', index)
if not ipyData:
return
if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, index):
GameWorld.DebugLog(' Ïɱ¦Ñ°Ö÷Áì½± ÒÑÁìÈ¡£¡ index=%s' % index)
return
curType = ipyData.GetType()
conditionList = ipyData.GetCondition()
cnt = 0
if curType == 1:
#½ÇÉ«·ÀÓùµ½XX
cnt = PlayerControl.GetFuncDef(curPlayer)
elif curType == 2:
#´©´÷Èý½×³ÈÉ«1ÐÇ»òËĽ××ÏÉ«1ÐÇÒÔÉÏÍ·¿ø
playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
for equipIndex in xrange(playerEquip.GetCount()):
curEquip = playerEquip.GetAt(equipIndex)
if curEquip.IsEmpty():
continue
curClassLV = ItemCommon.GetItemClassLV(curEquip)
itemColor = curEquip.GetItemColor()
itemQuality = curEquip.GetItemQuality()
for classlv, color, star, place in conditionList:
if equipIndex is place and curClassLV >= classlv and itemColor >= color and itemQuality >= star:
cnt = 1
break
if cnt:
break
elif curType == 3:
#È«Éí×°±¸XÐÇ
cnt = ChEquip.GetTotalEquipStars(curPlayer)
elif curType == 4:
#X½×ÆÕͨ¡¢Ç¿»¯Ì××°
suiteCntDict = {}
playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
for equipIndex in xrange(playerEquip.GetCount()):
curEquip = playerEquip.GetAt(equipIndex)
if curEquip.IsEmpty():
continue
suiteInfo = ChEquip.GetSuiteInfoByPlace(curPlayer, equipIndex, curEquip)
for suitelv, suiteType in conditionList:
if suiteInfo.get(suiteType, 0) >= suitelv:
suiteCntDict[suiteType] = suiteCntDict.get(suiteType, 0)+1
cnt = max(suiteCntDict.values()) if suiteCntDict else 0
else:
return
if cnt < ipyData.GetNeedCnt():
GameWorld.DebugLog(' Ïɱ¦Ñ°Ö÷Áì½± , Ìõ¼þ²»Âú×ã ID=%s, cnt=%s,NeedCnt=%s' % (index, cnt, ipyData.GetNeedCnt()))
return
# ¼ì²é±³°ü
awardItemList = ipyData.GetAwardItem()
if awardItemList:
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem)
needSpace = len(awardItemList)
if needSpace > packSpace:
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_998371")
return
# ¸üÐÂÁì½±¼Ç¼
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, index, 1)
# ¸øÎïÆ·
if awardItemList:
for itemID, itemCnt in awardItemList:
ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 1, [IPY_GameWorld.rptItem], True)
#¸øÇ®
for moneyType, value in ipyData.GetMoney():
PlayerControl.GiveMoney(curPlayer, moneyType, value)
SyncXBXZAwardRecord(curPlayer,[index])
#³É¾Í
PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XBXZ, 1, [ipyData.GetMWID()])
GameWorld.DebugLog(' Ïɱ¦Ñ°Ö÷Áì½±OK, ID=%s, cnt=%s' % (index, cnt))
return
## ֪ͨÏɱ¦Ñ°Ö÷¶ÔÓ¦½±ÀøÁì½±¼Ç¼
# @param None
# @return
def SyncXBXZAwardRecord(curPlayer, syncIDList=[]):
if syncIDList:
recordIndexList = []
for succID in syncIDList:
recordIndexList.append(succID / 31)
else:
ipyDataMgr = IpyGameDataPY.IPY_Data()
succCnt = ipyDataMgr.GetXBXZCount()
if not succCnt:
return
maxSuccid = ipyDataMgr.GetSuccessByIndex(succCnt-1).GetID()
recordIndexList = range(maxSuccid / 31+1)
succFARPack = ChPyNetSendPack.tagMCXBXZAwardRecordList()
succFARPack.Clear()
succFARPack.RecordList = []
for i in recordIndexList:
awardRecord=curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XBXZAwardRecord%i)
if not awardRecord:
continue
recordInfo = ChPyNetSendPack.tagMCXBXZAwardRecord()
recordInfo.RecordIndex = i
recordInfo.Record = awardRecord
succFARPack.RecordList.append(recordInfo)
succFARPack.RecordCnt = len(succFARPack.RecordList)
NetPackCommon.SendFakePack(curPlayer, succFARPack)
return
#-------------------------------------------------------------------------------
#// A5 15 ÌáÉý·¨±¦µÈ¼¶ #tagCMMagicWeaponUp
#
#struct tagCMMagicWeaponUp
#
#{
# tagHead Head;
# DWORD WMID; //·¨±¦ID
#};
def OnMagicWeaponUp(index, clientData, tick):
#·¨±¦Éý¼¶
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
mwID = clientData.MWID
curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID)
nextMWLV = curMWLV+1
nextIpyData = IpyGameDataPY.GetIpyGameData('TreasureUp', mwID, nextMWLV)
if not nextIpyData:
return
needExp = nextIpyData.GetNeedExp()
curUpExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponUpExp % mwID)
if curUpExp < needExp:
GameWorld.DebugLog('·¨±¦Éý¼¶¾Ñé²»×ã%s'%needExp)
return
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponUpExp % mwID, curUpExp-needExp)
DoActiveMW(curPlayer, mwID, nextMWLV)
# ÿÈջ
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_MagicWeapon)
return
def AddMagicWeaponUpExp(curPlayer, mwID, addExp):
#Ôö¼Ó·¨±¦Éý¼¶¾Ñé
GameWorld.DebugLog('Ôö¼Ó·¨±¦Éý¼¶¾Ñé mwID=%s,addExp=%s'%(mwID, addExp))
curUpExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponUpExp % mwID)
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponUpExp % mwID, curUpExp+addExp)
Sycn_MagicWeaponLV(curPlayer, mwID)
return
def Sycn_MagicWeaponLV(curPlayer, mwID= -1):
#֪ͨ·¨±¦µÈ¼¶ÐÅÏ¢
if mwID == -1:
needCalList = []
ipyDataMgr = IpyGameDataPY.IPY_Data()
for i in xrange(ipyDataMgr.GetTreasureCount()):
ipyData = ipyDataMgr.GetTreasureByIndex(i)
needCalList.append(ipyData.GetID())
else:
needCalList = [mwID]
sendPack = ChPyNetSendPack.tagMCMagicWeaponLVInfo()
sendPack.InfoList = []
for mwID in needCalList:
mwLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID)
curUpExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponUpExp % mwID)
state = GetIsClickMagicWeapon(curPlayer, mwID)
if not mwLv and not curUpExp and not state:
continue
pack = ChPyNetSendPack.tagMCMagicWeaponInfo()
pack.MWID = mwID
pack.LV = mwLv
pack.Exp = curUpExp
pack.State = state
sendPack.InfoList.append(pack)
sendPack.Count = len(sendPack.InfoList)
if sendPack.Count:
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
def GetMagicWeaponPrivilege(curPlayer, privilege):
#·¨±¦µÈ¼¶È¨ÏÞ
ipyData = IpyGameDataPY.GetIpyGameDataByCondition('TreasureUp', {'PrivilegeID':privilege}, False, False)
if not ipyData:
return 0
mwID = ipyData.GetMWID()
mwLV = ipyData.GetLV()
curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID)
if curMWLV < mwLV:
return 0
privilegeIpyData = IpyGameDataPY.GetIpyGameDataNotLog('TreasurePrivilege', privilege)
if not privilegeIpyData:
return 0
return privilegeIpyData
def GetMagicWeaponPrivilegeAttr(curPlayer, privilege):
#»ñÈ¡·¨±¦ÌØÈ¨Ôö¼ÓµÄÊôÐÔ
addAttr = {}
privilegeIpyData = IpyGameDataPY.GetIpyGameDataNotLog('TreasurePrivilege', privilege)
if not privilegeIpyData:
return addAttr
attrInfo = privilegeIpyData.GetAddAttr()
if not attrInfo:
attrInfo = {}
singleValue = privilegeIpyData.GetSingleValue()
if privilege == ChConfig.MWPrivilege_SignDayAddAttr:
totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # ×ÜÇ©µ½ÌìÊý
for attid, attnum in attrInfo.items():
addAttr[int(attid)] = attnum * totalSignNum
elif privilege == ChConfig.MWPrivilege_EquipPlus:
#Ç¿»¯¼Ó³É
addAttr = ChEquip.CalcAllEquipAllPlusLVAttr(curPlayer)
else:
multiple = 1 #±¶Êý
if singleValue:
gotValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotValue % privilege)
multiple = gotValue/singleValue
for attid, attnum in attrInfo.items():
addAttr[int(attid)] = attnum * multiple
GameWorld.DebugLog(' »ñÈ¡·¨±¦ÌØÈ¨Ôö¼ÓµÄÊôÐÔ privilege=%s,addAttr=%s' % (privilege,addAttr), curPlayer.GetID())
return addAttr
def SetMWPrivilegeData(curPlayer, privilege, data, isAdd=False):
##ÉèÖ÷¨±¦ÌØÈ¨Ïà¹ØÊý¾Ý
privilegeIpyData = IpyGameDataPY.GetIpyGameDataNotLog('TreasurePrivilege', privilege)
if not privilegeIpyData:
return
curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulCurValue % privilege)
newData = curValue + data if isAdd else data
maxValue = privilegeIpyData.GetMaxValue()
if maxValue:
newData = min(maxValue, newData)
if curValue != newData:
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulCurValue % privilege, newData)
Sycn_MWPrivilegeData(curPlayer, privilege)
GameWorld.Log(' privilege=%s,data=%s,curValue=%s,newData=%s'%(privilege, data,curValue,newData))
return
def GetMWSoulAward(curPlayer, privilege):
#ÁìÈ¡·¨±¦Ö®»ê½±Àø
ipyData = GetMagicWeaponPrivilege(curPlayer, privilege)
if not ipyData:
GameWorld.DebugLog('ÁìÈ¡·¨±¦Ö®»ê½±Àø£¬¶ÔÓ¦·¨±¦Ö®»êδ¼¤»î£¬»òδÅäÖà privilege=%s'%privilege)
return
singleValue = ipyData.GetSingleValue()
if singleValue:
#´ïµ½½ø¶ÈÔò¿ÉÁìÈ¡ÊôÐÔ
curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulCurValue % privilege)
gotValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotValue % privilege)
canGetCnt = (curValue - gotValue) / singleValue
if canGetCnt <= 0:
return
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulGotValue % privilege, gotValue+canGetCnt*singleValue)
CalcMagicWeaponAttr(curPlayer)
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
itemList = ipyData.GetItemAward()
if itemList:
#ÿÈÕÎïÆ·½±Àø
if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotItemState % privilege):
GameWorld.Log(' ÁìÈ¡·¨±¦Ö®»ê½±Àø ½ñÈÕÒÑÁìÈ¡ privilege=%s'%privilege)
return
needSpace = len(itemList)
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
if needSpace > packSpace:
PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_676165", [IPY_GameWorld.rptItem])
return
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulGotItemState % privilege, 1)
for itemid, cnt, isBind in itemList:
ItemControler.GivePlayerItem(curPlayer, int(itemid), int(cnt), isBind,
[IPY_GameWorld.rptItem], True, showSysInfo=True, event=["MWSoulAward", False, {"privilege":privilege}])
#֪ͨ
Sycn_MWPrivilegeData(curPlayer, privilege)
return
def Sycn_MWPrivilegeData(curPlayer, privilegeID= -1, isForce=False):
#֪ͨ·¨±¦ÌØÈ¨ÐÅÏ¢
if privilegeID == -1:
needCalList = ChConfig.MWPrivilegeList
else:
needCalList = [privilegeID]
sendPack = ChPyNetSendPack.tagMCMWPrivilegeDataInfo()
sendPack.InfoList = []
for priID in needCalList:
pack = ChPyNetSendPack.tagMCMWPrivilegeData()
pack.CurValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulCurValue % priID)
pack.GotValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotValue % priID)
pack.ItemAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotItemState % priID)
if not isForce and max([pack.CurValue, pack.GotValue, pack.ItemAwardState]) == 0:
continue
pack.PriID = priID
sendPack.InfoList.append(pack)
sendPack.Count = len(sendPack.InfoList)
if sendPack.Count:
NetPackCommon.SendFakePack(curPlayer, sendPack)
return
#// A5 16 ·¨±¦×´Ì¬¼Ç¼ #tagCMMagicWeaponState
#
#struct tagCMMagicWeaponState
#
#{
# tagHead Head;
# DWORD MWID; //·¨±¦ID
#};
def SaveMagicWeaponState(index, clientData, tick):
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
mwID = clientData.MWID
if GetIsClickMagicWeapon(curPlayer, mwID):
return
SetMagicWeaponClickState(curPlayer, mwID)
Sycn_MagicWeaponLV(curPlayer, mwID)
return
def GetIsClickMagicWeapon(curPlayer, mwID):
#»ñÈ¡·¨±¦ÊÇ·ñµã»÷ÈÏÖ÷
return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsClick, mwID % 100, True, [mwID / 100])
def SetMagicWeaponClickState(curPlayer, mwID, state=1):
#ÉèÖ÷¨±¦ÊÇ·ñµã»÷ÈÏÖ÷״̬
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsClick, mwID % 100, state, True, [mwID / 100])
return