From 8d68127a62c17a160c575842e1607833cc42564b Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 23 十二月 2020 17:04:13 +0800
Subject: [PATCH] 8668 【主干】可拍卖道具取消拍卖时间限制并可以叠加后,上架时可选择拍卖的数量(封包);

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py |  341 +++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 239 insertions(+), 102 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py
index c439d51..662e287 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Event/EventSrc/Operate_EquipPlus.py
@@ -6,12 +6,12 @@
 #
 ##@package Event.EventSrc.Operate_EquipPlus
 #
-# @todo:部位星级公共模式强化
+# @todo:部位强化公共模式强化
 # @author hxp
 # @date 2015-12-15
 # @version 1.2
 #
-# 详细描述: 部位星级公共模式强化
+# 详细描述: 部位强化公共模式强化
 #
 # @change: "2016-06-30 21:30" hxp 强化达人开服活动
 # @change: "2016-10-08 18:00" hxp 自动购买物品价格统一取商城物品价格
@@ -28,10 +28,13 @@
 import PlayerActivity
 import PlayerSuccess
 import IpyGameDataPY
+import PlayerActLogin
 import GameWorld
 import ChConfig
 import ChEquip
 import EventShell
+import ChPyNetSendPack
+import NetPackCommon
 #-------------------------------------------------------------------------------------------
 
 #===============================================================================
@@ -57,12 +60,16 @@
     
     # 判断 1.装备  2.最高强化等级, 3.铜钱数
     if packType not in ChConfig.Pack_EquipPart_CanPlusStar:
-        GameWorld.DebugLog("packType not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)
+        #GameWorld.DebugLog("packType not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)
         return
     
-    indexList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
-    if index not in indexList:
-        GameWorld.Log("    index not in ChConfig.Pack_EquipPart_CanPlusStar", playerID)
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'GridIndex':index})
+    if not ipyData:
+        return
+    equipPlace = ipyData.GetEquipPlace()
+    equipPlaceList = ChConfig.Pack_EquipPart_CanPlusStar[packType]
+    if equipPlace not in equipPlaceList:
+        #GameWorld.Log("index=%s, equipPlace=%s not in ChConfig.Pack_EquipPart_CanPlusStar" % (index, equipPlace), playerID)
         return
     
     # 暂不判断开启等级由客户端处理   
@@ -70,127 +77,257 @@
     curPack = curPlayer.GetItemManager().GetPack(packType)
     curEquip = curPack.GetAt(index)
     if not curEquip or curEquip.IsEmpty():
-        GameWorld.DebugLog("OnEquipMayaPlus() equip is empty")
+        GameWorld.DebugLog("equip is empty")
         return
     
-    maxStarLV = ItemCommon.GetItemMaxStarLV(curEquip)
-    curPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
-    if curPartStarLV >= maxStarLV:
-        GameWorld.Log("OnEquipMayaPlus:curPartStarLV(%s) >= maxStarLV(%s)" % (curPartStarLV, maxStarLV), playerID)
-        return
-
-    # 强化处理
-    result = DoLogic_EquipMayaPlus(curPlayer, curEquip, packType, index)
-    
-    updPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
-    #GameWorld.Log("    result=%s,curStarLV=%s,updStarLV=%s" % (result, curPartStarLV, updPartStarLV), playerID)
-    if result == ChConfig.Def_ComposeState_None:
+    findType = ChEquip.GetEquipPlusType(curEquip)
+    if not findType:
         return
     
-    #===========================================================================
-    # curPlayer.Sync_MakeItemAnswer(ShareDefine.Def_mitEquipMayaPlus, result)
+    curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
+    classLV = ItemCommon.GetItemClassLV(curEquip)
+    plusMaxIpyData = IpyGameDataPY.GetIpyGameData("ItemPlusMax", findType, classLV)
+    if not plusMaxIpyData:
+        return
+    plusLVMax = plusMaxIpyData.GetPlusLVMax()
+    if curPartPlusLV >= plusLVMax:
+        #GameWorld.DebugLog("强化达到本阶最大等级,无法强化! classLV=%s,plusLVMax=%s,curPartPlusLV=%s" % (classLV, plusLVMax, curPartPlusLV))
+        return
+    plusIpyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartPlusLV)
+    if not plusIpyData:
+        return
+    costSilver = plusIpyData.GetCostCount()
+    costItemInfo = plusIpyData.GetCostItemInfo()
+    if not costSilver and not costItemInfo:
+        #GameWorld.DebugLog("已到强化最大等级! curPartPlusLV=%s" % curPartPlusLV, playerID)        
+        return
     
-    # 每日活动
+    curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, index) # 进化等级
+    nextEvolveLV = curEvolveLV + 1
+    evolveIpyData = IpyGameDataPY.GetIpyGameDataNotLog('EquipPlusEvolve', equipPlace, nextEvolveLV)
+    if not evolveIpyData:
+        return
+    maxPlusLV = evolveIpyData.GetNeedPlusLV()
+    if curPartPlusLV >= maxPlusLV:
+        GameWorld.Log("已到当前强化最大等级,进化后增加强化等级上限! curPartPlusLV(%s) >= maxPlusLV(%s), curEvolveLV=%s" 
+                      % (curPartPlusLV, maxPlusLV, curEvolveLV), playerID)
+        return
+    
+    if costSilver and not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver):
+        GameWorld.DebugLog("铜钱不足,无法强化! costSilver=%s" % costSilver)
+        return
+    
+    costItemID, costItemCount = 0, 0
+    if costItemInfo:
+        costItemID, costItemCount = costItemInfo
+        itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+        hasEnough, itemIndexList = ItemCommon.GetItem_FromPack_ByID(costItemID, itemPack, costItemCount)
+        if not hasEnough:
+            GameWorld.DebugLog("材料不足,无法强化! costItemID=%s, costItemCount=%s" % (costItemID, costItemCount))
+            return
+        
+    if costSilver:
+        PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)
+    
+    if costItemID:
+        ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, costItemCount, True, ChConfig.ItemDel_EquipPlus)
+        
+    isLVUp = False
+    curExp = 0
+    addExp = plusIpyData.GetAddExp()
+    totalExp = plusIpyData.GetTotalExp()
+    if addExp and totalExp:
+        curExp = ChEquip.GetEquipPartProficiency(curPlayer, packType, index) + addExp
+        if curExp >= totalExp:
+            curExp = curExp - totalExp
+            isLVUp = True
+    else:
+        isLVUp = True
+        
+    if isLVUp:
+        curPartPlusLV += 1
+        __EquipMayaPlusChange(curPlayer, packType, curEquip, index, curPartPlusLV)
+        
+    DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartPlusLV)
+    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)
+    ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, index)
     PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_EquipPlus)
-    #===========================================================================
-    
-
-    # 星级变更时处理
-    if curPartStarLV != updPartStarLV:
-        DoLogic_OnEquipPartStarLVChange(curPlayer, packType)
-        # 增加强化成就
-        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlus, 1)
-        EventShell.EventRespons_EquipPlus(curPlayer)
+    PlayerActLogin.AddLoginAwardActionCnt(curPlayer, ChConfig.Def_LoginAct_EquipPlus, 1)
     return
 
-     
-
-## 开始装备强化
-#  @param index 为装备位
-#  @return 
-def DoLogic_EquipMayaPlus(curPlayer, curEquip, packType, index):
-    result = ChConfig.Def_ComposeState_None
-
-    findType = ChEquip.GetEquipPlusType(curEquip)
-    if findType == -1:
-        return result
+def __EquipMayaPlusChange(curPlayer, packType, curEquip, index, updPlusLV):
+    ## 玛雅加强等级改变
     
-    curPartStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
-    ipyData = IpyGameDataPY.GetIpyGameData("ItemPlus", findType, curPartStarLV)
-    if not ipyData:
-        return
-    costSilver = ipyData.GetCostCount()
-
-    if not PlayerControl.HaveMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver):
-        # 金币不足,返回
-        return result
-
-    totalExp = ipyData.GetTotalExp()
-    curExp = ChEquip.GetEquipPartProficiency(curPlayer, packType, index) + ipyData.GetAddExp()
-
-    if curExp >= totalExp:
-        #升级
-        curPartStarLV = __EquipMayaPlusChange(curPlayer, packType, curEquip, index)
-        curExp = curExp - totalExp
-        
-    ChEquip.SetEquipPartProficiency(curPlayer, packType, index, curExp)
-    ChEquip.NotifyEquipPartStarLV(curPlayer, packType, index)
-    # 支付金币
-    PlayerControl.PayMoney(curPlayer, IPY_GameWorld.TYPE_Price_Silver_Money, costSilver, isNotify=False)
-
-    DataRecordPack.DR_UpStarLVSuccess(curPlayer, curExp, curPartStarLV)
-    return ChConfig.Def_ComposeState_Sucess
-
-
-
-## 玛雅加强等级改变
-#  @param curPlayer: 玩家
-#  @param packType: 背包类型
-#  @param curEquip: 当前装备
-#  @param succeedRate: 成功率
-#  @param failStarLV: 失败时的星级数
-#  @return 
-def __EquipMayaPlusChange(curPlayer, packType, curEquip, index):
-    curPlusLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, index)
-    updPlusLV = curPlusLV + 1
-    ChEquip.SetEquipPartStarLV(curPlayer, packType, index, curEquip, updPlusLV)
+    ChEquip.SetEquipPartPlusLV(curPlayer, packType, index, curEquip, updPlusLV)
     
     broadCastLVList = IpyGameDataPY.GetFuncEvalCfg("StrengthenLevelBroadCast", 1)
-    #GameWorld.DebugLog("PlusLVChange index=%s,updPlusLV=%s,broadCastLVList=%s" % (index, updPlusLV, broadCastLVList))
     if updPlusLV in broadCastLVList:
-        msgParamList = [curPlayer.GetPlayerName()] + ItemCommon.GetNotifySuperItemInfo(curPlayer, curEquip, index) + [updPlusLV]
+        itemID = curEquip.GetItemTypeID()
+        userData = curEquip.GetUserData()
+        guid = ItemCommon.CacheNotifyEquipDetailInfo(curPlayer, curEquip)
+        msgParamList = [curPlayer.GetPlayerName(), itemID, userData, guid, updPlusLV]
         PlayerControl.WorldNotify(0, "StrengthenCongratulation", msgParamList)
         
-    # 成就
-    #PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipPlusLV, 1, [updPlusLV])
+    classLV = ItemCommon.GetItemClassLV(curEquip) 
     
+    DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
+    # 强化成就
+    __UpdateEquipPlusSuccess(curPlayer, classLV)
+    EventShell.EventRespons_EquipPlus(curPlayer, classLV, updPlusLV)
     
-                    
-    #任务触发
-    #EventShell.EventRespons_OnEquipPartStarUp(curPlayer, setLV)
     # 开服活动数据
-    OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_PlusLV, ChEquip.GetTotalPlusLV(curPlayer))
-    return updPlusLV
+    #OpenServerCampaign.UpdOpenServerCampaignRecordData(curPlayer, ShareDefine.Def_Campaign_Type_Plus, ChEquip.GetTotalPlusLV(curPlayer))
+    return
 
+def __UpdateEquipPlusSuccess(curPlayer, classLV):
+    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
+    if not ipyDataList:
+        return
+    
+    packType = IPY_GameWorld.rptEquip
+    plusLVCountDict = {}
+    for ipyData in ipyDataList:
+        index = ipyData.GetGridIndex()
+        plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, index)
+        if not plusLV:
+            continue
+        conditionKey = (classLV, plusLV)
+        plusLVCountDict[conditionKey] = plusLVCountDict.get(conditionKey, 0) + 1
+        
+    #GameWorld.DebugLog("强化成就数据: classLV=%s,plusLVCountDict=%s" % (classLV, plusLVCountDict))
+    PlayerSuccess.UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipPlus, plusLVCountDict)
+    return
 
-def DoLogic_OnEquipPartStarLVChange(curPlayer, packType):
+def DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV):
     #先刷装备BUFF 再计算属性
     curPlayer.SetDict(ChConfig.Def_PlayerKey_AttrActivatyNotify, ChConfig.Def_AttrActivatyNotify_Plus)
-    ChEquip.RefreshPlayerEquipAttribute(curPlayer)
+    ChEquip.RefreshPlayerEquipAttribute(curPlayer, classLV)
     
     #刷新所有属性
     playControl = PlayerControl.PlayerControl(curPlayer)
     playControl.RefreshPlayerAttrState()
     return
 
+#// A3 16 装备强化进化 #tagCMEquipPlusEvolve
+#struct    tagCMEquipPlusEvolve
+#{
+#    tagHead        Head;
+#    WORD        ItemIndex;        //装备在背包中索引
+#};
+def OnEquipPlusEvolve(playerIndex, clientData, tick):
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(playerIndex)
+    
+    equipPackindex = clientData.ItemIndex
+    
+    packType = IPY_GameWorld.rptEquip
+    curPack = curPlayer.GetItemManager().GetPack(packType)
+    curEquip = curPack.GetAt(equipPackindex)
+    if not ItemCommon.CheckItemCanUse(curEquip):
+        return
+    curEvolveLV = ChEquip.GetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex)
+    nextEvolveLV = curEvolveLV + 1
+    equipPlace = curEquip.GetEquipPlace()
+    ipyData = IpyGameDataPY.GetIpyGameData('EquipPlusEvolve', equipPlace, nextEvolveLV)
+    if not ipyData:
+        return
+    needPlusLV = ipyData.GetNeedPlusLV()
+    curPartPlusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipPackindex)
+    if curPartPlusLV < needPlusLV:
+        GameWorld.DebugLog("强化等级不足,无法进化! curPartPlusLV=%s < needPlusLV=%s, nextEvolveLV=%s" 
+                           % (curPartPlusLV, needPlusLV, nextEvolveLV))
+        return
+    
+    costItemDict = ipyData.GetCostItem()
+    delItemDict = {}
+    itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem)
+    for itemID, itemCnt in costItemDict.items():
+        hasEnough, indexList, findItemIsBind, lackCnt = ItemCommon.GetItem_FromPack_ByID_ExEx(itemID, itemPack, itemCnt)
+        if not hasEnough:
+            GameWorld.DebugLog('装备强化进化 材料不足itemID= %s,itemCnt=%s' % (itemID, itemCnt))
+            return
+        delItemDict[tuple(indexList)] = itemCnt
+    for itemIndexList, delCnt in delItemDict.items():
+        ItemCommon.ReduceItem(curPlayer, itemPack, itemIndexList, delCnt, True, ChConfig.ItemDel_EquipPlus)
+        
+    ChEquip.SetEquipPartPlusEvolveLV(curPlayer, packType, equipPackindex, nextEvolveLV)
+    DoLogic_OnEquipPartStarLVChange(curPlayer, packType, ItemCommon.GetItemClassLV(curEquip))
+    ChEquip.NotifyEquipPartPlusLV(curPlayer, packType, equipPackindex)
+    EventShell.EventRespons_EquipPlusEvolve(curPlayer, nextEvolveLV)
+    return
 
-## 全身12部位强化等级最低的一件强化等级
-#def GetMinPlusLV(curPlayer):
-#    packType = IPY_GameWorld.rptEquip
-#    minPlusLV = GetMaxEquipPartStarLV()
-#    equipPartIndexList = ChConfig.Pack_EquipPart_CanPlusStar.get(packType, [])
-#    for i in equipPartIndexList:
-#        partStarLV = ChEquip.GetEquipPartStarLV(curPlayer, packType, i)
-#        if partStarLV < minPlusLV:
-#            minPlusLV = partStarLV
-#    return minPlusLV
+
+#// A5 C7 激活大师强化等级 #tagCMActivateMasterPlusLV
+#
+#struct    tagCMActivateMasterPlusLV
+#{
+#    tagHead        Head;
+#    BYTE    ClassLV;    // 所属装备阶
+#    WORD    MasterPlusLV;    // 大师强化等级
+#};
+def OnActivateMasterPlusLV(index, clientData, tick):
+    
+    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+    classLV = clientData.ClassLV
+    actMasterPlusLV = clientData.MasterPlusLV
+    
+    curMasterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
+    if curMasterPlusLV >= actMasterPlusLV:
+        # 已经激活过了
+        GameWorld.DebugLog("已经激活过该强化大师等级了! actMasterPlusLV=%s,curMasterPlusLV=%s" % (actMasterPlusLV, curMasterPlusLV))
+        return
+    
+    ipyData = IpyGameDataPY.GetIpyGameDataByCondition("ItemPlusMaster", {"ClassLV":classLV, "MasterPlusLV":actMasterPlusLV}, False, False)
+    if not ipyData:
+        GameWorld.DebugLog("不存在该强化大师等级! actMasterPlusLV=%s" % actMasterPlusLV)
+        return
+    
+    packType = IPY_GameWorld.rptEquip
+    # 判断可否激活
+    for equipPlace in ChConfig.EquipPlace_Base:
+        ipyData = IpyGameDataPY.GetIpyGameData('EquipPlaceIndexMap', classLV, equipPlace)
+        if not ipyData:
+            return
+        equipIndex = ipyData.GetGridIndex()
+        plusLV = ChEquip.GetEquipPartPlusLV(curPlayer, packType, equipIndex)
+        if plusLV < actMasterPlusLV:
+            GameWorld.DebugLog("部位强化等级不足,无法激活强化大师! equipPlace=%s,equipIndex=%s,plusLV=%s < %s" 
+                               % (equipPlace, equipIndex, plusLV, actMasterPlusLV))
+            return
+        
+    GameWorld.DebugLog("激活强化大师等级! classLV=%s,actMasterPlusLV=%s" % (classLV, actMasterPlusLV))
+    
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV, actMasterPlusLV)
+        
+    SyncEquipMasterPlusLVInfo(curPlayer, classLV)
+    ChEquip.ChangeEquipEffectByPlusMaster(curPlayer, classLV)
+    #刷新所有属性
+    DoLogic_OnEquipPartStarLVChange(curPlayer, packType, classLV)
+    return
+
+def SyncEquipMasterPlusLVInfo(curPlayer, classLV=0, isForce=False):
+    ## 同步大师强化等级信息
+    if not classLV:
+        needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1)
+    else:
+        needSyncClassLVList = [classLV]
+        
+    masterPlusLVInfoList = []
+    for classLV in needSyncClassLVList:
+        masterPlusLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipPartMasterPlusLV % classLV)
+        if not masterPlusLV and not isForce:
+            continue
+        lvInfo = ChPyNetSendPack.tagMCMasterPlusLV()
+        lvInfo.ClassLV = classLV
+        lvInfo.MasterPlusLV = masterPlusLV
+        masterPlusLVInfoList.append(lvInfo)
+        
+    if not masterPlusLVInfoList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagMCMasterPlusLVInfo()
+    clientPack.MasterPlusLVInfoList = masterPlusLVInfoList
+    clientPack.Count = len(masterPlusLVInfoList)
+    NetPackCommon.SendFakePack(curPlayer, clientPack)
+    return
+
+

--
Gitblit v1.8.0