hxp
2020-03-04 532ee8a00dac025085c781f6d62f7d12072ea6b0
8397 【开发】个人boss新增评级
7个文件已修改
97 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3074,6 +3074,8 @@
Def_Player_RefreshAttrByBuff = "PlayerAttrByBuff"   # 玩家属性刷新功能属性缓存,便于buff刷新计算, 间隔刷新
Def_Player_HadRefreshAttr = "HadRefreshAttr"   # 玩家在本地图是否刷新过属性
Def_PlayerKey_ClientCustomScene = "ClientCustomScene"     # 客户端自定义场景状态
Def_PlayerKey_ClientCustomSceneStepTick = "ClientCustomSceneStepTick"     # 客户端自定义场景tick
Def_PlayerKey_ClientCustomSceneGrade = "ClientCustomSceneGrade"     # 客户端自定义场景评级
Def_PlayerKey_ChangeMapID = "ChangeMapID"     # 请求切换的地图ID
Def_PlayerKey_ChangeLineID = "ChangeLineID"     # 请求切换的线路ID
Def_PlayerKey_ResetFBLinePosX = "ResetFBLinePosX"     # 请求切换副本多合一地图功能线路ID
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBLogic.py
@@ -935,6 +935,18 @@
    callFunc(tick)
    return
def OnCustomSceneProcess(curPlayer, tick):
    customMapID = PlayerControl.GetCustomMapID(curPlayer)
    if not customMapID:
        return
    customLineID = PlayerControl.GetCustomLineID(curPlayer)
    do_FBLogic_ID = __GetFBLogic_MapID(customMapID)
    callFunc = GameWorld.GetExecFunc(FBProcess, "GameLogic_%s.%s" % (do_FBLogic_ID, "OnCustomSceneProcess"))
    if callFunc:
        callFunc(curPlayer, customMapID, customLineID, tick)
    return
## 开始采集
#  @param curPlayer 当前玩家
#  @param curNPC 当前NPC
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -566,6 +566,43 @@
                curPlayer.Sync_TimeTick(timeType, 0, diffSecond * 1000, True)
    return updGrade
def UpdateCustomFBGrade(curPlayer, tick, gradeTimeList, timeType=IPY_GameWorld.tttFlagTake):
    '''更新当前副本星级、评级
    @param gradeTimeList: 评级分段时间列表,单位秒 [最高评级可用时间, 下级可用时间, ..., 最低级可用时间]
    @param curPlayer: 触发的玩家,一般是DoEnter时调用,会同步更新一次副本评级并将信息通知该玩家
    @note: 星级:1-1星;2-2星 ...            [60, 20, 10]
            评级:1-D;2-C;3-B;4-A;5-S;    [60, 30, 30, 20, 10]
    '''
    lowest = 1
    curGrade = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneGrade)
    #最后一个评级了,不再处理
    if curGrade == lowest:
        return curGrade
    fbStepTick = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick)
    useSecond = int((tick - fbStepTick) / 1000.0) # 战斗阶段已耗总秒数
    diffSecond = 0
    updGrade = len(gradeTimeList)
    gSecondTotal = 0
    for gSecond in gradeTimeList:
        gSecondTotal += gSecond
        diffSecond = gSecondTotal - useSecond
        # 还在当前评级段
        if diffSecond > 0:
            break
        updGrade -= 1 # 用时超过当前评级段,降级
    updGrade = max(lowest, updGrade) # 保底最低级
    if curGrade == updGrade:
        return curGrade
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneGrade, updGrade)
    GameWorld.DebugLog("UpdateCustomFBGrade useSecond=%s,gradeTimeList=%s,curGrade=%s,updGrade=%s,diffSecond=%s"
                       % (useSecond, gradeTimeList, curGrade, updGrade, diffSecond))
    if updGrade != lowest:
        curPlayer.Sync_TimeTick(timeType, 0, diffSecond * 1000, True)
    return updGrade
def NotifyFBOver(curPlayer, dataMapID, lineID, isPass, overDict={}):
    ## 通知玩家副本总结, 该函数统一几个必带参数
    overDict.update({Over_dataMapID:dataMapID, Over_lineID:lineID, Over_isPass:int(isPass)})
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_PersonalBoss.py
@@ -45,6 +45,12 @@
        FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Fight)
        EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_PersonalBoss, 0, ChConfig.CME_Log_Start)
        
        tick = GameWorld.GetGameWorld().GetTick()
        FBCommon.UpdateCustomFBGrade(curPlayer, tick, FBCommon.GetFBLineGrade(mapID, lineID))
    return
def OnCustomSceneProcess(curPlayer, mapID, lineID, tick):
    FBCommon.UpdateCustomFBGrade(curPlayer, tick, FBCommon.GetFBLineGrade(mapID, lineID))
    return
## 自定义场景副本击杀NPC
@@ -59,6 +65,9 @@
    if FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Fight:
        return
    
    grade = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneGrade)
    costTime = GameWorld.GetGameWorld().GetTick() - curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick)
    GameWorld.DebugLog("个人boss过关: grade=%s,costTime=%s" % (grade, costTime))
    isFree = False
    curfbStar = GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_PlayerFBStar_MapId, lineID, False, [mapID])
    # 首次过关不扣次数
@@ -78,10 +87,10 @@
    
    npcCountDict = {bossID:1}
    dropItemMapInfo = [0, 0]
    jsonItemList = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, dropItemMapInfo=dropItemMapInfo, isVirtualDrop=True)[0]
    jsonItemList = NPCCommon.GiveKillNPCDropPrize(curPlayer, mapID, npcCountDict, dropItemMapInfo=dropItemMapInfo, curGrade=grade, isVirtualDrop=True)[0]
    FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over)
    isPass = 1
    overDict = {FBCommon.Over_itemInfo:jsonItemList}
    overDict = {FBCommon.Over_itemInfo:jsonItemList, FBCommon.Over_grade:grade, FBCommon.Over_costTime:costTime}
    FBCommon.NotifyFBOver(curPlayer, mapID, lineID, isPass, overDict)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/NPC/NPCCommon.py
@@ -915,6 +915,8 @@
        GameWorld.ErrLog("获取NPC掉落配置错误!表不存在该NPCID=%s" % npcID, playerID)
        return
    
    curGrade = curGrade if curGrade else GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_FB_Grade)
    dropIDList = [] # 掉落的ID列表
    auctionIDList = []
    dropMoneyCnt, moneyValue = 0, 0
@@ -969,7 +971,7 @@
    indepRateDoCnt = ipyDrop.GetIndepRateDoCnt()
    if indepRateDoCnt:
        indepRateDoCnt = __GetNPCDropDoCountChange(indepRateDoCnt, doCountRate + equipDropDoCountPlus, doCountAdd)
        dropEquipInfoList += __GetNPCIndepRateEquipDrop(ipyDrop, indepRateDoCnt, equipDropRatePlus, curGrade)
        dropEquipInfoList += __GetNPCIndepRateEquipDrop(mapID, ipyDrop, indepRateDoCnt, equipDropRatePlus, curGrade)
    #GameWorld.DebugLog("阶,颜色 key,dropEquipInfoList=%s" % (dropEquipInfoList))
    
    # 3. 第x次击杀, 归属者公共附加掉落,所有归属者都增加击杀次数; 
@@ -1022,7 +1024,6 @@
    fbGradeColorSuitRateDict = IpyGameDataPY.GetFuncEvalCfg("FBGradeEquipDropRate", 2) # 评级影响颜色套装概率 {npcID:{颜色:[D级影响概率, ..., S级影响概率], ...}, ...}
    if npcID in fbGradeColorSuitRateDict:
        gradeColorSuitRateDict = fbGradeColorSuitRateDict[npcID]
        curGrade = curGrade if curGrade else GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_FB_Grade)
        
    colorDropCntDict = {} # 装备颜色已经掉落数 {颜色:数量, ...}
    colorMaxDropCntDict = ipyDrop.GetEquipColorMaxDropCount() # {颜色:上限数量,...}
@@ -1107,7 +1108,6 @@
        fbGradePriItemIDDropDict = IpyGameDataPY.GetFuncEvalCfg("FBGradeEquipDropRate", 3)
        if npcID in fbGradePriItemIDDropDict:
            gradePriItemIDDropDict = fbGradePriItemIDDropDict[npcID]
            curGrade = curGrade if curGrade else GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_FB_Grade)
            priDropInfoList = gradePriItemIDDropDict.get(curGrade, [])
            priDropIDList = []
            for priItemID, priItemCount in priDropInfoList:
@@ -1117,6 +1117,15 @@
        for priDropID in priDropIDList:
            dropIDList.append(priDropID)
            #GameWorld.DebugLog("私有物品掉落: priDropID=%s" % priDropID)
    # 6. 地图评级额外掉落
    fbGradeDropItemExDict = IpyGameDataPY.GetFuncEvalCfg("FBGradeEquipDropRate2", 2) # 地图评级额外物品掉落 {"mapID":{"评级":[[物品ID,个数], ...], ...}}
    if curGrade and str(mapID) in fbGradeDropItemExDict:
        gradeItemExDict = fbGradeDropItemExDict[str(mapID)]
        gradeItemExList = gradeItemExDict.get(str(curGrade), [])
        #GameWorld.DebugLog("评级额外掉落物品: curGrade=%s,gradeItemExList=%s" % (curGrade, gradeItemExList))
        for gItemExID, gItemExCount in gradeItemExList:
            dropIDList += [gItemExID] * gItemExCount
            
    # 检查掉落互斥ID组
    dropIDList = __RemoveMutexDropID(dropIDList, IpyGameDataPY.GetFuncCfg("MutexDrop", 1))
@@ -1505,7 +1514,7 @@
    #GameWorld.DebugLog("饼图装备掉落结果: doCnt=%s, %s" % (doCnt, dropEquipInfoList))
    return dropEquipInfoList
def __GetNPCIndepRateEquipDrop(ipyDrop, doCnt, equipDropPlus, curGrade=0):
def __GetNPCIndepRateEquipDrop(mapID, ipyDrop, doCnt, equipDropPlus, curGrade=0):
    ## 获取NPC独立掉率装备掉落信息
    npcID = ipyDrop.GetNPCID()
    indepRateDict = ipyDrop.GetIndepRateDrop() # 独立概率掉落信息 {(阶,颜色):概率,...}
@@ -1514,7 +1523,12 @@
    fbGradeColorRateDict = IpyGameDataPY.GetFuncEvalCfg("FBGradeEquipDropRate", 1) #{npcID:{颜色:[D级影响概率, ..., S级影响概率], ...}, ...}
    if npcID in fbGradeColorRateDict:
        gradeColorRateDict = fbGradeColorRateDict[npcID]
        curGrade = curGrade if curGrade else GameWorld.GetGameFB().GetGameFBDictByKey(ChConfig.Def_FB_Grade)
    orangeEquipPer = 0
    fbGradeOrangeEquipPerDict = IpyGameDataPY.GetFuncEvalCfg("FBGradeEquipDropRate2", 1) # 地图评级影响橙装概率百分率 {"mapID":[D级影响概率, ..., S级影响概率], ..}
    if str(mapID) in fbGradeOrangeEquipPerDict and curGrade:
        orangeEquipPerList = fbGradeOrangeEquipPerDict[str(mapID)]
        orangeEquipPer = 0 if (curGrade <= 0 or curGrade > len(orangeEquipPerList)) else orangeEquipPerList[curGrade - 1]
        
    #colorDropCntDict = {} # 装备颜色已经掉落数 {颜色:数量, ...}
    dropEquipInfoList = []
@@ -1528,6 +1542,10 @@
                dropRate = int(dropRate * colorRate / 10000.0)
                #GameWorld.DebugLog("    评级影响颜色概率: curGrade=%s,colorRate=%s,dropRate=%s" % (curGrade, colorRate, dropRate))
                
            if color == ChConfig.Def_Quality_Orange and orangeEquipPer:
                dropRate = int(dropRate * orangeEquipPer / 100.0)
                #GameWorld.DebugLog("评级橙装掉率加成: orangeEquipPer=%s,dropRate=%s" % (orangeEquipPer, dropRate))
            dropRate = dropRate if not equipDropPlus else (dropRate + int(dropRate * equipDropPlus / 10000.0))
            mustDropCount = dropRate / Def_NPCMaxDropRate
            dropRate = dropRate % Def_NPCMaxDropRate # 基础概率
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFB.py
@@ -508,6 +508,7 @@
    PlayerControl.SetPlayerSightLevel(curPlayer, curPlayer.GetID())
        
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 1) # 由于前端不一定有发mapID,所以这里额外记录这个状态,不能直接用mapID判断
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick, tick)
    PlayerControl.SetCustomMap(curPlayer, mapID, lineID)
    NPCCommon.ClearPriWoodPile(curPlayer)
    GameWorld.Log("玩家开始自定义场景!mapID=%s,lineID=%s" % (mapID, lineID), playerID)
@@ -539,6 +540,8 @@
    mapID = PlayerControl.GetCustomMapID(curPlayer)
    lineID = PlayerControl.GetCustomLineID(curPlayer)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomScene, 0)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneStepTick, 0)
    curPlayer.SetDict(ChConfig.Def_PlayerKey_ClientCustomSceneGrade, 0)
    PlayerControl.SetCustomMap(curPlayer, 0, 0)
    if mapID and FBCommon.GetCustomMapStep(curPlayer, mapID, lineID) != ChConfig.CustomMapStep_Over:
        FBCommon.SetCustomMapStep(curPlayer, mapID, lineID, ChConfig.CustomMapStep_Over)
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerState.py
@@ -1277,6 +1277,8 @@
    FunctionNPCCommon.CheckMysticalShopRefresh(curPlayer, tick)
    #活跃放置
    PlayerActivity.ProcessActivityPlace(curPlayer)
    #自定义场景
    FBLogic.OnCustomSceneProcess(curPlayer, tick)
    #跨服数据同步,放最后
    CrossPlayerData.ProcessCrossPlayer(curPlayer, tick)
    return