From 18a10a74bd18363b8a325044d0cec5e4838531a3 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期日, 05 五月 2019 10:55:50 +0800
Subject: [PATCH] Merge branch 'master' of http://192.168.0.87:10010/r/SnxxServerCode

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py |  222 ++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 184 insertions(+), 38 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py
index 6592e7e..41696ec 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Item/EquipZhuXian.py
@@ -20,29 +20,52 @@
 import ShareDefine
 import PlayerControl
 import DataRecordPack
+import IPY_GameWorld
+import ItemControler
 import IpyGameDataPY
+import NetPackCommon
+import ChPyNetSendPack
 import SkillCommon
 import PyGameData
 import ChConfig
+import ChEquip
+
+import random
+
 
 def GetZhuXianEquipIndexByPlace(equipPlace):
     ## 获取诛仙装备位对应的索引
     return equipPlace - 1 - 120
 
+
 def GetZhuXianEquipPlaceByIndex(equipIndex):
     ## 获取诛仙装备索引对应装备位
     return equipIndex + 1 + 120
+
 
 def GetZhuXianEquipPlaceIndexIsUnlock(curPlayer, equipPlaceIndex):
     ## 获取诛仙装备位是否解锁
     # @param equipPlaceIndex: 注意传入的参数是装备位索引
     equipPlace = GetZhuXianEquipPlaceByIndex(equipPlaceIndex)
-    placeUnlockDict = IpyGameDataPY.GetFuncEvalCfg("EquipZhuXian", 1, {}) # 诛仙装备位对应解锁所需诛仙塔层数 {"装备位":诛仙塔层数, ...} 没配的默认解锁
-    if str(equipPlace) not in placeUnlockDict:
+    placeUnlockDict = IpyGameDataPY.GetConfigEx("EquipZhuXianUnlock") # 诛仙装备位对应解锁所需诛仙塔层数 {"装备位":诛仙塔层数, ...} 没配的默认解锁
+    if not placeUnlockDict:
+        placeUnlockDict = {}
+        ipyDataMgr = IpyGameDataPY.IPY_Data()
+        for index in xrange(ipyDataMgr.GetZhuXianTowerCount()):
+            ipyData = ipyDataMgr.GetZhuXianTowerByIndex(index)
+            unlockEquipPlace = ipyData.GetUnLockEquipPlace()
+            if not unlockEquipPlace:
+                continue
+            towerID = ipyData.GetID()
+            placeUnlockDict[unlockEquipPlace] = towerID
+        IpyGameDataPY.SetConfigEx("EquipZhuXianUnlock", placeUnlockDict)
+        GameWorld.DebugLog("加载诛仙塔解锁装备位: placeUnlockDict=%s" % placeUnlockDict)
+    if equipPlace not in placeUnlockDict:
         return True
-    needTowerLV = placeUnlockDict[str(equipPlace)]
-    curTowerLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV) # 已过关的诛仙塔层数
+    needTowerLV = placeUnlockDict[equipPlace]
+    curTowerLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ZhuXianTowerPassLV)  # 已过关的诛仙塔层数
     return curTowerLV >= needTowerLV
+
 
 def CheckLearnZhuXianSkill(curPlayer, skillID):
     ## 检查诛仙装备位装备阶数
@@ -69,6 +92,7 @@
             
     return True
 
+
 #// A3 30 装备诛仙装备 #tagCMEquipZhuXianItem
 #
 #struct    tagCMEquipZhuXianItem
@@ -87,7 +111,7 @@
     
     zhuXianItemPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianItem)
     curEquip = zhuXianItemPack.GetAt(itemIndex)
-    if not ItemCommon.CheckItemCanUse(curEquip):
+    if not ItemCommon.CheckItemCanUse(curEquip) or ItemControler.GetIsAuctionItem(curEquip):
         GameWorld.DebugLog("物品为空或不可用: itemIndex=%s" % itemIndex, playerID)
         return
     if not ItemCommon.GetIsZhuXianEquip(curEquip):
@@ -119,13 +143,14 @@
     destEquip = zhuXianEquipPack.GetAt(reqEquipPlaceIndex)
     desItemID, desUserData = [0, ''] if destEquip.IsEmpty() else [destEquip.GetItemTypeID(), destEquip.GetUserData()]
     srcItemID, srcUserData = curEquip.GetItemTypeID(), curEquip.GetUserData()
-    if not ItemCommon.DoLogicSwitchItem(curPlayer, curEquip, destEquip, ShareDefine.rptZhuXianEquip):
+    if not ItemCommon.DoLogicSwitchItem(curPlayer, destEquip, curEquip, ShareDefine.rptZhuXianEquip):
         return
     dataDict = {'dotype':'EquipZhuXianItem', 'desItemID':desItemID, 'desUserData':desUserData, 'srcItemID':srcItemID, 'srcUserData':srcUserData}
     DataRecordPack.Cache_FightPowerChangeInfo(curPlayer, ChConfig.PowerDownType_EquipChange, dataDict)
     
     RefreshZhuXianAttr(curPlayer)   
     return
+
 
 #// A3 31 卸下诛仙装备 #tagCMUnEquipZhuXianItem
 #
@@ -157,12 +182,15 @@
     RefreshZhuXianAttr(curPlayer)
     return
 
+
 def RefreshZhuXianAttr(curPlayer):
-    CalcZhuXianAttr(curPlayer)
-    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() 
+    #CalcZhuXianAttr(curPlayer)
+    #PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState() 
     return
 
+
 def CalcZhuXianAttr(curPlayer):
+    return
     ## 刷新诛仙属性
     playerID = curPlayer.GetPlayerID()
     PyGameData.g_zhuXianSkillAddPerDict.pop(playerID, None)
@@ -170,14 +198,15 @@
     
     allAttrList = [{} for _ in range(4)]
     allAttrListZXSuit = [{} for _ in range(4)]
-    equipScoreTotal = 0 #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
-    equipPlaceClassLVDict = {} #装备位对应装备阶 {装备位:阶, ...}
-    equipPlaceBaseAttrDict = {} #装备位对应基础属性字典 {装备位:{属性ID:value, ...}, ...}
-    
-    attrIDSkillPlusDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 1, {}) # 属性ID对应影响的技能TypeID列表 {属性ID:[技能TypeID列表, ...], ...}
+    allAttrListZXStone = [{} for _ in range(4)]
+    equipScoreTotal = 0  #为解决装备评分、战力不一致的情况,装备战力改为由评分作为参数计算战力
+    equipPlaceClassLVDict = {}  #装备位对应装备阶 {装备位:阶, ...}
+    equipPlaceBaseAttrDict = {}  #装备位对应基础属性字典 {装备位:{属性ID:value, ...}, ...}
+    equipPlaceStoneLVDict = {}  #装备位对应宝石等级 {装备位:[宝石等级,..], ...}
+    attrIDSkillPlusDict = IpyGameDataPY.GetFuncEvalCfg("SkillPlusAttrID", 1, {})  # 属性ID对应影响的技能TypeID列表 {属性ID:[技能TypeID列表, ...], ...}
     addAttrIDList = range(ShareDefine.Def_Effect_SkillAddPer1, ShareDefine.Def_Effect_SkillAddPer7 + 1)
     reduceAttrIDList = range(ShareDefine.Def_Effect_SkillReducePer1, ShareDefine.Def_Effect_SkillReducePer7 + 1)
-    zxSkillPlusAttrDict = {} # 玩家诛仙装备影响技能TypeID属性字典 {属性ID:值, ...}
+    zxSkillPlusAttrDict = {}  # 玩家诛仙装备影响技能TypeID属性字典 {属性ID:值, ...}
     
     zhuXianEquipPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianEquip)
     equipPackCount = zhuXianEquipPack.GetCount()
@@ -215,7 +244,11 @@
                     zxSkillPlusAttrDict[legendAttrID] = zxSkillPlusAttrDict.get(legendAttrID, 0) + legendAttrValue
                 else:
                     PlayerControl.CalcAttrDict_Type(legendAttrID, legendAttrValue, allAttrList)
-                    
+        #宝石属性
+        gemlvList = ChEquip.CalcEquipStone_Effect(curPlayer, equipPlace, allAttrListZXStone)
+        equipPlaceStoneLVDict[equipPlace] = gemlvList
+            
+        
 #    GameWorld.DebugLog("诛仙装备属性: allAttrList=%s" % (allAttrList))
 #    GameWorld.DebugLog("    zxSkillPlusAttrDict=%s" % (zxSkillPlusAttrDict))
 #    GameWorld.DebugLog("    equipPlaceClassLVDict=%s" % (equipPlaceClassLVDict))
@@ -225,26 +258,16 @@
         if attrID not in attrIDSkillPlusDict:
             continue
         skillTypeIDList = attrIDSkillPlusDict[attrID]
-        effSkillTypeID = 0
         for skillTypeID in skillTypeIDList:
-            skillData = curPlayer.GetSkillManager().FindSkillBySkillTypeID(skillTypeID)
-            if not skillData:
-                continue
-            if SkillCommon.CheckSkillJob(curPlayer, skillData):
-                effSkillTypeID = skillTypeID
-                break
-        if not effSkillTypeID:
-            continue
-        
-        if attrID in addAttrIDList:
-            skillAddPerDict = PyGameData.g_zhuXianSkillAddPerDict.get(playerID, {})
-            skillAddPerDict[effSkillTypeID] = plusValue
-            PyGameData.g_zhuXianSkillAddPerDict[playerID] = skillAddPerDict
-        elif attrID in reduceAttrIDList:
-            skillReducePerDict = PyGameData.g_zhuXianSkillReducePerDict.get(playerID, {})
-            skillReducePerDict[effSkillTypeID] = plusValue
-            PyGameData.g_zhuXianSkillReducePerDict[playerID] = skillReducePerDict
-            
+            if attrID in addAttrIDList:
+                skillAddPerDict = PyGameData.g_zhuXianSkillAddPerDict.get(playerID, {})
+                skillAddPerDict[skillTypeID] = plusValue
+                PyGameData.g_zhuXianSkillAddPerDict[playerID] = skillAddPerDict
+            elif attrID in reduceAttrIDList:
+                skillReducePerDict = PyGameData.g_zhuXianSkillReducePerDict.get(playerID, {})
+                skillReducePerDict[skillTypeID] = plusValue
+                PyGameData.g_zhuXianSkillReducePerDict[playerID] = skillReducePerDict
+                
 #    GameWorld.DebugLog("    PyGameData.g_zhuXianSkillAddPerDict=%s" % PyGameData.g_zhuXianSkillAddPerDict)
 #    GameWorld.DebugLog("    PyGameData.g_zhuXianSkillReducePerDict=%s" % PyGameData.g_zhuXianSkillReducePerDict)
     
@@ -256,6 +279,10 @@
                                ShareDefine.Def_Effect_ZXRuyiAttrPer:ShareDefine.zxetRuyi,
                                ShareDefine.Def_Effect_ZXPendantAttrPer:ShareDefine.zxetPendant,
                                ShareDefine.Def_Effect_ZXRingAttrPer:ShareDefine.zxetRing,
+                               ShareDefine.Def_Effect_ZXWeaponAttrPer:ShareDefine.zxetWeapon1,
+                               ShareDefine.Def_Effect_LXWeaponAttrPer:ShareDefine.zxetWeapon2,
+                               ShareDefine.Def_Effect_XXWeaponAttrPer:ShareDefine.zxetWeapon3,
+                               ShareDefine.Def_Effect_JXWeaponAttrPer:ShareDefine.zxetWeapon4,
                                }
     suitPlaceGroupDict = IpyGameDataPY.GetFuncEvalCfg("EquipZhuXian", 2, {})
     for suitType, placeGroupList in suitPlaceGroupDict.items():
@@ -298,16 +325,53 @@
                     PlayerControl.CalcAttrDict_Type(plusEffID, addValue, allAttrListZXSuit)
             else:
                 PlayerControl.CalcAttrDict_Type(suitEffID, suitEffValue, allAttrListZXSuit)
-                
+    #宝石共鸣属性
+    #GameWorld.DebugLog('equipPlaceStoneLVDict=%s'%equipPlaceStoneLVDict)
+    needStoneCnt = IpyGameDataPY.GetFuncCfg('GemResonance')
+    for suitType, placeGroupList in suitPlaceGroupDict.items():
+        suitType = int(suitType)
+        groupStoneLVList = []
+        for place in placeGroupList:
+            groupStoneLVList += equipPlaceStoneLVDict.get(place, [])
+        
+        if len(groupStoneLVList) < needStoneCnt:
+            continue
+        groupStoneLVList.sort(reverse=True)
+        shareStoneLV = min(groupStoneLVList[:needStoneCnt])
+        GameWorld.DebugLog("    激活诛仙宝石共鸣: suitType=%s, shareStoneLV=%s" % (suitType, shareStoneLV))
+        stoneAttrIpyData = IpyGameDataPY.GetIpyGameData("ZhuXianStoneAttr", suitType, shareStoneLV)
+        if not stoneAttrIpyData:
+            continue
+        attrIDList = stoneAttrIpyData.GetAttrIDList()
+        attrValueList = stoneAttrIpyData.GetAttrValueList()
+        if len(attrIDList) != len(attrValueList):
+            continue
+        for i, effID in enumerate(attrIDList):
+            effValue = attrValueList[i]
+            if effID in suitAttrIDPlusPlaceDict:
+                plusPlace = suitAttrIDPlusPlaceDict[effID]
+                if plusPlace not in equipPlaceBaseAttrDict:
+                    continue
+                plusEffDict = equipPlaceBaseAttrDict[plusPlace]
+                #GameWorld.DebugLog("            plusPlace=%s,plusEffDict=%s" % (plusPlace, plusEffDict))
+                for plusEffID, plusEffValue in plusEffDict.items():
+                    addValue = int(plusEffValue * (10000 + effValue) / 10000.0)
+                    #GameWorld.DebugLog("                plusEffID=%s,plusEffValue=%s,addValue=%s" % (plusEffID, plusEffValue, addValue))
+                    PlayerControl.CalcAttrDict_Type(plusEffID, addValue, allAttrListZXStone)
+            else:
+                PlayerControl.CalcAttrDict_Type(effID, effValue, allAttrListZXStone)
+        
     # 保存计算值
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquip, allAttrList)
-    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquipSuit, allAttrListZXSuit)
+    #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquip, allAttrList)
+    #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquipSuit, allAttrListZXSuit)
+    #PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_ZXEquipStone, allAttrListZXStone)
     
     #计算装备基础属性附加战力 (目前组成: 评分战力 + ...)
     equipFightPowerEx = eval(IpyGameDataPY.GetFuncCompileCfg("FightpowerFormula", 2))
     GameWorld.DebugLog("诛仙装备评分战力: equipScoreTotal=%s,equipFightPowerEx=%s" % (equipScoreTotal, equipFightPowerEx))
-    curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_ZhuXian, equipFightPowerEx)
+    #curPlayer.SetDict(ChConfig.Def_PlayerKey_MFPEx % ShareDefine.Def_MFPType_ZhuXian, equipFightPowerEx)
     return
+
 
 def GetZhuXianEquipSkillAddPer(playerID, skillTypeID):
     ## 获取诛仙装备伤害百分比提升值
@@ -318,6 +382,7 @@
         return 0
     return skillAddPerDict[skillTypeID]
 
+
 def GetZhuXianEquipSkillReducePer(playerID, skillTypeID):
     ## 获取诛仙装备减伤百分比提升值
     if playerID not in PyGameData.g_zhuXianSkillReducePerDict:
@@ -327,3 +392,84 @@
         return 0
     return skillReducePerDict[skillTypeID]
 
+
+#// A3 32 诛仙装备分解 #tagCMZhuXianEquipDecompose
+#
+#struct    tagCMZhuXianEquipDecompose
+#{
+#    tagHead        Head;
+#    BYTE        Count;        //材料所在背包索引的数量
+#    WORD        IndexList[Count];    //材料所在背包索引列表
+#    DWORD        ItemIDList[Count];    //材料所在背包物品ID列表
+#    BYTE        IsAuto;        //是否自动分解
+#};
+## 诛仙装备分解 
+#  @param playerIndex 玩家索引  
+#  @param clientData 客户端封包  
+#  @param tick 时间
+#  @return None
+def OnZhuXianEquipDecompose(index, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    if not clientData.Count:
+        return
+    playerID = curPlayer.GetID()
+    eatIndexList = clientData.IndexList
+    eatItemIDList = clientData.ItemIDList
+    isAuto = clientData.IsAuto
+    giveItemDict = {} #分解得到物品
+    
+    itemPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptZhuXianItem)
+    for i, index in enumerate(eatIndexList):
+        eatItem = itemPack.GetAt(index)
+        if not eatItem or eatItem.IsEmpty():
+            continue
+        eatItemID = eatItem.GetItemTypeID()
+        if eatItemID != eatItemIDList[i]:
+            GameWorld.Log('诛仙装备分解 发的物品ID不对应index=%s eatItemID=%s,ItemIDList[i]=%s' % (index, eatItemID, eatItemIDList[i]), playerID)
+            continue
+        if eatItem.GetType() not in ChConfig.Def_ZhuXianEquiipType:
+            GameWorld.Log('诛仙装备分解 发的物品不是诛仙装备  eatItemID=%s' % eatItemID, playerID)
+            continue
+        
+        itemClassLV = ItemCommon.GetItemClassLV(eatItem)
+        ipyData = IpyGameDataPY.GetIpyGameData('ZhuXianEquipDecompose', itemClassLV)
+        if not ipyData:
+            GameWorld.DebugLog('ZhuXianEquipDecompose 未配置该阶级分解itemClassLV=%s' % itemClassLV, playerID)
+            continue
+        decomposeInfoDict = ipyData.GetDecomposeInfo()
+        getItemDict = {}
+        for itemIDList, rateList in decomposeInfoDict.items():
+            giveitemCnt = GameWorld.GetResultByRandomList(rateList, 0)
+            if not giveitemCnt:
+                continue
+            if isinstance(itemIDList, tuple):
+                itemID = random.choice(itemIDList)
+            else:
+                itemID = itemIDList
+            giveItemDict[itemID] = giveItemDict.get(itemID, 0) + giveitemCnt
+            getItemDict[itemID] = getItemDict.get(itemID, 0) + giveitemCnt
+        saveDataDict = {'getItemDict':getItemDict, 'isAuto':isAuto}
+        ItemCommon.DelItem(curPlayer, eatItem, 1, True, ChConfig.ItemDel_ZhuXianDecompose, saveDataDict)
+    if giveItemDict:
+        needSpace = len(giveItemDict)
+        packSpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)
+        if packSpace < needSpace:
+            prizeItemList = [[giveItemID, itemCnt, 1] for giveItemID, itemCnt in giveItemDict.items()]
+            PlayerControl.SendMailByKey("DefaultLackSpace", [curPlayer.GetPlayerID()], prizeItemList)
+        else:
+            for giveItemID, itemCnt in giveItemDict.items():
+                ItemControler.GivePlayerItem(curPlayer, giveItemID, itemCnt, 0, [IPY_GameWorld.rptItem])
+    
+    #通知结果
+    packData = ChPyNetSendPack.tagMCZhuXianDecomposeResult()
+    packData.Clear()
+    packData.ItemList = []
+    for itemID, itemCnt in giveItemDict.items():
+        itemInfo = ChPyNetSendPack.tagMCZhuXianDecomposeItem()
+        itemInfo.ItemID = itemID
+        itemInfo.ItemCnt = itemCnt
+        itemInfo.IsBind = 1
+        packData.ItemList.append(itemInfo)
+    packData.Cnt = len(packData.ItemList)
+    NetPackCommon.SendFakePack(curPlayer, packData)
+    return

--
Gitblit v1.8.0