From 33c902a503e4da79612405176498e10dcb2cdb1f Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 31 三月 2020 17:29:12 +0800
Subject: [PATCH] 8405 【后端】成就系统开发(优化按境界阶更新成就进度逻辑;增加多成就条件向下适配更新成就进度模式;坐骑成就修改;增加天星塔成就)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py |  278 +++++++++++++++++++++----------------------------------
 1 files changed, 107 insertions(+), 171 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
index aceaebe..1d4901f 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerSuccess.py
@@ -240,42 +240,9 @@
 def __CheckOldPlayerSuccess(curPlayer):
     ''' 成就版本更新老玩家检查  每次启动服务后 玩家第一次上线检查成就完成情况
     '''
-    #Versions = 2 #版本号,往上增加
     initGameWorldTime = GameWorld.GetGameWorld().GetGameWorldDictByKey(ShareDefine.Def_Notify_WorldKey_InitGameWorldTime)
-    # 上线需要检查老玩家成就完成情况类型{成就类型:维护版本号, ...}
+    # 上线需要检查老玩家成就完成情况类型
     NeedCheckSuccTypeList = [
-                            ShareDefine.SuccType_GetMagicWeapon,
-                            ShareDefine.SuccType_PassRuneTower,
-                            ShareDefine.SuccType_GodWeapon,
-                            ShareDefine.SuccType_HorseAllLV,
-                            #ShareDefine.SuccType_EquipPlusLV,
-                            ShareDefine.SuccType_EquipColorItem,
-                            ShareDefine.SuccType_EquipArmor,
-                            ShareDefine.SuccType_EquipWeapon,
-                            ShareDefine.SuccType_InlayRune,
-                            ShareDefine.SuccType_RuneLvUp,
-                            ShareDefine.SuccType_RealmlvUp,
-                            ShareDefine.SuccType_PetClassLV,
-                            ShareDefine.SuccType_InlayStone1,
-                            ShareDefine.SuccType_InlayStone2,
-                            ShareDefine.SuccType_XJMJGetExp,
-                            ShareDefine.SuccType_EquipWashLV1,
-                            ShareDefine.SuccType_EquipWashLV2,
-                            ShareDefine.SuccType_EquipWashLV3,
-                            ShareDefine.SuccType_EquipWing,
-                            ShareDefine.SuccType_MWSkillUp,
-                            ShareDefine.SuccType_EquipSuit,
-                            ShareDefine.SuccType_FamilyTechLV,
-                            ShareDefine.SuccType_AlchemyLV,
-                            ShareDefine.SuccType_VIPLV,
-                            ShareDefine.SuccType_StoneTotalLV,
-                            ShareDefine.SuccType_XBXZ,
-                            ShareDefine.SuccType_DogzBattle,
-                            ShareDefine.SuccType_DogzEquipPlus,
-                            ShareDefine.SuccType_MainTaskNode,
-                            ShareDefine.SuccType_InlayGatherSoul,
-                            ShareDefine.SuccType_GatherSoulLvUp,
-                            ShareDefine.SuccType_UseStoveBylv,
                              ]
     
     curCheckVersion = GetPDictValue(curPlayer, ChConfig.Def_PDict_Success_CheckVersion)
@@ -285,120 +252,8 @@
     GameWorld.DebugLog("更新老玩家上线检查成就curCheckVersion=%s" % (curCheckVersion))
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     for succType in NeedCheckSuccTypeList:
-        if succType == ShareDefine.SuccType_GetMagicWeapon:
-            
-            for i in xrange(ipyDataMgr.GetTreasureCount()):
-                treasureIpyData = ipyDataMgr.GetTreasureByIndex(i)
-                magicWeaponID = treasureIpyData.GetID()
-                isActive = PlayerMagicWeapon.GetIsActiveMagicWeapon(curPlayer, magicWeaponID)
-                if not isActive:
-                    continue
-                curMWLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % magicWeaponID)
-                for lv in xrange(curMWLV+1):
-                    DoAddSuccessProgress(curPlayer, succType, 1, [magicWeaponID, lv])
-        elif succType == ShareDefine.SuccType_PassRuneTower:
-            passlv = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_TrialTower_PassLV)
-            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PassRuneTower, 1, [passlv])
-        elif succType == ShareDefine.SuccType_GodWeapon:
-            ResetSuccessByType(curPlayer, succType)
-            maxType = ipyDataMgr.GetGodWeaponByIndex(ipyDataMgr.GetGodWeaponCount()-1).GetType()
-            for i in xrange(1, maxType + 1):
-                weaponLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_GodWeaponLV % i)
-                UptateSuccessProgress(curPlayer, succType, weaponLV, [i])
-        elif succType == ShareDefine.SuccType_EquipPlusLV:
-            ResetSuccessByType(curPlayer, succType)
-            for pType, indexList in ChConfig.Pack_EquipPart_CanPlusStar.items():
-                for i in indexList:
-                    equipPartStarLV = ChEquip.GetEquipPartPlusLV(curPlayer, pType, i)
-                    for pluslv in xrange(1, equipPartStarLV+1):
-                        DoAddSuccessProgress(curPlayer, succType, 1, [pluslv])
-                    
-        elif succType in [ShareDefine.SuccType_EquipColorItem, ShareDefine.SuccType_EquipArmor, ShareDefine.SuccType_EquipWeapon, ShareDefine.SuccType_EquipWing]:
-            DoEquipSuccessLogic(curPlayer)
-        elif succType in [ShareDefine.SuccType_InlayRune, ShareDefine.SuccType_RuneLvUp]:
-            PlayerRune.DoRuneSuccessLogic(curPlayer)
-        elif succType in [ShareDefine.SuccType_InlayGatherSoul, ShareDefine.SuccType_GatherSoulLvUp]:
-            PlayerGatherSoul.DoGatherSoulSuccessLogic(curPlayer)
-        elif succType == ShareDefine.SuccType_RealmlvUp:
-            ResetSuccessByType(curPlayer, succType)
-            UptateSuccessProgress(curPlayer, succType, curPlayer.GetOfficialRank())
-        elif succType == ShareDefine.SuccType_PetClassLV:
-            ResetSuccessByType(curPlayer, succType)
-            petDataPack = curPlayer.GetItemManager().GetPack(ShareDefine.rptPet)
-            for petDataIndex in range(petDataPack.GetCount()):
-                petItem = petDataPack.GetAt(petDataIndex)
-                if petItem.IsEmpty():
-                    continue
-                petNPCID = petItem.GetUserAttr(ShareDefine.Def_IudetPet_NPCID)
-                classLV = petItem.GetUserAttr(ShareDefine.Def_IudetPet_ClassLV)
-                for lv in xrange(classLV+1):
-                    DoAddSuccessProgress(curPlayer, succType, 1, [petNPCID, lv+1])
-                    
-        elif succType in [ShareDefine.SuccType_InlayStone1, ShareDefine.SuccType_InlayStone2, ShareDefine.SuccType_StoneTotalLV]:
-            Operate_EquipStone.DoStoneSuccess(curPlayer)
-        elif succType == ShareDefine.SuccType_XJMJGetExp:
-            expPointRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_BZZD_TotalFightExpPoint)
-            DoAddSuccessProgress(curPlayer, succType, 1, [expPointRecord])
-        elif succType in [ShareDefine.SuccType_EquipWashLV1,ShareDefine.SuccType_EquipWashLV2,ShareDefine.SuccType_EquipWashLV3]:
-            Operate_EquipWash.EquipWashSuccess(curPlayer)
-        elif succType == ShareDefine.SuccType_MWSkillUp:
-            ResetSuccessByType(curPlayer, succType)
-            skillManager = curPlayer.GetSkillManager()
-            for i in range(0, skillManager.GetSkillCount()):
-                curSkill = skillManager.GetSkillByIndex(i)
-                if curSkill.GetFuncType() in [ChConfig.Def_SkillFuncType_FbSkill,ChConfig.Def_SkillFuncType_FbSPSkill]:
-                    curSkillLV = curSkill.GetSkillLV()
-                    UptateSuccessProgress(curPlayer, succType, curSkillLV, [curSkill.GetSkillTypeID()])
-            
-#        elif succType == ShareDefine.SuccType_EquipSuit:
-#            Operate_EquipSuitCompose.DoSuiteSuccess(curPlayer)
-        elif succType == ShareDefine.SuccType_FamilyTechLV:
-            ResetSuccessByType(curPlayer, succType)
-            techNeedLVDict = IpyGameDataPY.GetFuncEvalCfg('FamilyTechNeedLV', 1, {})
-            techIDList = techNeedLVDict.keys()
-            for techID in techIDList:
-                techLV = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyTechLV % techID)
-                UptateSuccessProgress(curPlayer, succType, techLV, [techID])
-        elif succType == ShareDefine.SuccType_AlchemyLV:
-            ResetSuccessByType(curPlayer, succType)
-            alchemyLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AlchemyLV)
-            UptateSuccessProgress(curPlayer, succType, alchemyLV)
-        elif succType == ShareDefine.SuccType_VIPLV:
-            DoAddSuccessProgress(curPlayer, succType, 1, [curPlayer.GetVIPLv()])
-        elif succType == ShareDefine.SuccType_XBXZ:
-            ResetSuccessByType(curPlayer, succType)
-            for i in xrange(ipyDataMgr.GetXBXZCount()):
-                ipyData = ipyDataMgr.GetXBXZByIndex(i)
-                if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_XBXZAwardRecord, ipyData.GetID()):
-                    DoAddSuccessProgress(curPlayer, succType, 1, [ipyData.GetMWID()])
-
-        elif succType == ShareDefine.SuccType_DogzBattle:
-            for i in xrange(ipyDataMgr.GetDogzCount()):
-                ipyData = ipyDataMgr.GetDogzByIndex(i)
-                if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_PDict_DogzFightState, i):
-                    DoAddSuccessProgress(curPlayer, succType, 1, [ipyData.GetDogzID()])
-                    
-        elif succType == ShareDefine.SuccType_DogzEquipPlus:
-            ResetSuccessByType(curPlayer, succType)
-            DoAddSuccessProgress(curPlayer, succType, PlayerDogz.GetFightDogzTotalPlusLv(curPlayer))
-        elif succType == ShareDefine.SuccType_MainTaskNode: #只能处理主线任务
-            succInfoList = GetSuccDataMng().GetSuccDataByType(succType)
-            for succData in succInfoList:
-                missionID = succData.condition[0]
-                if QuestCommon.GetHadFinishMainMission(curPlayer, missionID):
-                    DoAddSuccessProgress(curPlayer, succType, 1, [missionID])
-        elif succType == ShareDefine.SuccType_UseStoveBylv:
-            ResetSuccessByType(curPlayer, succType)
-            for i in xrange(ipyDataMgr.GetAttrFruitCount()):
-                ipyData = ipyDataMgr.GetAttrFruitByIndex(i)
-                fruitItemID = ipyData.GetID()
-                hasUseCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_AttrFruitEatCnt % fruitItemID)
-                if ipyData.GetFuncID() == ShareDefine.Def_AttrFruitFunc_Stove:
-                    itemData = GameWorld.GetGameData().GetItemByTypeID(fruitItemID)
-                    if not itemData:
-                        continue
-                    DoAddSuccessProgress(curPlayer, succType, hasUseCnt, [itemData.GetLV()])
-                    
+        pass
+       
     DataRecordPack.DR_CheckOldPlayerSuccess(curPlayer)
     SetPDictValue(curPlayer, ChConfig.Def_PDict_Success_CheckVersion, initGameWorldTime)
     GameWorld.DebugLog("更新老玩家上线检查成就updCheckVersions=%s" % (initGameWorldTime), curPlayer.GetID())
@@ -529,37 +384,111 @@
         SetSuccFinishValue(curPlayer, succType, condition, 0)
     return
 
-def DoEquipSuccessLogic(curPlayer):
+def DoEquipSuccessLogic(curPlayer, classLV):
     #玩家当前可装备的装备类型
-    ResetSuccessByType(curPlayer, ShareDefine.SuccType_EquipColorItem)
-    ResetSuccessByType(curPlayer, ShareDefine.SuccType_EquipArmor)
-    ResetSuccessByType(curPlayer, ShareDefine.SuccType_EquipWeapon)
     
-    packType = IPY_GameWorld.rptEquip
+    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('EquipPlaceIndexMap', {'ClassLV':classLV}, True)
+    if not ipyDataList:
+        return
     
-    playerEquip = curPlayer.GetItemManager().GetPack(packType)
-    for equipIndex in xrange(playerEquip.GetCount()):
-        if equipIndex not in ShareDefine.RoleEquipType :
-            continue
-       
+    placeCountDict, colorCountDict, suitCountDict = {}, {}, {}
+    playerEquip = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptEquip)
+    for ipyData in ipyDataList:
+        equipIndex = ipyData.GetGridIndex()
         curEquip = playerEquip.GetAt(equipIndex)
         if curEquip.IsEmpty():
             continue
-        itemColor = curEquip.GetUserAttr(ShareDefine.Def_IudetItemColor)
-        if not itemColor:
+        itemPlace = curEquip.GetEquipPlace()
+        
+        # 套装、颜色 成就 统计基础部位
+        if itemPlace in ChConfig.EquipPlace_Base:
             itemColor = curEquip.GetItemColor()
+            colorConditionKey = (classLV, itemColor)
+            colorCountDict[colorConditionKey] = colorCountDict.get(colorConditionKey, 0) + 1
+            
+            # 统计套装数
+            if curEquip.GetSuiteID():
+                suitConditionKey = (classLV, )
+                suitCountDict[suitConditionKey] = suitCountDict.get(suitConditionKey, 0) + 1
+                
+        # 部位 成就 统计特殊部位
+        elif itemPlace in ChConfig.EquipPlace_Special:
+            placeConditionKey = (classLV, itemPlace)
+            placeCountDict[placeConditionKey] = placeCountDict.get(placeConditionKey, 0) + 1
+            
+    # 更新成就
+    #GameWorld.DebugLog("装备阶部位成就数据: classLV=%s,placeCountDict=%s" % (classLV, placeCountDict))
+    UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipPlace, placeCountDict)
+    
+    #GameWorld.DebugLog("装备阶颜色成就数据: classLV=%s,colorCountDict=%s" % (classLV, colorCountDict))
+    UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipColorItem, colorCountDict)
+    
+    #GameWorld.DebugLog("装备阶套装成就数据: classLV=%s,suitCountDict=%s" % (classLV, suitCountDict))
+    UpdateSuccessProgressByConditions(curPlayer, ShareDefine.SuccType_EquipSuit, suitCountDict)
+    return
+
+def UpdateSuccessProgressByConditions(curPlayer, successType, conditionCountDict):
+    if successType not in ShareDefine.SuccessTypeList:
+        return
+    succInfoList = GetSuccDataMng().GetSuccDataByType(successType)
+    if not succInfoList:
+        return
+    updIDList = []
+    updsuccDataList = []
+    updConditionDict = {}
+    
+    for condition, newCount in conditionCountDict.items():
+        addCondList = [] # 不同的成就ID条件可能相同,只是最大进度不同,故传入的条件计数针对相同成就条件只能累加一次
+        for succDataObj in succInfoList:
+            cond = succDataObj.condition
+            
+            tupleCond = tuple(cond) # 作为字典key用
+            succID = succDataObj.succID
+            needCnt = succDataObj.needCnt
+            
+            if tupleCond not in updConditionDict:
+                updConditionDict[tupleCond] = [cond, 0, 0] # [条件, 更新值, 最大进度值]
+            updInfo = updConditionDict[tupleCond]
+            if updInfo[2] < needCnt:
+                updInfo[2] = needCnt
+                
+            if not __CheckCanAddSuccess(curPlayer, succDataObj, list(condition)):
+                continue
+            
+            if succID not in updIDList:
+                updIDList.append(succID)
+                updsuccDataList.append(succDataObj)
+                
+            if tupleCond not in addCondList:
+                addCondList.append(tupleCond)
+                updConditionDict[tupleCond][1] = updConditionDict[tupleCond][1] + newCount # 更新进度值
+                
+    # 没有找到更新目标不处理
+    #GameWorld.DebugLog("    updConditionDict=%s" % updConditionDict)
+    #GameWorld.DebugLog("    updIDList=%s" % updIDList)
+    if not updIDList:
+        return
+    
+    isUpd = False
+    # 先更新成就记录值后再判断完成与否
+    for cond, updCnt, maxCnt in updConditionDict.values():
+        if not updCnt:
+            continue
+        updCnt = min(maxCnt, updCnt)
+        if GetSuccFinishValue(curPlayer, successType, cond) == updCnt:
+            continue
+        isUpd = True
+        SetSuccFinishValue(curPlayer, successType, cond, updCnt)
+        #GameWorld.DebugLog("    successType=%s,cond=%s,updCnt=%s,maxCnt=%s"  % (successType, cond, updCnt, maxCnt))
         
-        itemQuality = curEquip.GetItemQuality()
-        classLV = ItemCommon.GetItemClassLV(curEquip)
-        if equipIndex not in [ShareDefine.retWing,ShareDefine.retGuard1,ShareDefine.retGuard2,ShareDefine.retHorse]:
-            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipColorItem, 1, [classLV, itemColor])
-        if equipIndex in ChConfig.EquipPlace_BaseWeapon:
-            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipWeapon, 1, [itemColor, itemQuality, classLV])
-        elif equipIndex in ChConfig.EquipPlace_BaseArmor:
-            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipArmor, 1, [itemColor, itemQuality, classLV])
-        
-        elif equipIndex == ShareDefine.retWing:
-            DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_EquipWing, 1, [classLV, itemColor])
+    if not isUpd:
+        return
+    
+    # 同步更新信息
+    Sync_SuccessInfo(curPlayer, updIDList, False)
+    
+    # 更新值后检查成就完成情况
+    __DoCheckSuccessFinish(curPlayer, successType, updsuccDataList)
     return
 
 
@@ -629,7 +558,14 @@
             # 可向下增加进度的, 仅配置值 <= 该值的可增加进度
             if not isUnDownCheck:
                 isbreak = False
+                undowncheckIndexList = [] # 不向下检查的条件索引
+                if successType in ShareDefine.PartUnDownCheckSuccessTypeInfo:
+                    undowncheckIndexList = ShareDefine.PartUnDownCheckSuccessTypeInfo[successType]
                 for i, num in enumerate(cond):
+                    if i in undowncheckIndexList:
+                        if num != condition[i]:
+                            isbreak = True
+                            break
                     if num > condition[i]:
                         isbreak = True
                         break

--
Gitblit v1.8.0