From 73b55c6865b24648ed53ed3b6092eda82342f368 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期一, 07 一月 2019 09:55:37 +0800
Subject: [PATCH] 5722 【后端】【1.5】跨服BOSS开发(进入跨服相关封包)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py |  162 ++++++++++++++++++++++++++---------------------------
 1 files changed, 80 insertions(+), 82 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
index 6287537..f0bf6af 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerControl.py
@@ -82,6 +82,7 @@
 import PlayerFamilyTech
 import PlayerCostRebate
 import PlayerFairyCeremony
+import PlayerCrossRealmPK
 import FunctionNPCCommon
 import CrossRealmPlayer
 import ChNetSendPack
@@ -1564,72 +1565,6 @@
 
 #---------------------------------------------------------------------
 
-def ResetMergeFBPlayerCntInfo(resetMapID):
-    # 重置跨服活动副本地图人数分配情况信息
-    mapID = GameWorld.GetMap().GetMapID()
-    if mapID != ChConfig.Def_MergeTransMapID:
-        return
-    GameWorld.Log("重置跨服活动副本地图人数分配情况信息: resetMapID=%s" % resetMapID)
-    gameWorld = GameWorld.GetGameWorld()
-    mergeFBPlayerCntDict = ReadChConfig.GetEvalChConfig("MergeFBPlayerCount")
-    for reqMapID, mapInfo in mergeFBPlayerCntDict.items():
-        if resetMapID and resetMapID != reqMapID:
-            continue
-        for playerMapID in mapInfo[1]:
-            playerCnt = gameWorld.GetGameWorldDictByKey(ChConfig.Map_WorldKey_MergeFBMapPlayerCnt % playerMapID)
-            for num in xrange(1, 1 + playerCnt):
-                playerID = gameWorld.GetGameWorldDictByKey(ChConfig.Map_WorldKey_MergeFBMapPlayerID % (playerMapID, num))
-                gameWorld.SetGameWorldDict(ChConfig.Map_WorldKey_MergeFBMapPlayerID % (playerMapID, num), 0) # 重置对应的玩家ID
-                gameWorld.SetGameWorldDict(ChConfig.Map_WorldKey_MergeFBPlayerMapID % (reqMapID, playerID), 0) # 重置玩家ID对应的地图
-            gameWorld.SetGameWorldDict(ChConfig.Map_WorldKey_MergeFBMapPlayerCnt % playerMapID, 0) # 重置地图人数
-    return
-
-def __GetMergeFBPlayerMapID(curPlayer, reqMapID):
-    # 获取玩家所分配的跨服活动地图ID
-    # @param reqMapID: 可以是本服活动的地图ID标识; 也可以是指定的跨服活动地图ID, 如果是指定的地图ID也是直接返回
-    
-    mergeFBPlayerCntDict = ReadChConfig.GetEvalChConfig("MergeFBPlayerCount")
-    if reqMapID not in mergeFBPlayerCntDict:
-        return reqMapID
-    
-    playerID = curPlayer.GetPlayerID()
-    gameWorld = GameWorld.GetGameWorld()
-    
-    playerMapID = gameWorld.GetGameWorldDictByKey(ChConfig.Map_WorldKey_MergeFBPlayerMapID % (reqMapID, playerID))
-    if playerMapID:
-        GameWorld.DebugLog("已经有分配跨服活动地图,直接返回!playerMapID=%s" % (playerMapID), playerID)
-        return playerMapID
-    
-    # 还没分配该玩家, 则开始选择分配的地图ID
-    maxPlayerCnt, mapIDList = mergeFBPlayerCntDict[reqMapID]
-    minPlayerCount = 0 # 最少的地图玩家人数
-    minPlayerMapID = 0 # 最少人数的地图ID
-    for mID in mapIDList:
-        curMapPlayerCnt = gameWorld.GetGameWorldDictByKey(ChConfig.Map_WorldKey_MergeFBMapPlayerCnt % mID)
-        if curMapPlayerCnt < maxPlayerCnt:
-            playerMapID = mID
-            break
-        
-        # 保存最少人数的地图ID信息
-        if not minPlayerCount or (minPlayerCount and curMapPlayerCnt < minPlayerCount):
-            minPlayerCount = curMapPlayerCnt
-            minPlayerMapID = mID
-    
-    # 如果没有人数未满的活动地图,则分配到人数较少的地图
-    if not playerMapID:
-        playerMapID = minPlayerMapID
-        
-    # 更新分配信息
-    if playerMapID:
-        mapPlayerCnt = gameWorld.GetGameWorldDictByKey(ChConfig.Map_WorldKey_MergeFBMapPlayerCnt % playerMapID) + 1
-        gameWorld.SetGameWorldDict(ChConfig.Map_WorldKey_MergeFBMapPlayerCnt % playerMapID, mapPlayerCnt)
-        gameWorld.SetGameWorldDict(ChConfig.Map_WorldKey_MergeFBMapPlayerID % (playerMapID, mapPlayerCnt), playerID)
-        gameWorld.SetGameWorldDict(ChConfig.Map_WorldKey_MergeFBPlayerMapID % (reqMapID, playerID), playerMapID)
-        GameWorld.Log("分配跨服活动玩家所属地图: plaeyrID=%s,reqMapID=%s,分配MapID=%s,mapPlayerCnt=%s" 
-                      % (playerID, reqMapID, playerMapID, mapPlayerCnt))
-        
-    return playerMapID
-
 ##玩家进入副本
 # @param curPlayer 玩家实例
 # @param mapID 地图ID
@@ -1648,13 +1583,13 @@
     #        NotifyCode(curPlayer, 'jiazu_xyj_671654')
     #        return
         
-    #跨服活动人数分流处理
-    if GameWorld.IsCrossServer():
-        reqMapID = mapID
-        mapID = __GetMergeFBPlayerMapID(curPlayer, reqMapID)
-        if not mapID:
-            GameWorld.ErrLog("找不到可分配进入的跨服活动地图ID! reqMapID=%s" % reqMapID)
-            return
+#    #跨服活动人数分流处理
+#    if GameWorld.IsCrossServer():
+#        reqMapID = mapID
+#        mapID = __GetMergeFBPlayerMapID(curPlayer, reqMapID)
+#        if not mapID:
+#            GameWorld.ErrLog("找不到可分配进入的跨服活动地图ID! reqMapID=%s" % reqMapID)
+#            return
       
     #过滤封包地图ID
     if not GameWorld.GetMap().IsMapIDExist(mapID):
@@ -1779,6 +1714,12 @@
         if isNotify:
             NotifyCode(curPlayer, "SingleEnterPK", [mapID])
         return ShareDefine.EntFBAskRet_PKState
+    
+    ## 跨服PK匹配中
+    if PlayerCrossRealmPK.GetIsCrossPKMatching(curPlayer):
+        if isNotify:
+            NotifyCode(curPlayer, "CrossMatching8", [mapID])            
+        return ShareDefine.EntFBAskRet_CrossPKMatching
     
     #===============================================================================================
     # # 这里不做状态限制,由前端处理,因为策划要根据界面来处理,同一传送功能有可能在不同界面
@@ -2003,16 +1944,18 @@
     sendPack.FuncLineID = funcLineID
     
     NetPackCommon.SendFakePack(curPlayer, sendPack)
+    GameWorld.Log("准备切换地图", curPlayer.GetID())
     return
 
 # 通知开始切换地图
 def NotifyStartChangeMap(curPlayer):
-    GameWorld.DebugLog("通知开始切换地图, NotifyStartChangeMap")
     sendPack = ChPyNetSendPack.tagMCStartChangeMap()
     sendPack.Clear()
     sendPack.MapID = curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_ChangeMapID)
     sendPack.FuncLineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine)
     NetPackCommon.SendFakePack(curPlayer, sendPack)
+    
+    GameWorld.Log("通知开始切换地图", curPlayer.GetID())
     return
 
 #---------------------------------------------------------------------
@@ -3372,22 +3315,57 @@
     
     return int(addPoint)
 
+def GetAllPointByLV(curPlayer):
+    ##获取当前等级可得到属性点数
+    openLV = GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_AddPoint)
+    curLV = curPlayer.GetLV()
+    if curLV < openLV:
+        return 0
+    addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {})
+    initFreePoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 2)
+    setFreePoint = initFreePoint
+    for lv in xrange(openLV, curLV+1):
+        setFreePoint += GameWorld.GetDictValueByRangeKey(addPointDict, lv, 0)
+    return setFreePoint
+
 def DoAddPointOpen(curPlayer):
     '''加点功能开启 处理给自由属性点及老号处理  
                     清除老服玩家未加点的点数(清零),以前加的加点属性不清除,属性不变,战力不减, 根据最新的加点开启等级和老服玩家的当前等级,相差的差值给予玩家对应的加点点数'''
     beforeFreePoint = curPlayer.GetFreePoint()
-    addPointDict = IpyGameDataPY.GetFuncEvalCfg("LVUPAddPoint", 1, {})
-    initFreePoint = IpyGameDataPY.GetFuncCfg("LVUPAddPoint", 2)
-    openLV = GameFuncComm.GetFuncLimitLV(ShareDefine.GameFuncID_AddPoint)
-    setFreePoint = initFreePoint
+
+    setFreePoint = GetAllPointByLV(curPlayer)
     curLV = curPlayer.GetLV()
-    for lv in xrange(openLV, curLV+1):
-        setFreePoint += GameWorld.GetDictValueByRangeKey(addPointDict, lv, 0)
     addDataDict = {'beforeFreePoint':beforeFreePoint}
-    DataRecordPack.DR_Freepoint(curPlayer, "AddPointOpen", setFreePoint, addDataDict)
     curPlayer.SetFreePoint(setFreePoint)
+    DataRecordPack.DR_Freepoint(curPlayer, "AddPointOpen", setFreePoint, addDataDict)
     GameWorld.DebugLog('    加点功能开启处理  beforeFreePoint=%s,curLV=%s, setFreePoint=%s'%(beforeFreePoint, curLV, setFreePoint), curPlayer.GetID())
     return
+
+def FixOldAddPoint(curPlayer):
+    ##老号加点处理 重置已加点数,
+    if GameWorld.GetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_AddPoint):
+        return
+    GameWorld.SetDictValueByBit(curPlayer, ChConfig.Def_Player_Dict_VersionFix, ChConfig.Def_VerFix_AddPoint, 1)
+    baseSTR, basePNE, basePHY, baseCON = GetPlayerBasePoint(curPlayer.GetJob())
+    addPoint = curPlayer.GetFreePoint()
+    attrInfoDict = {'BaseSTR':baseSTR,'BasePNE':basePNE,'BasePHY':basePHY,'BaseCON':baseCON}
+    for attrKey, basePoint in attrInfoDict.items():
+        addPoint += (getattr(curPlayer, 'Get%s'%attrKey)() - basePoint)
+    fixFreePoint = GetAllPointByLV(curPlayer)
+    if addPoint != fixFreePoint:
+        for attrKey, basePoint in attrInfoDict.items():
+            getattr(curPlayer, 'Set%s'%attrKey)(basePoint)
+        curPlayer.SetFreePoint(fixFreePoint)
+        #重置天赋
+        PlayerGreatMaster.DoResetMasterSkillPoint(curPlayer)
+        #邮件补偿
+        SendMailByKey('PointCompensation', [curPlayer.GetID()], [], goldPaper=200)
+        
+        addDataDict = {'beforeTotalPoint':addPoint}
+        DataRecordPack.DR_Freepoint(curPlayer, "FixOldAddPoint", fixFreePoint, addDataDict)
+        GameWorld.Log('老号加点处理 重置已加点数 addPoint=%s, fixFreePoint=%s' % (addPoint, fixFreePoint))
+    return
+    
 #---------------------------------------------------------------------
 
 ## 功能模块战斗力类
@@ -5732,6 +5710,21 @@
 def GetChatBubbleBox(curPlayer): return curPlayer.GetExAttr10()
 def SetChatBubbleBox(curPlayer, value): return curPlayer.SetExAttr10(value, False, True)
 
+## 玩家所属服务器组ID
+def GetPlayerServerGroupID(curPlayer): return curPlayer.GetExAttr13()
+def UpdPlayerServerGroupID(curPlayer):
+    # 更新自己的服务器组ID, 跨服服务器不处理
+    if GameWorld.IsCrossServer():
+        return
+    serverGroupID = GameWorld.GetServerGroupID()
+    if not serverGroupID:
+        return
+    playerServerGroupID = curPlayer.GetExAttr13()
+    if playerServerGroupID != serverGroupID:
+        curPlayer.SetExAttr13(serverGroupID, False, True)
+        GameWorld.DebugLog("更新玩家所属服务器组ID: serverGroupID=%s" % serverGroupID)
+    return
+
 ##获得玩家威望值
 def GetPrestige(curPlayer): return 0
 def SetPrestige(curPlayer, value): return
@@ -6503,7 +6496,12 @@
     
 #---当前防护值,需存DB----
 def GetProDef(curPlayer): return curPlayer.GetExAttr4()
-def SetProDef(curPlayer, value): curPlayer.SetExAttr4(value)
+def SetProDef(curPlayer, value):
+    if GameWorld.IsCrossServer():
+        curPlayer.SetExAttr4(value, True) # 跨服服务器需要广播周围玩家
+    else:
+        curPlayer.SetExAttr4(value)
+    
 #---最大防护值----
 def GetMaxProDef(curPlayer): return curPlayer.GetDictByKey(ChConfig.Def_PlayerKey_AttrMaxProDef)
 def SetMaxProDef(curPlayer, value):

--
Gitblit v1.8.0