From a388abb4b97782c1c694a8d28d8a1e73e03a35c0 Mon Sep 17 00:00:00 2001
From: xdh <xiefantasy@qq.com>
Date: 星期一, 10 六月 2019 16:33:25 +0800
Subject: [PATCH] 7155 【后端】【2.0】新增仙盟创建规则(通知修改)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py |  340 +++++++++++++++++++++-----------------------------------
 1 files changed, 126 insertions(+), 214 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 b725a41..a0c2c21 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,20 +33,15 @@
 import PassiveBuffEffMng
 import ItemControler
 import PlayerActivity
-import ChEquip
+import FBCommon
 import PlayerVip
 
 import random
-
-g_succInfoDict = {}
-g_potentialsSkillDict = {}
-
 
 ##登录处理
 # @param curPlayer 玩家
 # @return None
 def PlayerMagicWeaponLogin(curPlayer):
-    NotifyMagicWeapon(curPlayer, True)
     SyncXBXZAwardRecord(curPlayer)
     Sycn_MagicWeaponLV(curPlayer)
     return
@@ -63,78 +58,75 @@
 #    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 GetIsActiveMagicWeapon(curPlayer, mwID, lv=1):
+    #获取法宝是否达到X级
+    curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID)
+    return curMWLV >= lv
 
 
-def SetMagicWeaponActiveState(curPlayer, mwID, isActive=True):
-    #设置法宝激活状态
-    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_PDict_MagicWeaponIsActive, mwID, isActive, True)
-    return
 
+def ActiveMagicWeaponByFB(curPlayer, mapID, lineID, passLV=0):
+    ##通关副本激活法宝(人族、魔族法宝)
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'LineID':lineID, 'Level':passLV})
+    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
 
-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):
+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:
             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)
+        if mwID == IpyGameDataPY.GetFuncCfg('FabaoAddPoint', 1):
+            addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {})
+            fabaoAddPoint = IpyGameDataPY.GetFuncCfg('FabaoAddPoint', 2)
+            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))
+
+    EventShell.EventRespons_MagicWeaponLV(curPlayer, mwID, mwLV)
+    #通知客户端等级
+    Sycn_MagicWeaponLV(curPlayer, mwID)
     #成就
     PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_GetMagicWeapon, 1, [mwID, mwLV])
 
@@ -145,25 +137,7 @@
     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()
@@ -181,32 +155,6 @@
 
 
 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):
@@ -270,26 +218,6 @@
     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
 
 ##--------------------------------------------------------------------------------------------------
 
@@ -386,11 +314,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()
@@ -406,17 +331,55 @@
         
         #扣消耗
         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:
+        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
 #-------------------------------------------------------------------------------
 
 
@@ -433,47 +396,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)
-        SamboSpecialUnlock = IpyGameDataPY.GetFuncEvalCfg('SamboSpecialUnlock')
-        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()
-            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:
+            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
@@ -504,9 +442,9 @@
     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
@@ -602,16 +540,15 @@
     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:
+        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)
@@ -620,34 +557,6 @@
         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
@@ -691,13 +600,16 @@
     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
+#// A5 12 感应法宝 #tagCMThinkMagicWeapon
+#
+#struct    tagCMThinkMagicWeapon
+#{
+#    tagHead        Head;
+#    DWORD        MWID;
+#};
+def OnThinkMagicWeapon(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    mwID = clientData.MWID
+    #只触发任务接口
+    EventShell.EventRespons_ThinkMagicWeapon(curPlayer)
+    return
\ No newline at end of file

--
Gitblit v1.8.0