#!/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 ItemControler
|
import PlayerActivity
|
import ChEquip
|
import PlayerVip
|
|
import random
|
|
g_succInfoDict = {}
|
g_potentialsSkillDict = {}
|
|
|
##µÇ¼´¦Àí
|
# @param curPlayer Íæ¼Ò
|
# @return None
|
def PlayerMagicWeaponLogin(curPlayer):
|
NotifyMagicWeapon(curPlayer, True)
|
SyncXBXZAwardRecord(curPlayer)
|
Sycn_MagicWeaponLV(curPlayer)
|
return
|
|
|
def OnDay(curPlayer):
|
|
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, True)
|
|
|
def SetMagicWeaponActiveState(curPlayer, mwID, isActive=True):
|
#ÉèÖ÷¨±¦¼¤»î״̬
|
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsActive, mwID, isActive, True)
|
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:
|
sysMark = IpyGameDataPY.GetFuncEvalCfg('UnblockTreasure', 2, {}).get(mwID, 'UnblockTreasure')
|
PlayerControl.WorldNotify(0, sysMark, [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 not upIpyData:
|
return
|
skillIDList = upIpyData.GetUnLockSkill()
|
for skillID in skillIDList:
|
GiveSkill(curPlayer, skillID, GameWorld.GetGameWorld().GetTick())
|
#ÎïÆ·½±Àø
|
itemAward = upIpyData.GetItemAward()
|
if itemAward:
|
itemID, itemCnt, isBind = itemAward
|
packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, 1)
|
if 1 > packSpace:
|
PlayerControl.SendMailByKey('TreasureWakeUp', [curPlayer.GetID()], [itemAward])
|
else:
|
ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem], event=["MWAward", False, {"mwID":mwID}])
|
activeMWID = upIpyData.GetActiveMWID()
|
if activeMWID == mwID:
|
GameWorld.ErrLog(' TreasureUp.txt ÅäÖÃÒì³£ ²»¿É¼¤»î×ÔÉí·¨±¦ mwID=%s' % mwID)
|
elif activeMWID:
|
DoActiveMW(curPlayer, activeMWID)
|
|
#¼¤»î»ê
|
# activeSoulID = upIpyData.GetActiveSoulID()
|
# if activeSoulID:
|
# __DoActiveMWSoul(curPlayer, activeSoulID, False)
|
|
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
|
|
|
## ¸ø¼¼ÄÜ
|
# @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
|
|
|
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 CalcMagicWeaponAttr(curPlayer):
|
## ¼ÆËã·¨±¦ÊôÐÔ
|
allAttrList1 = [{} for _ in range(4)] #ÈË×å·¨±¦
|
allAttrList2 = [{} for _ in range(4)] #ħ×å·¨±¦
|
allAttrList3 = [{} for _ in range(4)] #ÏÉ×å·¨±¦
|
allAttrList4 = [{} for _ in range(4)] #ÍõÕß·¨±¦
|
mwTypeMfpTypeDict = {1:ShareDefine.Def_MFPType_MagicWeapon1,
|
2:ShareDefine.Def_MFPType_MagicWeapon2,
|
3:ShareDefine.Def_MFPType_MagicWeapon3,
|
4:ShareDefine.Def_MFPType_MagicWeapon4}
|
addPowerDict = {} #¶îÍâÕ½Á¦
|
signDayMWID = IpyGameDataPY.GetFuncCfg('MWSignDayAttr', 2)
|
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 = {}
|
|
treasureType = treasureIpyData.GetTreasureType()
|
if isActive:
|
mfpType = mwTypeMfpTypeDict.get(treasureType, ShareDefine.Def_MFPType_Role)
|
#µÈ¼¶ÊôÐÔ
|
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)
|
addPowerDict[mfpType] = addPowerDict.get(mfpType, 0) + upIpyData.GetPowerEx()
|
|
if magicWeaponID == signDayMWID:
|
#Ç©µ½ÊôÐÔ
|
totalSignNum = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_TotalSignNum) # ×ÜÇ©µ½ÌìÊý
|
addAttr = {}
|
for attid, attnum in IpyGameDataPY.GetFuncEvalCfg('MWSignDayAttr', 1, {}).items():
|
addAttr[int(attid)] = attnum * totalSignNum
|
GameWorld.AddDictValue(allAttrDict, addAttr)
|
#ÍõÕß·¨±¦ÊôÐÔ
|
seasonID = IpyGameDataPY.GetFuncEvalCfg('MagicWeaponOfKing', 1, {}).get(magicWeaponID, 0)
|
kingAwardLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_CrossPK_SeasonAwardLV % seasonID)
|
kingMWIpyData = IpyGameDataPY.GetIpyGameDataNotLog('MagicWeaponOfKing', magicWeaponID, kingAwardLV)
|
if kingMWIpyData and GetIsWearMagicWeapon(curPlayer, magicWeaponID):
|
attrDict = kingMWIpyData.GetAddAttr()
|
GameWorld.AddDictValue(allAttrDict, attrDict)
|
|
fbpasslv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % magicWeaponID)
|
if fbpasslv: #¸±±¾¹Ø¿¨ÊôÐÔ
|
fbipyData = IpyGameDataPY.GetIpyGameData('MagicWeaponFB', magicWeaponID, fbpasslv)
|
if fbipyData:
|
attrDict = fbipyData.GetAttrDict()
|
for effID, value in attrDict.items():
|
effID = int(effID)
|
allAttrDict[effID] = allAttrDict.get(effID, 0) + value
|
|
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)
|
elif treasureType == 4:
|
PlayerControl.CalcAttrDict_Type(effID, value, allAttrList4)
|
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)
|
PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeapon4, allAttrList4)
|
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)
|
SamboSpecialUnlock = IpyGameDataPY.GetFuncEvalCfg('SamboSpecialUnlock')
|
for equipIndex in xrange(playerEquip.GetCount()):
|
curEquip = playerEquip.GetAt(equipIndex)
|
if curEquip.IsEmpty():
|
continue
|
curClassLV = ItemCommon.GetItemClassLV(curEquip)
|
itemColor = curEquip.GetItemColor()
|
itemQuality = curEquip.GetItemQuality()
|
itemID = curEquip.GetItemTypeID()
|
for classlv, color, star, place in conditionList:
|
if equipIndex is place and itemID in SamboSpecialUnlock:
|
cnt = 1
|
break
|
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, 0, [IPY_GameWorld.rptItem])
|
|
#¸øÇ®
|
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.GetXBXZByIndex(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)
|
|
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)
|
# ÿÈջ
|
ipyData = GetWMIpyData(mwID)
|
mwType = ipyData.GetTreasureType() if ipyData else 0
|
if mwType == 1:
|
PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_MagicWeapon)
|
return
|
|
|
def Sycn_MagicWeaponLV(curPlayer, mwID=-1):
|
#֪ͨ·¨±¦µÈ¼¶ÐÅÏ¢
|
if mwID == -1:
|
isAll = True
|
needCalList = []
|
ipyDataMgr = IpyGameDataPY.IPY_Data()
|
for i in xrange(ipyDataMgr.GetTreasureCount()):
|
ipyData = ipyDataMgr.GetTreasureByIndex(i)
|
needCalList.append(ipyData.GetID())
|
else:
|
isAll = False
|
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)
|
FBPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwID)
|
isWear = GetIsWearMagicWeapon(curPlayer, mwID)
|
if isAll and not mwLv and not curUpExp and not state and not FBPassLV and not isWear:
|
continue
|
pack = ChPyNetSendPack.tagMCMagicWeaponInfo()
|
pack.MWID = mwID
|
pack.LV = mwLv
|
pack.Exp = curUpExp
|
pack.State = state
|
pack.FBPassLV = FBPassLV
|
pack.IsWear = isWear
|
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, True)
|
|
|
def SetMagicWeaponClickState(curPlayer, mwID, state=1):
|
#ÉèÖ÷¨±¦ÊÇ·ñµã»÷ÈÏÖ÷״̬
|
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsClick, mwID, state, True)
|
return
|
|
|
#// A5 1D ·¨±¦Åå´÷ #tagCMWearMagicWeapon
|
#
|
#struct tagCMWearMagicWeapon
|
#
|
#{
|
# tagHead Head;
|
# DWORD MWID; //·¨±¦ID
|
# BYTE State; //0-жÏ 1-Åå´÷
|
#};
|
def OnWearMagicWeapon(index, clientData, tick):
|
curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
|
mwID = clientData.MWID
|
if not GetIsActiveMagicWeapon(curPlayer, mwID):
|
return
|
isWear = clientData.State
|
if isWear:
|
maxCnt = IpyGameDataPY.GetFuncCfg('MagicWeaponOfKing', 2)
|
hasWearCnt = 0
|
for mid in IpyGameDataPY.GetFuncEvalCfg('MagicWeaponOfKing', 1, {}):
|
if hasWearCnt >= maxCnt:
|
return
|
if GetIsWearMagicWeapon(curPlayer, mid):
|
hasWearCnt += 1
|
|
SetMagicWeaponWearState(curPlayer, mwID, isWear)
|
CalcMagicWeaponAttr(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
Sycn_MagicWeaponLV(curPlayer, mwID)
|
return
|
|
|
def GetIsWearMagicWeapon(curPlayer, mwID):
|
#»ñÈ¡·¨±¦ÊÇ·ñÅå´÷
|
return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsWear, mwID, True)
|
|
|
def SetMagicWeaponWearState(curPlayer, mwID, state):
|
#ÉèÖ÷¨±¦ÊÇ·ñÅå´÷
|
GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsWear, mwID, state, True)
|
return
|
|
|
def UptateMWFBPasslv(curPlayer, mwID, passLV):
|
GameWorld.Log('¸üйؿ¨ mwID=%s,level=%s' % (mwID, passLV), curPlayer.GetID())
|
PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWFBPassLevel % mwID, passLV)
|
CalcMagicWeaponAttr(curPlayer)
|
PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
|
Sycn_MagicWeaponLV(curPlayer, mwID)
|
|
EventShell.EventRespons_MagicWeaponFBPassLV(curPlayer, mwID, passLV)
|
return
|