From fe42c2433fea4cfd894b38fec62f24fa4a5d047a Mon Sep 17 00:00:00 2001 From: xdh <xiefantasy@qq.com> Date: 星期二, 12 三月 2019 13:50:18 +0800 Subject: [PATCH] 6291 【后端】【2.0】限时仙盟boss(鼓舞修改) --- ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py | 572 +++++++++++++++++++++++++------------------------------- 1 files changed, 254 insertions(+), 318 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 cf603ef..010463d 100644 --- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py +++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py @@ -31,11 +31,12 @@ import PlayerSuccess import EventShell import PassiveBuffEffMng -import OpenServerCampaign import ItemControler import PlayerActivity import ChEquip import PlayerVip + +import random g_succInfoDict = {} g_potentialsSkillDict = {} @@ -44,7 +45,6 @@ # @return None def PlayerMagicWeaponLogin(curPlayer): NotifyMagicWeapon(curPlayer, True) - Sycn_MagicWeaponRefineLV(curPlayer) SyncXBXZAwardRecord(curPlayer) Sycn_MagicWeaponLV(curPlayer) Sycn_MWPrivilegeData(curPlayer) @@ -122,7 +122,8 @@ if mwID in IpyGameDataPY.GetFuncEvalCfg('UnblockTreasure'): PlayerControl.NotifyCode(curPlayer, 'UnblockTreasure', [curPlayer.GetName(), mwID]) else: - PlayerControl.WorldNotify(0, 'UnblockTreasure', [curPlayer.GetName(), mwID]) + sysMark = IpyGameDataPY.GetFuncEvalCfg('UnblockTreasure', 2, {}).get(mwID, 'UnblockTreasure') + PlayerControl.WorldNotify(0, sysMark, [curPlayer.GetName(), mwID]) #任务 EventShell.EventRespons_OnActiveMagicWeapon(curPlayer, mwID) @@ -136,13 +137,30 @@ #解锁技能 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()]) + 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() @@ -207,20 +225,6 @@ activeCnt += 1 return activeCnt -def GetMWIDByPotentialsSkillID(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 curSkillID in skillIDList: - g_potentialsSkillDict[curSkillID] = mwID - return g_potentialsSkillDict.get(skillID, 0) - ## 给技能 # @param curPlayer # @param skillResID 技能源ID @@ -258,142 +262,6 @@ 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 - #<n color="255,255,0" BKCOLOR="0,0,0">恭喜您将</n><n color="0,190,255" BKCOLOR="0,0,0"><Info Type="Skill" Name="Name" ID="{%S1%}"/></n><n color="255,255,0" BKCOLOR="0,0,0">升至</n><n color="0,190,255" BKCOLOR="0,0,0">{%S2%}</n><n color="255,255,0" BKCOLOR="0,0,0">级!</n> - #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() @@ -422,17 +290,23 @@ 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 +# if not isActive: +# continue allAttrDict = {} #======================================================================= # #铸炼属性 @@ -442,22 +316,51 @@ # 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() + 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 isActive and not fbpasslv: + ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'MWID':magicWeaponID}, True, False) + if ipyDataList: + maxLevel = ipyDataList[-1].GetLevel() + fbpasslv = maxLevel + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWFBPassLevel % magicWeaponID, maxLevel) + GameWorld.Log('老号已激活的魔族法宝没有关卡属性,直接设置满关卡 magicWeaponID=%s,maxLevel=%s'%(magicWeaponID, maxLevel), curPlayer.GetID()) + 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) @@ -465,116 +368,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 # @@ -644,6 +449,7 @@ 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(): @@ -651,29 +457,33 @@ 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 == 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 +# 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 @@ -696,7 +506,7 @@ # 给物品 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(): @@ -721,7 +531,7 @@ succCnt = ipyDataMgr.GetXBXZCount() if not succCnt: return - maxSuccid = ipyDataMgr.GetSuccessByIndex(succCnt-1).GetID() + maxSuccid = ipyDataMgr.GetXBXZByIndex(succCnt-1).GetID() recordIndexList = range(maxSuccid / 31+1) succFARPack = ChPyNetSendPack.tagMCXBXZAwardRecordList() @@ -767,8 +577,6 @@ DoActiveMW(curPlayer, mwID, nextMWLV) - # 每日活动 - PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_MagicWeapon) return def AddMagicWeaponUpExp(curPlayer, mwID, addExp): @@ -777,17 +585,24 @@ 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 = [] @@ -795,13 +610,17 @@ 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 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: @@ -810,14 +629,7 @@ 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: + if not GetIsActiveMWSoul(curPlayer, privilege): return 0 privilegeIpyData = IpyGameDataPY.GetIpyGameDataNotLog('TreasurePrivilege', privilege) if not privilegeIpyData: @@ -835,17 +647,16 @@ 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: + if privilege == ChConfig.MWPrivilege_EquipPlus: #强化加成 addAttr = ChEquip.CalcAllEquipAllPlusLVAttr(curPlayer) else: multiple = 1 #倍数 if singleValue: gotValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotValue % privilege) + maxValue = privilegeIpyData.GetMaxValue() + if maxValue: + gotValue = min(maxValue, gotValue) multiple = gotValue/singleValue for attid, attnum in attrInfo.items(): addAttr[int(attid)] = attnum * multiple @@ -858,6 +669,13 @@ privilegeIpyData = IpyGameDataPY.GetIpyGameDataNotLog('TreasurePrivilege', privilege) if not privilegeIpyData: return + curGotValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotValue % privilege) + singleValue = privilegeIpyData.GetSingleValue() + if singleValue and curGotValue % singleValue: + fixGotValue = curGotValue/singleValue*singleValue + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulGotValue % privilege, fixGotValue) + GameWorld.Log('玩家法宝之魂已领的数据不是单次进度的倍数,修复! privilege=%s,curGotValue=%s, fixGotValue=%s'%(privilege, curGotValue, fixGotValue)) + curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulCurValue % privilege) newData = curValue + data if isAdd else data maxValue = privilegeIpyData.GetMaxValue() @@ -877,15 +695,21 @@ GameWorld.DebugLog('领取法宝之魂奖励,对应法宝之魂未激活,或未配置 privilege=%s'%privilege) return singleValue = ipyData.GetSingleValue() + maxValue = ipyData.GetMaxValue() if singleValue: #达到进度则可领取属性 curValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulCurValue % privilege) gotValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWSoulGotValue % privilege) + if gotValue >= curValue: + return canGetCnt = (curValue - gotValue) / singleValue + if canGetCnt <= 0 and maxValue and curValue >= maxValue: + canGetCnt = 1 #已达到次数上限,最后一次不管是否满足都让领(一般是因为配置错误或者变更导致) if canGetCnt <= 0: return - PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulGotValue % privilege, gotValue+canGetCnt*singleValue) - CalcMagicWeaponAttr(curPlayer) + updGotCnt = min(maxValue, gotValue+canGetCnt*singleValue) if maxValue else gotValue+canGetCnt*singleValue + PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWSoulGotValue % privilege, updGotCnt) + CalcMagicWeaponSoulAttr(curPlayer) PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() @@ -902,8 +726,7 @@ 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}]) + ItemControler.GivePlayerItem(curPlayer, int(itemid), int(cnt), 0, [IPY_GameWorld.rptItem], event=["MWSoulAward", False, {"privilege":privilege}]) #通知 Sycn_MWPrivilegeData(curPlayer, privilege) @@ -922,7 +745,8 @@ 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: + 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) @@ -955,4 +779,116 @@ def SetMagicWeaponClickState(curPlayer, mwID, state=1): #设置法宝是否点击认主状态 GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsClick, mwID % 100, state, True, [mwID / 100]) + 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 % 100, True, [mwID / 100]) + +def SetMagicWeaponWearState(curPlayer, mwID, state): + #设置法宝是否佩戴 + GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsWear, mwID % 100, state, True, [mwID / 100]) + return + +#// A5 12 激活法宝之魂 #tagCMActiveMWSoul +# +#struct tagCMActiveMWSoul +# +#{ +# tagHead Head; +# BYTE ID; //编号 +#}; +def OnActiveMWSoul(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 + + __DoActiveMWSoul(curPlayer, soulID) + return + +def __DoActiveMWSoul(curPlayer, soulID, isRefreshAttr=True): + GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MWSoulActiveState, soulID, 1, True) + #任务 + EventShell.EventRespons_MWSoulActive(curPlayer, soulID) + + CalcMagicWeaponSoulAttr(curPlayer) + if isRefreshAttr: + 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) + 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 \ No newline at end of file -- Gitblit v1.8.0