xdh
2018-11-13 7cf1869b1e6ee737eebb37c6e6d8721100229daf
4710 【1.3】【后端】魔族法宝副本修改(新增多个小关卡)
7个文件已修改
169 ■■■■■ 已修改文件
PySysDB/PySysDBPY.h 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MagicWeapon.py 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
PySysDB/PySysDBPY.h
@@ -1374,3 +1374,14 @@
    dict        AwardItem;    //返利物品信息列表 {职业:[(物品ID,个数,是否绑定),...]}
    char        NotifyKey;        //全服广播key,默认两个参数(玩家名, 档位额度)
};
//法宝副本表
struct tagMagicWeaponFB
{
    DWORD        _MWID;    //法宝ID
    BYTE        LineID;    //副本功能线路ID
    BYTE        _Level;    //关卡
    list        RefreshNPC;    //刷怪配置
    dict        AttrDict;    //属性
};
ServerPython/CoreServerGroup/GameServer/Script/ChPyNetSendPack.py
@@ -12705,6 +12705,7 @@
                  ("LV", c_ubyte),    
                  ("Exp", c_int),    
                  ("State", c_ubyte),    #是否点击法宝认主
                  ("FBPassLV", c_ubyte),    #副本关卡
                  ]
    def __init__(self):
@@ -12721,6 +12722,7 @@
        self.LV = 0
        self.Exp = 0
        self.State = 0
        self.FBPassLV = 0
        return
    def GetLength(self):
@@ -12734,13 +12736,15 @@
                                MWID:%d,
                                LV:%d,
                                Exp:%d,
                                State:%d
                                State:%d,
                                FBPassLV:%d
                                '''\
                                %(
                                self.MWID,
                                self.LV,
                                self.Exp,
                                self.State
                                self.State,
                                self.FBPassLV
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChConfig.py
@@ -3816,7 +3816,7 @@
Def_PDict_MWSoulGotValue = "MWSoulGotValue_%s" #法宝特权已领取进度 参数特权ID
Def_PDict_MWSoulGotItemState = "MWSoulGotItemState_%s" #法宝特权领取物品奖励状态 参数特权ID
Def_PDict_MWSoulActiveState = "MWSoulActiveState_%s" #法宝之魂激活状态 参数(key编号)
Def_PDict_MWFBPassLevel = "MWFBPassLevel_%s" #法宝副本通关关卡 参数(法宝ID)
#炼丹炉
Def_PDict_AlchemyLV = "AlchemyLV" #炼丹等级
Def_PDict_AlchemyExp = "AlchemyExp" #炼丹经验
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/ChPyNetSendPack.py
@@ -12705,6 +12705,7 @@
                  ("LV", c_ubyte),    
                  ("Exp", c_int),    
                  ("State", c_ubyte),    #是否点击法宝认主
                  ("FBPassLV", c_ubyte),    #副本关卡
                  ]
    def __init__(self):
@@ -12721,6 +12722,7 @@
        self.LV = 0
        self.Exp = 0
        self.State = 0
        self.FBPassLV = 0
        return
    def GetLength(self):
@@ -12734,13 +12736,15 @@
                                MWID:%d,
                                LV:%d,
                                Exp:%d,
                                State:%d
                                State:%d,
                                FBPassLV:%d
                                '''\
                                %(
                                self.MWID,
                                self.LV,
                                self.Exp,
                                self.State
                                self.State,
                                self.FBPassLV
                                )
        return DumpString
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_MagicWeapon.py
@@ -28,7 +28,7 @@
import PlayerControl
import EventReport
import PlayerGoldGift
import PlayerMagicWeapon
#---副本配置对应key值---
(
@@ -48,7 +48,6 @@
DL_RefreshCD, # 刷新间隔
) = range(7)
#当前副本地图的状态
(
FB_Step_Open, # 副本开启
@@ -64,6 +63,8 @@
FBPlayerDict_NPCRemainCnt = 'FBPlayerDict_NPCRemainCnt_%s'   # NPC剩余数量
FBPlayerDict_TotalExp = 'FBPlayerDict_TotalExp'   # 获得的总经验
FBPlayerDict_TotalExpPoint = 'FBPlayerDict_TotalExpPoint'   # 获得的总经验点
FBPlayerDict_Level = 'FBPlayerDict_Level'  #关卡
FBPlayerDict_MaxLevel = 'FBPlayerDict_MaxLevel'  #最大关卡
##---获得副本配置---
@@ -77,13 +78,22 @@
def GetClearDevilNPCCfg(lineID):
    level = GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_Level)
    if level:
        ipyData = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'LineID':lineID, 'Level':level})
        if not ipyData:
            return []
        return ipyData.GetRefreshNPC()
    mapID = GameWorld.GetMap().GetMapID()
    return FBCommon.GetFBLineRefreshNPC(mapID, lineID)
def GetPointByNPCID(npcid):
    '''通过NPCID获取对应的积分'''
    npcPointDict = IpyGameDataPY.GetFuncEvalCfg('ClearDevilPoint', 2)
    return npcPointDict.get(npcid, 0)
def GetIsPointFBType(lineID):
    #是否积分类副本
@@ -91,6 +101,7 @@
    if not FBLineStepTimeCfg:
        return
    return FBLineStepTimeCfg[Def_IsPointType]
## 是否能够通过活动查询进入
#  @param curPlayer 玩家实例
@@ -132,11 +143,27 @@
    mapID = FBCommon.GetRecordMapID(mapID)
    gameFB = GameWorld.GetGameFB()
    lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine)
    GameWorld.DebugLog("DoEnterFB...lineID=%s,playerLV=%s" % (lineID, playerLV), playerID)
    level, maxLevel = 0, 0
    ipyDataList = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'LineID':lineID}, True)
    if ipyDataList:
        mwID = ipyDataList[0].GetMWID()
        level = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwID)
        maxLevel = ipyDataList[-1].GetLevel()
        if level >= maxLevel:
            GameWorld.Log('DoEnterFB 已通关该线路最大关卡!! lineID=%s, maxLevel=%s' % (lineID, maxLevel))
            PlayerControl.PlayerLeaveFB(curPlayer)
            return
        level +=1
    GameWorld.DebugLog("DoEnterFB...lineID=%s,playerLV=%s, level=%s" % (lineID, playerLV, level), playerID)
    hadDelTicket = FBCommon.GetHadDelTicket(curPlayer)
    if not hadDelTicket:
        gameFB.SetGameFBDict(FBPlayerDict_Level, level)
        gameFB.SetGameFBDict(FBPlayerDict_MaxLevel, maxLevel)
        FBCommon.SetHadDelTicket(curPlayer)
        FBCommon.SetFBPropertyMark(lineID)
        EventReport.WriteEvent_FB(curPlayer, mapID, 0, ChConfig.CME_Log_Start)
#        if mapID == ChConfig.Def_FBMapID_ClearDevil2:
#            # 新手剧情副本重置所有技能CD
@@ -153,7 +180,7 @@
        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_ReqFBMissionID, 0)
    if not hadDelTicket \
        and IpyGameDataPY.GetIpyGameDataByCondition("NPCShow", {"MapID":mapID, "LineID":lineID}, isLogNone=False):
        and IpyGameDataPY.GetIpyGameDataByCondition("NPCShow", {"MapID":mapID, "LineID":lineID}, isLogNone=False) and level == maxLevel:
        GameWorld.DebugLog("法宝挑战刚进入时不直接开始,需等前端通知开始才开始!", playerID) # 掉线重上强制开始
        return
    
@@ -173,6 +200,7 @@
    DoFBHelp(curPlayer, tick, not hadDelTicket)
    return
## 客户端发送开始副本
def OnClientStartFB(curPlayer, tick):
    gameFB = GameWorld.GetGameFB()
@@ -190,6 +218,7 @@
    DoFBHelp(curPlayer, tick, True)
    return
##玩家退出副本
# @param curPlayer 玩家实例
# @param tick 时间戳
@@ -201,12 +230,14 @@
#        GameWorldProcess.CloseFB(tick)
    return
##玩家主动离开副本.
# @param curPlayer 玩家实例
# @param tick 时间戳
# @return 返回值无意义
def DoPlayerLeaveFB(curPlayer, tick):
    return
## 获得副本帮助信息
#  @param curPlayer 当前玩家(被通知对象)
@@ -260,9 +291,11 @@
        __DoLogic_FB_Fighting(tick)
    # 副本结束
    elif fbStep == FB_Step_Over:
        pass
        __DoLogic_FB_Over(tick)
    
    return
## 副本准备逻辑
#  @param tick:时间戳
@@ -326,9 +359,10 @@
        return
    
    #副本关闭
    GameWorldProcess.CloseFB(tick)
    FBCommon.SetFBStep(FB_Step_Close, tick)
    #GameWorldProcess.CloseFB(tick)
    #FBCommon.SetFBStep(FB_Step_Close, tick)
    return
## 获得经验
#  @param curPlayer 当前玩家
@@ -351,11 +385,11 @@
    gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExp, updExp)
    gameFB.SetPlayerGameFBDict(playerID, FBPlayerDict_TotalExpPoint, updExpPoint)
    
    GameWorld.DebugLog("OnGetExp() totalExp=%s,addExp=%s,updTotalExp=%s" 
                       % (totalExp, addExp, updTotalExp), playerID)
    
    return
## 执行副本杀怪逻辑
#  @param curPlayer 杀怪的人
@@ -406,7 +440,14 @@
        if fbMissionID:
            EventShell.EventRespons_FBEvent(curPlayer, "cleardevil_pass_%s" % fbMissionID)
        # 成就
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PassWagicWeapon, 1, [lineID+1])
        level = gameFB.GetGameFBDictByKey(FBPlayerDict_Level)
        PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_PassWagicWeapon, 1, [lineID + 1, level])
        # 更新关卡
        if level:
            ipyData = IpyGameDataPY.GetIpyGameDataByCondition('MagicWeaponFB', {'LineID':lineID, 'Level':level})
            if ipyData:
                mwID = ipyData.GetMWID()
                PlayerMagicWeapon.UptateMWFBPasslv(curPlayer, mwID, level)
        
    
    DoFBHelp(curPlayer, tick)
@@ -440,11 +481,13 @@
    __SendOverInfo(curPlayer, awardDict)
    return
## 是否副本复活
#  @param None
#  @return 是否副本复活
def OnPlayerReborn():
    return True
##玩家死亡.
# @param curPlayer:死亡的玩家 
@@ -455,6 +498,7 @@
    __DoClearDevilOver(False)
    return
## 检查是否可攻击, 主判定不可攻击的情况,其他逻辑由外层决定
#  @param attacker 攻击方
#  @param defender 防守方
@@ -464,6 +508,36 @@
    if gameFB.GetFBStep() != Def_FightTime:
        return False
    return True
## 副本行为
#  @param curPlayer 玩家
#  @param actionType 行为类型
#  @param actionInfo 行为信息
#  @param tick 当前时间
#  @return None
def DoFBAction(curPlayer, actionType, actionInfo, tick):
    gameFB = GameWorld.GetGameFB()
    fbStep = gameFB.GetFBStep()
    if fbStep != FB_Step_Over:
        return
    level = gameFB.GetGameFBDictByKey(FBPlayerDict_Level)
    maxLevel = gameFB.GetGameFBDictByKey(FBPlayerDict_MaxLevel)
    if level <= 0 or maxLevel <= 0:
        return
    if level >= maxLevel:
        return
    gameFB.SetGameFBDict(FBPlayerDict_Level, level+1)
    playerID = curPlayer.GetID()
    FBCommon.SetFBStep(FB_Step_Open, tick)
    lineID = FBCommon.GetFBPropertyMark()
    if level+1 == maxLevel and IpyGameDataPY.GetIpyGameDataByCondition("NPCShow", {"MapID":ChConfig.Def_FBMapID_MagicWeapon, "LineID":lineID}, isLogNone=False):
        GameWorld.DebugLog(" 副本行为 法宝挑战刚进入时不直接开始,需等前端通知开始才开始!", playerID)  # 掉线重上强制开始
        return
    OnClientStartFB(curPlayer, tick)
    return
## 副本结束处理
def __DoClearDevilOver(isPass):
@@ -515,10 +589,12 @@
            PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FirstGoldTry, 0)
    return
## 发送挑战结果信息
def __SendOverInfo(curPlayer, overDict):
    overDict[FBCommon.Over_dataMapID] = FBCommon.GetRecordMapID(GameWorld.GetMap().GetMapID())
    overDict[FBCommon.Over_lineID] = FBCommon.GetFBPropertyMark()
    overDict[FBCommon.Over_wheel] = GameWorld.GetGameFB().GetGameFBDictByKey(FBPlayerDict_Level)
    GameWorld.DebugLog("__SendOverInfo overDict=%s" % (str(overDict)), curPlayer.GetPlayerID())
    FBCommon.Notify_FB_Over(curPlayer, overDict)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/IpyGameDataPY.py
@@ -1087,6 +1087,14 @@
                        ("dict", "AwardItem", 0),
                        ("char", "NotifyKey", 0),
                        ),
                "MagicWeaponFB":(
                        ("DWORD", "MWID", 1),
                        ("BYTE", "LineID", 0),
                        ("BYTE", "Level", 1),
                        ("list", "RefreshNPC", 0),
                        ("dict", "AttrDict", 0),
                        ),
                }
@@ -3303,6 +3311,23 @@
    def GetAwardItem(self): return self.AwardItem # 返利物品信息列表 {职业:[(物品ID,个数,是否绑定),...]}
    def GetNotifyKey(self): return self.NotifyKey # 全服广播key,默认两个参数(玩家名, 档位额度)
# 法宝副本表
class IPY_MagicWeaponFB():
    def __init__(self):
        self.MWID = 0
        self.LineID = 0
        self.Level = 0
        self.RefreshNPC = []
        self.AttrDict = {}
        return
    def GetMWID(self): return self.MWID # 法宝ID
    def GetLineID(self): return self.LineID # 副本功能线路ID
    def GetLevel(self): return self.Level # 关卡
    def GetRefreshNPC(self): return self.RefreshNPC # 刷怪配置
    def GetAttrDict(self): return self.AttrDict # 属性
def Log(msg, playerID=0, par=0):
    LogUI.Msg("%s\t%s\t%s" % (par, playerID, msg))
@@ -3529,6 +3554,8 @@
        self.ipyActTotalRechargeLen = len(self.ipyActTotalRechargeCache)
        self.ipyTotalRechargeTemplateCache = self.__LoadFileData("TotalRechargeTemplate", IPY_TotalRechargeTemplate)
        self.ipyTotalRechargeTemplateLen = len(self.ipyTotalRechargeTemplateCache)
        self.ipyMagicWeaponFBCache = self.__LoadFileData("MagicWeaponFB", IPY_MagicWeaponFB)
        self.ipyMagicWeaponFBLen = len(self.ipyMagicWeaponFBCache)
        Log("IPY_FuncConfig count=%s" % len(self.ipyFuncConfigDict))
        Log("IPY_DataMgr InitOK!")
        return
@@ -3897,6 +3924,8 @@
    def GetActTotalRechargeByIndex(self, index): return self.ipyActTotalRechargeCache[index]
    def GetTotalRechargeTemplateCount(self): return self.ipyTotalRechargeTemplateLen
    def GetTotalRechargeTemplateByIndex(self, index): return self.ipyTotalRechargeTemplateCache[index]
    def GetMagicWeaponFBCount(self): return self.ipyMagicWeaponFBLen
    def GetMagicWeaponFBByIndex(self, index): return self.ipyMagicWeaponFBCache[index]
IPYData = IPY_DataMgr()
def IPY_Data(): return IPYData
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerMagicWeapon.py
@@ -534,7 +534,12 @@
            for attid, attnum in IpyGameDataPY.GetFuncEvalCfg('MWSignDayAttr', 1, {}).items():
                addAttr[int(attid)] = attnum * totalSignNum
            GameWorld.AddDictValue(allAttrDict, addAttr)
        fbpasslv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % magicWeaponID)
        if fbpasslv: #副本关卡属性
            fbipyData = IpyGameDataPY.GetIpyGameData('MagicWeaponFB', magicWeaponID, fbpasslv)
            if fbipyData:
                attrDict = fbipyData.AttrDict()
                GameWorld.AddDictValue(allAttrDict, attrDict)
        
        for effID, value in allAttrDict.items():
            if treasureType == 1:
@@ -899,13 +904,15 @@
        mwLv = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponLV % mwID)
        curUpExp = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MagicWeaponUpExp % mwID)
        state = GetIsClickMagicWeapon(curPlayer, mwID)
        if not mwLv and not curUpExp and not state:
        FBPassLV = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_MWFBPassLevel % mwID)
        if not mwLv and not curUpExp and not state and not FBPassLV:
            continue
        pack = ChPyNetSendPack.tagMCMagicWeaponInfo()
        pack.MWID = mwID
        pack.LV = mwLv
        pack.Exp = curUpExp
        pack.State = state
        pack.FBPassLV = FBPassLV
        sendPack.InfoList.append(pack)
    sendPack.Count = len(sendPack.InfoList)
    if sendPack.Count:
@@ -1123,3 +1130,11 @@
        PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)
    PlayerControl.SetCalcAttrListValue(curPlayer, ChConfig.Def_CalcAttrFunc_MagicWeaponSoul, allAttrList)
    return
def UptateMWFBPasslv(curPlayer, mwID, passLV):
    GameWorld.Log('更新关卡 mwID=%s,level=%s'%(mwID, passLV))
    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_MWFBPassLevel % mwID, passLV)
    CalcMagicWeaponAttr(curPlayer)
    PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrState()
    Sycn_MagicWeaponLV(curPlayer, mwID)
    return