From a37eb96d6acab1cee41fbaba5010285099ee0ae7 Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期二, 02 七月 2019 16:52:23 +0800 Subject: [PATCH] 7724 【后端】【主干】分解获得仙丹材料的体验优化 --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py | 895 ++++++++++++++++------------------------------------------- 1 files changed, 245 insertions(+), 650 deletions(-) diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py index 6803e85..d146863 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py @@ -9,7 +9,7 @@ # @date 2017-05-18 # @version 1.0 # -# 详细描述: 法宝系统 +# 详细描述: 法宝系统 目前激活方式:1.任务接口激活 2.通关副本 3.获得某物品 4.仙宝寻主 # #------------------------------------------------------------------------------- #"""Version = 2017-05-18 12:00""" @@ -33,28 +33,24 @@ import PassiveBuffEffMng import ItemControler import PlayerActivity -import ChEquip +import FBCommon import PlayerVip -g_succInfoDict = {} -g_potentialsSkillDict = {} +import random + ##登录处理 # @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): ## 法宝功能开启 激活第一个法宝 @@ -62,74 +58,64 @@ # 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 GetIsActiveMagicWeapon(curPlayer, mwID, lv=1): + #获取法宝是否达到X级 + curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID) + return curMWLV >= lv -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: - #成就条件达成 激活法宝 + + +def ActiveMagicWeaponByFB(curPlayer, mapID, lineID, passLV=0): + ##通关副本激活法宝(人族、魔族法宝) + ipyData = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'LineID':lineID, 'Level':passLV}, isLogNone=False) + if ipyData: + mwID = ipyData.GetMWID() + GameWorld.Log('更新魔族副本关卡 mwID=%s,level=%s' % (mwID, passLV), curPlayer.GetID()) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWFBPassLevel % mwID, passLV) + Sycn_MagicWeaponLV(curPlayer, mwID) + EventShell.EventRespons_MagicWeaponFBPassLV(curPlayer, mwID, passLV) + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'LineID':lineID}, True) + maxLevel = ipyDataList[-1].GetLevel() + if passLV >= maxLevel: + DoActiveMW(curPlayer, mwID) + else: + CalcMagicWeaponAttr(curPlayer) + PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() + else: + ipyData = IpyGameDataPY.GetIpyGameDataByCondition('Treasure', {'FBMapID':mapID, 'FBLineID':lineID}) + if not ipyData: + return + mwID = ipyData.GetID() + if curPlayer.GetLV() < ipyData.GetNeedLV(): + GameWorld.Log('通关副本激活法宝 ,等级不足!!!mwID=%s, needLV=%s' % (mwID, ipyData.GetNeedLV())) + return + DoActiveMW(curPlayer, mwID) - return -def DoActiveMW(curPlayer, mwID, mwLV=0): + +def DoActiveMW(curPlayer, mwID, mwLV=1): if not GetWMIpyData(mwID): return PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponLV % mwID, mwLV) - if mwLV == 0: - SetMagicWeaponActiveState(curPlayer, mwID) - #通知 - NotifyMagicWeapon(curPlayer) - - + if mwLV == 1: + 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) + sysMark = IpyGameDataPY.GetFuncEvalCfg('UnblockTreasure', 2, {}).get(mwID, 'UnblockTreasure') + PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetName(), mwID]) + if mwID == IpyGameDataPY.GetFuncCfg('FabaoAddPoint', 1): + __DoFabaoAddPoint(curPlayer) + + + EventShell.EventRespons_MagicWeaponLV(curPlayer, mwID, mwLV) + #通知客户端等级 + Sycn_MagicWeaponLV(curPlayer, mwID) #成就 PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_GetMagicWeapon, 1, [mwID, mwLV]) @@ -140,28 +126,14 @@ 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, isBind, - [IPY_GameWorld.rptItem], True, showSysInfo=True, event=["MWAward", False, {"mwID":mwID}]) - activeMWID = upIpyData.GetActiveMWID() - if activeMWID == mwID: - GameWorld.ErrLog(' TreasureUp.txt 配置异常 不可激活自身法宝 mwID=%s'%mwID) - elif activeMWID: - DoActiveMW(curPlayer, activeMWID) + CalcMagicWeaponAttr(curPlayer) PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() GameWorld.DebugLog(' 激活法宝 mwID=%s,mwLV=%s' % (mwID, mwLV)) - vipAddAtkMWID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIP杀怪加属性所需激活法宝 + vipAddAtkMWID = IpyGameDataPY.GetFuncCfg("VIPAddAtkEXP", 2) # VIP杀怪加属性所需激活法宝 if mwID == vipAddAtkMWID: PlayerVip.RefreshVIPAttr(curPlayer) @@ -170,31 +142,29 @@ DataRecordPack.DR_MagicWeaponActive(curPlayer, mwID, mwLV) return True +# 获得法宝加点 +def __DoFabaoAddPoint(curPlayer): + if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_AddPoint): + # 未开启前不可加点,因为DoAddPointOpen会一次性补齐,避免意外情况多加了点数 + return + addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {}) + fabaoAddPoint = PlayerControl.GetFabaoAddPoint(curPlayer) + + curLV = curPlayer.GetLV() + addFreePoint = 0 + for rangLVs, point in addPointDict.items(): + if curLV < rangLVs[0]: + continue + addFreePoint += fabaoAddPoint * (min(curLV, rangLVs[1]) - rangLVs[0] + 1) + freePoint = curPlayer.GetFreePoint() + updFreePoint = freePoint + addFreePoint + curPlayer.SetFreePoint(updFreePoint) + GameWorld.DebugLog("获得法宝增加自由属性点: freePoint=%s,addFreePoint=%s,curLV=%s,updFreePoint=%s" + % (freePoint, addFreePoint, curLV, updFreePoint)) + + return 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): ## 获取激活的法宝总个数 @@ -206,6 +176,7 @@ if GetIsActiveMagicWeapon(curPlayer, magicWeaponID): activeCnt += 1 return activeCnt + def GetMWActiveCntByType(curPlayer, mwType): ## 根据法宝类型获取已激活数量 @@ -219,20 +190,6 @@ activeCnt += 1 return activeCnt -def GetPotentialsNextSkillID(skillID): - #通过潜力技能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 i, curSkillID in enumerate(skillIDList): - nextSkillID = skillIDList[i+1] if i+1 < len(skillIDList) else 0 - g_potentialsSkillDict[curSkillID] = nextSkillID - return g_potentialsSkillDict.get(skillID, 0) ## 给技能 # @param curPlayer @@ -271,216 +228,66 @@ 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, 0) - PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, newSkillID) - if SkillCommon.isPassiveAttr(newSkill): - newSkillIsPassive = True - PlayerControl.WorldNotify(0, 'SkillPotential2', [curPlayer.GetName(), skillTypeID, upSkillLv, newSkillID]) - - - if SkillCommon.isPassiveAttr(upSkill) or newSkillIsPassive: - curControl.RefreshPlayerAttrState() - - curControl.RefreshSkillFightPowerEx(upSkill.GetSkillID(), beforeFightPower) - PassiveBuffEffMng.GetPassiveEffManager().RegistPassiveEff(curPlayer, upSkill.GetSkillID()) - - #通知技能已升级成功 - nextSkillID = GetPotentialsNextSkillID(skillTypeID) - if nextSkillID: - nextSkill = GameWorld.GetGameData().FindSkillByType(nextSkillID, 1) - if nextSkill and nextSkill.GetLearnSkillReq() == skillTypeID and upSkillLv == nextSkill.GetLearnSkillLV(): - PlayerControl.WorldNotify(0, 'SkillPotential1', [curPlayer.GetName(), skillTypeID, upSkillLv, nextSkillID]) - - maxLV = upSkill.GetSkillMaxLV() - if upSkillLv == maxLV: - PlayerControl.WorldNotify(0, 'SkillPotential3', [curPlayer.GetName(), skillTypeID, maxLV]) - - #获得技能等级 - #curSkillLV = curSkill.GetSkillLV() - GameWorld.DebugLog(' 法宝技能升级 skillTypeID=%s, upSkillLv=%s' % (skillTypeID, upSkillLv)) - DataRecordPack.DR_LearnORUPSkill(curPlayer, skillTypeID, upSkillLv) - - curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitMagicWeaponSkillUp, 1) - - SetMWPrivilegeData(curPlayer, ChConfig.MWPrivilege_MWSkillUp, 1, True) - 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)] #仙族法宝 - + 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 +# 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) - 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) - + 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) @@ -488,116 +295,18 @@ 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 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 # @@ -614,11 +323,8 @@ 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 + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('XBXZ', {'MWID':mwID}, True, False) + #消耗物品判断 ipyData = GetWMIpyData(mwID) needItemDict = ipyData.GetNeedItem() @@ -634,19 +340,60 @@ #扣消耗 ItemCommon.DelCostItem(curPlayer, itemPack, delInfoDict, ChConfig.ItemDel_MagicWeapon) - else: - ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('XBXZ', {'MWID':mwID}, True, False) - if not ipyDataList: - return + elif ipyDataList: for ipyData in ipyDataList: if not GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, ipyData.GetID()): return - - + elif mwID == 101: #定海神针特殊 可直接获得 + FBCommon.Notify_FB_Over(curPlayer, {FBCommon.Over_dataMapID:ChConfig.Def_FBMapID_MagicWeapon,FBCommon.Over_isPass:1}) + PlayerControl.SetCustomMap(curPlayer, 0, 0) + else: + return DoActiveMW(curPlayer, mwID) return +def GetXBXZAwardProgress(curPlayer, mwID): + ##获取仙宝寻主当前达到条件的个数(包含已领取的) + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('XBXZ', {'MWID': mwID}, True, False) + if not ipyDataList: + return 0 + cnt = 0 + playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) + for ipyData in ipyDataList: + if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, ipyData.GetID()): + cnt += 1 + continue + curType = ipyData.GetType() + conditionList = ipyData.GetCondition() + + if curType == 1: + #穿戴X阶X颜色是否套装X部位装备 + for classlv, color, suite, place in conditionList: + equipIpyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap',classlv,place) + if not equipIpyData: + continue + gridIndex = equipIpyData.GetGridIndex() + curEquip = playerEquip.GetAt(gridIndex) + if curEquip.IsEmpty(): + continue + curItemColor = curEquip.GetItemColor() + curIsSuite = curEquip.GetSuiteID() + if curItemColor >= color and curIsSuite >= suite: + cnt += 1 + break + else: + continue + return cnt + +# ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('XBXZ', {'MWID': mwID}, True, False) +# cnt = 0 +# if ipyDataList: +# for ipyData in ipyDataList: +# if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, ipyData.GetID()): +# cnt += 1 +# return cnt #------------------------------------------------------------------------------- + def OnGetXBXZAward(curPlayer, index): ##仙宝寻主领奖 @@ -661,42 +408,22 @@ conditionList = ipyData.GetCondition() cnt = 0 if curType == 1: - #角色防御到XX - cnt = PlayerControl.GetFuncDef(curPlayer) - - elif curType == 2: - #穿戴三阶橙色1星或四阶紫色1星以上头盔 + #穿戴X阶X颜色是否套装X部位装备 + cnt = 0 playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip) - for equipIndex in xrange(playerEquip.GetCount()): - curEquip = playerEquip.GetAt(equipIndex) + for classlv, color, suite, place in conditionList: + equipIpyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap',classlv,place) + if not equipIpyData: + continue + gridIndex = equipIpyData.GetGridIndex() + curEquip = playerEquip.GetAt(gridIndex) 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: + curItemColor = curEquip.GetItemColor() + curIsSuite = curEquip.GetSuiteID() + if curItemColor >= color and curIsSuite >= suite: + cnt = 1 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 @@ -719,17 +446,17 @@ # 给物品 if awardItemList: for itemID, itemCnt in awardItemList: - ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 1, [IPY_GameWorld.rptItem], True) + ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, 0, [IPY_GameWorld.rptItem]) #给钱 for moneyType, value in ipyData.GetMoney(): PlayerControl.GiveMoney(curPlayer, moneyType, value) - SyncXBXZAwardRecord(curPlayer,[index]) + SyncXBXZAwardRecord(curPlayer, [index]) #成就 PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_XBXZ, 1, [ipyData.GetMWID()]) + EventShell.EventRespons_XBXZ(curPlayer, ipyData.GetMWID()) GameWorld.DebugLog(' 仙宝寻主领奖OK, ID=%s, cnt=%s' % (index, cnt)) return - ## 通知仙宝寻主对应奖励领奖记录 # @param None @@ -744,14 +471,14 @@ succCnt = ipyDataMgr.GetXBXZCount() if not succCnt: return - maxSuccid = ipyDataMgr.GetSuccessByIndex(succCnt-1).GetID() - recordIndexList = range(maxSuccid / 31+1) + 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) + awardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_XBXZAwardRecord % i) if not awardRecord: continue recordInfo = ChPyNetSendPack.tagMCXBXZAwardRecord() @@ -762,6 +489,7 @@ succFARPack.RecordCnt = len(succFARPack.RecordList) NetPackCommon.SendFakePack(curPlayer, succFARPack) return + #------------------------------------------------------------------------------- #// A5 15 提升法宝等级 #tagCMMagicWeaponUp @@ -777,26 +505,27 @@ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mwID = clientData.MWID curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID) - nextMWLV = curMWLV+1 + 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) + GameWorld.DebugLog('法宝升级经验不足%s' % needExp) return - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponUpExp % mwID, curUpExp-needExp) + 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)) + 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) + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MagicWeaponUpExp % mwID, curUpExp + addExp) Sycn_MagicWeaponLV(curPlayer, mwID) # 每日活动 ipyData = GetWMIpyData(mwID) @@ -805,228 +534,94 @@ PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_MagicWeapon) return -def Sycn_MagicWeaponLV(curPlayer, mwID= -1): + +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) - if not mwLv and not curUpExp and not state: + + FBPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwID) + isWear = GetIsWearMagicWeapon(curPlayer, mwID) + if isAll and not mwLv and not curUpExp 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 -def GetMagicWeaponPrivilege(curPlayer, privilege): - #法宝等级权限 - if not GetIsActiveMWSoul(curPlayer, privilege): - 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_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) - CalcMagicWeaponSoulAttr(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) - pack.State = GetIsActiveMWSoul(curPlayer, priID) - if not isForce and max([pack.CurValue, pack.GotValue, pack.ItemAwardState, pack.State]) == 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 +#// A5 1D 法宝佩戴 #tagCMWearMagicWeapon # -#struct tagCMMagicWeaponState +#struct tagCMWearMagicWeapon # #{ # tagHead Head; # DWORD MWID; //法宝ID +# BYTE State; //0-卸下 1-佩戴 #}; -def SaveMagicWeaponState(index, clientData, tick): +def OnWearMagicWeapon(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) mwID = clientData.MWID - if GetIsClickMagicWeapon(curPlayer, mwID): + if not GetIsActiveMagicWeapon(curPlayer, mwID): return - SetMagicWeaponClickState(curPlayer, mwID) + 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 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]) +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 - -#// A5 12 激活法宝之魂 #tagCMActiveMWSoul +#// A5 12 感应法宝 #tagCMThinkMagicWeapon # -#struct tagCMActiveMWSoul -# +#struct tagCMThinkMagicWeapon #{ # tagHead Head; -# BYTE ID; //编号 +# DWORD MWID; #}; -def OnActiveMWSoul(index, clientData, tick): +def OnThinkMagicWeapon(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) - soulID = clientData.ID - ipyData = IpyGameDataPY.GetIpyGameData('TreasurePrivilege', soulID) - if not ipyData: - return - if GetIsActiveMWSoul(curPlayer, soulID): - GameWorld.Log(' 该法宝之魂已经激活!! soulID=%s'%soulID) - return - #检查成就 - succList = ipyData.GetSuccessList() - for succID in succList: - if not PlayerSuccess.GetSuccHasGot(curPlayer, succID): - GameWorld.DebugLog(' 激活法宝之魂 成就未完成 soulID=%s,succID=%s'%(soulID, succID)) - return - - GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MWSoulActiveState, soulID, 1, True) - #任务 - EventShell.EventRespons_MWSoulActive(curPlayer, soulID) - - CalcMagicWeaponSoulAttr(curPlayer) - PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() - - #通知 - Sycn_MWPrivilegeData(curPlayer, soulID) - return - -def GetIsActiveMWSoul(curPlayer, soulID): - #获取法宝之魂是否已激活 - return GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_MWSoulActiveState, soulID) - -def CalcMagicWeaponSoulAttr(curPlayer): - #法宝之魂属性刷新 - allAttrList = [{} for _ in range(4)] - allAttrDict = {} - ipyMgr = IpyGameDataPY.IPY_Data() - for i in xrange(ipyMgr.GetTreasurePrivilegeCount()): - ipyData = ipyMgr.GetTreasurePrivilegeByIndex(i) - soulID = ipyData.GetPrivilegeID() - if not GetIsActiveMWSoul(curPlayer, soulID): - continue - attrDict = GetMagicWeaponPrivilegeAttr(curPlayer, soulID) - GameWorld.AddDictValue(allAttrDict, attrDict) - - for attrID, attrValue in allAttrDict.items(): - PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList) - PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeaponSoul, allAttrList) + mwID = clientData.MWID + #只触发任务接口 + EventShell.EventRespons_ThinkMagicWeapon(curPlayer) return \ No newline at end of file -- Gitblit v1.8.0