hxp
5 天以前 a0dd1dc92bb2f6eb7067a624df20a9c326ecde87
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
@@ -24,6 +24,7 @@
import ItemControler
import IpyGameDataPY
import NetPackCommon
import PlayerOnline
import ChConfig
# 自动选择排序优先级索引
@@ -49,6 +50,7 @@
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGSelectEffect % sIndex, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGUnSelectCnt, 0)
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGEffAuto, 0) # 每日重置自动开关
    RefreshDingjungeAttr(curPlayer)
    SyncDingjungeInfo(curPlayer)
    return
@@ -208,18 +210,17 @@
                       % (highestLineID, passLayerMax, quickStartLayer, todayLineID), playerID)
    
    # 快速过关奖励按历史最大过关层级领取
    awardItemDict = {}
    awardIpyData = None
    ipyDataMgr = IpyGameDataPY.IPY_Data()
    for index in range(ipyDataMgr.GetFBDJGQuickCount()):
        quickIpyData = ipyDataMgr.GetFBDJGQuickByIndex(index)
        needLayer = quickIpyData.GetNeedLayer()
        if needLayer > passLayerMax:
            break
        quickItemList = quickIpyData.GetQuickAwardList()
        for itemInfo in quickItemList:
            itemID, itemCount = itemInfo[:2]
            awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount
    awardItemList = [[itemID, itemCount] for itemID, itemCount in awardItemDict.items()]
        awardIpyData = quickIpyData
    if not awardIpyData:
        return
    awardItemList = awardIpyData.GetQuickAwardList()
    
    # 设置起始层关卡
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGLineID, todayLineID)
@@ -295,6 +296,7 @@
    else:
        if __doSelectEff(curPlayer, selectIndex, replaceHole):
            __randSelectEff(curPlayer, isReset=True)
            RefreshDingjungeAttr(curPlayer)
            
    SyncDingjungeInfo(curPlayer)
    return
@@ -316,7 +318,7 @@
    GameWorld.DebugLog("执行一键选择加成效果: unSelectCnt=%s,effHoleCnt=%s,selectSetAttrIDList=%s" % (unSelectCnt, effHoleCnt, selectSetAttrIDList))
    
    randEffCnt = IpyGameDataPY.GetFuncCfg("DingjungeEff", 3)
    for _ in range(unSelectCnt):
    for _ in range(unSelectCnt + 1): # 多执行一次+1是因为可能存在未选择的视为1次,内层有验证剩余未选择数,所以多执行一次没关系
        effIDList = __randSelectEff(curPlayer, randEffCnt)
        if not effIDList:
            break
@@ -326,6 +328,8 @@
        # 自动选择后重置
        for sIndex in range(randEffCnt):
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGSelectEffect % sIndex, 0)
    RefreshDingjungeAttr(curPlayer)
    return True
def __getUnlockEffHoleCnt(curPlayer):
@@ -340,17 +344,16 @@
def __randSelectEff(curPlayer, randEffCnt=0, isReset=False):
    ## 随机生成待选择加成效果
    unSelectCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGUnSelectCnt)
    if unSelectCnt <= 0:
        GameWorld.DebugLog("没有未处理的加成效果次数了")
        return
    if not randEffCnt:
        randEffCnt = IpyGameDataPY.GetFuncCfg("DingjungeEff", 3)
    effIDList = []
    if isReset:
        # 重置
        for sIndex in range(randEffCnt):
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGSelectEffect % sIndex, 0)
    effIDList = []
    if isReset:
        pass
    else:
        for sIndex in range(randEffCnt):
            effID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGSelectEffect % sIndex)
@@ -358,8 +361,13 @@
                break
            effIDList.append(effID)
    if effIDList:
        GameWorld.DebugLog("已存在未选择的加成效果等选择后再生成: effIDList=%s,unSelectCnt=%s" % (effIDList, unSelectCnt))
        #GameWorld.DebugLog("已存在未选择的加成效果等选择后再生成: effIDList=%s,unSelectCnt=%s" % (effIDList, unSelectCnt))
        return effIDList
    unSelectCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGUnSelectCnt)
    if unSelectCnt <= 0:
        GameWorld.DebugLog("没有未处理的加成效果次数了")
        return []
    
    fullLVEffIDList = [] # 已满级的效果ID列表
    effMaxLV = IpyGameDataPY.GetFuncCfg("DingjungeEff", 2)
@@ -546,6 +554,36 @@
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGEffect % replaceIndex, effInfo)
    return True
def RefreshDingjungeAttr(curPlayer):
    CalcDingjungeAttr(curPlayer)
    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr(exclusiveMapID=ChConfig.Def_FBMapID_Dingjunge)
    return
def CalcDingjungeAttr(curPlayer):
    playerID = curPlayer.GetPlayerID()
    attrDict = {}
    effHoleCnt = __getUnlockEffHoleCnt(curPlayer)
    for eIndex in range(effHoleCnt):
        effInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGEffect % eIndex)
        if not effInfo:
            continue
        effID, effLV = effInfo / 100, effInfo % 100
        effIpyData = IpyGameDataPY.GetIpyGameData("FBDJGEffect", effID)
        if not effIpyData:
            continue
        attrID = effIpyData.GetAttrID()
        attrValue = effIpyData.GetAttrValue()
        attrValueTotal = attrValue * effLV
        attrDict[attrID] = attrDict.get(attrID, 0) + attrValueTotal
        #GameWorld.DebugLog("eIndex=%s,effID=%s,attrID=%s,attrValue=%s,effLV=%s,%s" % (eIndex, effID, attrID, attrValue, effLV, attrDict), playerID)
    # 保存计算值
    GameWorld.DebugLog("定军属性: %s" % attrDict, playerID)
    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Dingjunge, attrDict)
    return
def SyncDingjungeInfo(curPlayer):
    clientPack = ChPyNetSendPack.tagSCDingjungeInfo()
    clientPack.TodayPass = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGLineID)