From 2417ef936a8a12b8528a1216a6f9233e2beb8aa6 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 14 一月 2019 17:02:07 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(增加封包C1 06 跨服NPC对话 #tagCMCrossNPCTalk)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py |   91 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 75 insertions(+), 16 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
index 801bb41..9b8a408 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/FBCommon.py
@@ -63,6 +63,13 @@
 Help_score = 'score' #已获得积分
 Help_grade = 'grade' #评级(5-S,4-A,3-B,2-C,1-D)
 Help_leaderID = 'leaderID' #渡劫玩家ID
+Help_isHelp = 'isHelp' #本次是否是助战
+Help_helpCount = 'helpCount' #该副本今日已助战次数
+Help_relation = 'relation' #该副本关系加成信息 [优先关系, 总加成]
+Help_robotJob = 'robotJob' #机器人职业 {"ObjID":job, ...}
+Help_isAuto = 'isAuto' #是否自动召唤
+Help_hasRefreshBoss = 'hasRefreshBoss' #是否已刷新boss
+Help_gsItemInfo = 'gsItemInfo' #聚魂副本物品信息 {"波数":[[{"ItemID":101, "ItemCount":10}]]}
 
 #副本结算信息通用key
 Over_dataMapID = 'dataMapID' #数据地图ID
@@ -87,6 +94,7 @@
 Over_enterLV = 'enterLV' #进入时等级
 Over_leaderID = 'leaderID' #渡劫玩家ID
 Over_xianyuanCoin = 'xianyuanCoin' #获得仙缘币信息 [获得仙缘币数, 没有获得的原因] 原因: 1-达到助战次数上限,2-达到每日获得仙缘币上限
+Over_helpPlayer = 'helpPlayer' #助战玩家信息 {"玩家ID":{玩家信息key:value, ...}, ...}
 
 #副本行为
 (
@@ -164,19 +172,12 @@
             return ShareDefine.EntFBAskRet_FBClose
         
         #进入次数判断
-        maxTimes = fbIpyData.GetDayTimes()
-        helpPoint = fbIpyData.GetHelpPoint()
-        if maxTimes and not helpPoint and mapID not in ChConfig.Def_NoLimitEnterCntMap:
-            enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
-            maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
-            if enterCnt + reqEnterCnt > maxCnt:
-                GameWorld.Log("已达到当日最大进入次数!mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
-                              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
-                if isNotify:
-                    PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_268121", [mapID])
-                return ShareDefine.EntFBAskRet_NoEnterCnt
-            
-            # 周今日次数暂不做,待扩展...
+        canEnter, notifyMark = __CheckCanEnterFBByTime(curPlayer, mapID, fbIpyData, reqEnterCnt, isTeamAsk)
+        if not canEnter:
+            if notifyMark:
+                PlayerControl.NotifyCode(curPlayer, notifyMark, [mapID])
+            return ShareDefine.EntFBAskRet_NoEnterCnt
+        
         #进入CD判断
         if CheckIsEnterCD(curPlayer, mapID):
             if isNotify:
@@ -217,6 +218,50 @@
             return ShareDefine.EntFBAskRet_NoTicket
         
     return ShareDefine.EntFBAskRet_OK
+
+def __CheckCanEnterFBByTime(curPlayer, mapID, fbIpyData, reqEnterCnt, isTeamAsk):
+    #进入次数判断
+    maxTimes = fbIpyData.GetDayTimes()
+    if not maxTimes:
+        return True, ""
+    
+    #playerID = curPlayer.GetPlayerID()
+    enterCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_EnterFbCntDay % mapID)
+    maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
+    if enterCnt + reqEnterCnt <= maxCnt:
+        return True, ""
+    
+    ### 以下是到达次数上限后的处理
+    fbType = GameWorld.GetMap().GetMapFBTypeByMapID(mapID)
+    
+    # 单人副本达到次数后不可再进入
+    if fbType == IPY_GameWorld.fbtSingle:
+        #GameWorld.Log("已达到当日最大进入次数!单人副本 mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+        #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+        return False, "GeRen_chenxin_268121"
+    
+    # 组队副本
+    if fbType == IPY_GameWorld.fbtTeam:
+        # 无助战的不可再进入
+        if not fbIpyData.GetHelpPoint():
+            #GameWorld.Log("已达到当日最大进入次数!组队副本 mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+            #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+            return False, "GeRen_chenxin_268121"
+        
+        # 可助战的不可单人进入助战,可发起匹配
+        if not isTeamAsk and (not curPlayer.GetTeamID() or curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_TeamMemCount) <= 1):
+            #GameWorld.Log("已达到当日最大进入次数!组队副本不可单人助战! mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+            #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+            return False, "TeamSingleEnter"
+        
+    elif mapID not in ChConfig.Def_NoLimitEnterCntMap:
+        #GameWorld.Log("已达到当日最大进入次数! mapID=%s,enterCnt=%s,reqEnterCnt=%s,maxTimes=%s,maxCnt=%s" 
+        #              % (mapID, enterCnt, reqEnterCnt, maxTimes, maxCnt), playerID)
+        return False, "GeRen_chenxin_268121"
+    
+    # 周进入次数暂不做,待扩展...
+    
+    return True, ""
 
 ## 获取副本进入门票信息
 #  @param curPlayer 玩家实例
@@ -331,6 +376,17 @@
     gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMaxLV, maxLV)
     GameWorld.Log("NPC成长动态等级变更: isLeave=%s,totalLV=%s,playerCnt=%s,averageLV=%s,maxLV=%s" 
                   % (isLeave, totalLV, playerCnt, averageLV, maxLV), playerID)
+    # 上古战场特殊处理
+    if mapID == ChConfig.Def_FBMapID_ElderBattlefield:
+        lineID = GameWorld.GetGameWorld().GetPropertyID() - 1
+        fbLineIpyData = GetFBLineIpyData(mapID, lineID)
+        lvLimitMin = 0 if not fbLineIpyData else fbLineIpyData.GetLVLimitMin()
+        robotLVDiff = IpyGameDataPY.GetFuncCfg("ElderBattlefieldCfg", 5)
+        robotLVMin, robotLVMax = averageLV - robotLVDiff, averageLV
+        robotLVMin = max(lvLimitMin, robotLVMin)
+        gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMaxLV, robotLVMax)
+        gameFB.SetGameFBDict(ChConfig.Def_FB_NPCStrengthenMinLV, robotLVMin)
+        GameWorld.Log("    更新上古机器人等级范围: lineID=%s,robotLVDiff=%s,robotLV=(%s~%s)" % (lineID, robotLVDiff, robotLVMin, robotLVMax))
     return True
 
 def UpdFBLineNPCStrengthenPlayerCnt(playerID, isLeave):
@@ -574,7 +630,7 @@
 #---------------------------------------------------------------------
 def SyncDynamicBarrierState(barrierPointList, state, curPlayer=None):
     '''同步动态障碍物是否有效性
-    @param barrierPointList: 障碍物点列表 [[aPosX,aPosY,bPosX,bPosY], [aPosX,aPosY,bPosX,bPosY], ...]
+    @param barrierPointList: 障碍物点列表 [[aPosX,aPosY,bPosX,bPosY,angle可选], [aPosX,aPosY,bPosX,bPosY,angle可选], ...]
     @param state: 是否有效
     @param curPlayer: 指定通知目标玩家,为None时广播本地图所有玩家
     '''
@@ -582,12 +638,15 @@
     barrierStatePack.Clear()
     barrierStatePack.State = state
     barrierStatePack.BarrierList = []
-    for aPosX, aPosY, bPosX, bPosY in barrierPointList:
+    for posInfo in barrierPointList:
+        aPosX, aPosY, bPosX, bPosY = posInfo[:4]
+        angle = posInfo[4] if len(posInfo) > 4 else 0
         barrier = ChPyNetSendPack.tagMCDynamicBarrier()
         barrier.APosX = aPosX
         barrier.APosY = aPosY
         barrier.BPosX = bPosX
         barrier.BPosY = bPosY
+        barrier.Angle = angle
         barrierStatePack.BarrierList.append(barrier)
     barrierStatePack.Count = len(barrierStatePack.BarrierList)
     if curPlayer:
@@ -1697,7 +1756,7 @@
     maxDayTimes = ipyData.GetDayTimes()
     maxCnt = GetEnterFBMaxCnt(curPlayer, mapID)
     enterCnt = GetEnterFBCount(curPlayer, mapID)
-    if maxDayTimes and maxCnt - enterCnt >= maxDayTimes:
+    if mapID == ChConfig.Def_FBMapID_SealDemon and maxDayTimes and maxCnt - enterCnt >= maxDayTimes:
         GameWorld.DebugLog('当前次数已满,无需购买。。')
         return
     if hasBuyCnt >= canBuyCnt:

--
Gitblit v1.8.0