| | |
| | | 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
|
| | |
| | | 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
|
| | |
| | | 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)})
|
| | |
| | | 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
|
| | |
| | | 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])
|
| | | # 首次过关不扣次数
|
| | |
| | |
|
| | | 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
|
| | |
|
| | |
| | | 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
|
| | |
| | | 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次击杀, 归属者公共附加掉落,所有归属者都增加击杀次数;
|
| | |
| | | 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() # {颜色:上限数量,...}
|
| | |
| | | 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:
|
| | |
| | | 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))
|
| | |
| | | #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() # 独立概率掉落信息 {(阶,颜色):概率,...}
|
| | |
| | | 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 = []
|
| | |
| | | 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 # 基础概率
|
| | |
| | | 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)
|
| | |
| | | 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)
|
| | |
| | | FunctionNPCCommon.CheckMysticalShopRefresh(curPlayer, tick)
|
| | | #活跃放置
|
| | | PlayerActivity.ProcessActivityPlace(curPlayer)
|
| | | #自定义场景
|
| | | FBLogic.OnCustomSceneProcess(curPlayer, tick)
|
| | | #跨服数据同步,放最后
|
| | | CrossPlayerData.ProcessCrossPlayer(curPlayer, tick)
|
| | | return
|