From f8f1c0464dd176b09b98e630f719f05ba1cb1557 Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期六, 22 六月 2019 10:26:58 +0800
Subject: [PATCH] 6603 【后端】【2.0】增加新版的sp和被动技能 - 签到刷坐骑属性

---
 ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py |  167 ++++++++++++++++++++++++++++++++-----------------------
 1 files changed, 96 insertions(+), 71 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
index c1fae3c..e35ab19 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/GameWorldLogic/GameWorldBoss.py
@@ -39,16 +39,18 @@
 import PlayerCompensation
 import IpyGameDataPY
 import PyGameDataStruct
+import CrossRealmPlayer
 import PyDataManager
 import PlayerControl
+import CrossRealmMsg
 import CommFunc
 import PyGameData
 import PlayerGeTui
 import IPY_GameServer
+import CrossBoss
+import PlayerFB
 
 import time
-
-
 
 '''
 ShareDefine.Def_UniversalGameRecType_BossInfo
@@ -101,12 +103,13 @@
     if bossID <= 0:
         return
     
-    # 设置不存活,击杀玩家名
-    killPlayerName = msgList[1]
-    hurtValue = msgList[2]
-    isAddKillCnt = msgList[3]
-    isNotify = msgList[4] if len(msgList) > 4 else True
-    mapID = msgList[5] if len(msgList) > 5 else None
+    bossID, killPlayerName, hurtValue, isNotify, mapID, realMapID, copyMapID, killerIDList = msgList
+    mapID = PlayerFB.GetRecordMapID(mapID)
+    if GameWorld.IsCrossServer():
+        CrossBoss.DoCrossBossOnKilled(bossID, killPlayerName, mapID, realMapID, copyMapID, killerIDList)
+        return
+    
+    isAddKillCnt = False
     
     isMapNeedShunt = IsMapNeedBossShunt(mapID)
     isAlive = __GetIsAlive(bossID)
@@ -156,11 +159,14 @@
     ## 世界boss状态变更
     if len(msgList) <= 0:
         return
-
-    bossID = msgList[0]
-    isAlive = msgList[1]
-    mapID = msgList[2] if len(msgList) > 2 else None
-    lineID = msgList[3] if len(msgList) > 3 else None
+    
+    bossID, isAlive, mapID, realMapID, copyMapID = msgList
+    mapID = PlayerFB.GetRecordMapID(mapID)
+    if GameWorld.IsCrossServer():
+        CrossBoss.DoCrossBossStateChange(bossID, isAlive, mapID, realMapID, copyMapID)
+        return
+    
+    lineID = copyMapID
     GameWorld.Log("世界boss状态变更: mapID=%s,lineID=%s,bossID=%s,state=%s,tick=%s" % (mapID, lineID, bossID, isAlive, tick))
     
     if bossID <= 0:
@@ -212,7 +218,7 @@
     recTypeListData = __GetBossPrizeRecData()
     # 查找是否已有记录
     bossRec = None
-    for index in range(recTypeListData.Count()):
+    for index in xrange(recTypeListData.Count()):
         universalRecData = recTypeListData.At(index)
         if universalRecData.GetValue1() == bossID:
             bossRec = universalRecData
@@ -317,7 +323,19 @@
 def OnQueryBossInfo(index, clientData, tick):
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     bossIDList = clientData.BossIDList
-    Sync_BossInfo(curPlayer, bossIDList)
+    if not bossIDList:
+        Sync_BossInfo(curPlayer)
+        CrossBoss.Sync_CrossBossInfo(curPlayer)
+        return
+    bossID = bossIDList[0]
+    ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossID)
+    if not ipyData:
+        return
+    mapID = ipyData.GetMapID()
+    if mapID in ChConfig.Def_CrossMapIDList:
+        CrossBoss.Sync_CrossBossInfo(curPlayer, bossIDList)
+    else:
+        Sync_BossInfo(curPlayer, bossIDList)
     return
 
 
@@ -332,12 +350,18 @@
     recTypeListData = __GetBossPrizeRecData()
     bossInfo.BossInfoList = []
     #GameWorld.DebugLog("Sync_BossInfo...count=%s,curTime=%s" % (recTypeListData.Count(), curTime))
-    for index in range(recTypeListData.Count()):
+    for index in xrange(recTypeListData.Count()):
         universalRecData = recTypeListData.At(index)
         bossID = universalRecData.GetValue1()
         if not bossID:
             continue
         if syncBOSSIDList and bossID not in syncBOSSIDList:
+            continue
+        ipyData = IpyGameDataPY.GetIpyGameData('BOSSInfo', bossID)
+        if not ipyData:
+            continue
+        mapID = ipyData.GetMapID()
+        if mapID in ChConfig.Def_CrossMapIDList:
             continue
         bossInfoObj = ChPyNetSendPack.tagBossInfoObj()
         bossInfoObj.BossID = bossID
@@ -359,7 +383,7 @@
     if not curPlayer:
         # 全服广播在线玩家
         playerManager = GameWorld.GetPlayerManager()
-        for i in range(0, playerManager.GetActivePlayerCount()):
+        for i in xrange(playerManager.GetActivePlayerCount()):
             curPlayer = playerManager.GetActivePlayerAt(i)
             if curPlayer == None or not curPlayer.GetInitOK():
                 continue
@@ -379,6 +403,9 @@
     if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossProcessTick, tick):
         #间隔未到 
         return
+    if GameWorld.IsCrossServer():
+        CrossBoss.DoCheckCrossBossReborn(tick)
+        return
     curTime = int(time.time())
     DoCheckWorldBossShuntInfo(curTime, tick)
     BossRebornWorldNotify(curTime)
@@ -386,6 +413,9 @@
         for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()):
             ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i)
             bossID = ipyData.GetNPCID()
+            mapID = ipyData.GetMapID()
+            if mapID in ChConfig.Def_CrossMapIDList:
+                continue
             bossPrizeRec = __GetBossRecDataByID(bossID)
             killedTime = bossPrizeRec.GetValue2()
             refreshTime = __GetBossRefreshTime(bossID)
@@ -426,7 +456,8 @@
     if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossGeTuiTick, tick):
         #间隔未到 
         return
-    
+    if GameWorld.IsCrossServer():
+        return
     curTime = int(time.time())
     for bossInfo in PyGameData.g_sortBOSSRefreshList:
         bossID, killedTime, refreshTime = bossInfo
@@ -459,18 +490,21 @@
     for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()):
         ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i)
         bossID = ipyData.GetNPCID()
+        mapID = ipyData.GetMapID()
+        if mapID in ChConfig.Def_CrossMapIDList:
+            continue
         isAlive = __GetIsAlive(bossID)
         if not isAlive:
             continue
-        mapID = ipyData.GetMapID()
-        if mapID != ChConfig.Def_FBMapID_SealDemon:
-            GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1)
+        #if mapID not in ChConfig.WorldBossFBMapIDList:
+        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_GameWorldBossReborn % bossID, 1)
     return
 
 ## 玩家登录通知
 #  @param curPlayer
 #  @return None
 def OnPlayerLogin(curPlayer):
+    CrossBoss.OnPlayerLogin(curPlayer)
     Sync_BossInfo(curPlayer)
     PyDataManager.GetBossAttentionManager().NotifyBossAttentionInfo(curPlayer)
     if IsMapNeedBossShunt(0):
@@ -480,22 +514,20 @@
     state = gameWorld.GetDictByKey(ChConfig.Def_WorldKey_OperationActionState % ShareDefine.OperationActionName_BossReborn)
     if state:
         Sync_BossRebornPoint(curPlayer)
-    Sync_DogzNPCRefreshTime(curPlayer)
     return
 
 ## 地图启动ok通知
 #  @param None
 #  @return None
 def OnMapServerInitOK():
+    if GameWorld.IsCrossServer():
+        CrossBoss.OnCrossMapServerInitOK()
+        return
     SendMapServerBossKilledCnt()
     __SendMapServerAliveBoss()
     if IsMapNeedBossShunt(0):
         GameWorld.SendCommMapServerMsg(ShareDefine.Def_Notify_WorldKey_BossShuntPlayer, PyGameData.g_bossShuntPlayerInfo)
         GameWorld.SendCommMapServerMsg(ShareDefine.Def_Notify_WorldKey_BossShuntLineState, PyGameData.g_bossShuntLineState)
-    #通知一个参数
-    bossID = IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2)
-    onlineCnt = __GetBossOnlineHeroCnt(bossID)[0]
-    GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt % bossID, onlineCnt)
     
     #仙盟击杀骑宠boss数
     if PyGameData.g_familyKillHorsePetRobBossCntDict:
@@ -505,16 +537,37 @@
 
 ##--------------------------------------------------------------------------------------------------
 
+def CrossServerMsg_DropGoodItem(msgList, tick):
+    ## 收到跨服服务器同步的掉落好物品信息
+    playerID = msgList[0]
+    curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
+    if curPlayer:
+        msgList[1] = curPlayer.GetName() # 本服玩家在线,修改为本服玩家的名字展示
+    OnKillBossDropGoodItem(msgList, tick)
+    return
+
 def OnKillBossDropGoodItem(msgList, tick):
     # playerName, mapID, npcID, itemID, userData
-    if len(msgList) != 7:
+    if len(msgList) != 10:
         return
-    playerID, killerName, mapID, npcID, itemID, userData, weightValue = msgList
-    GameWorld.DebugLog("击杀Boss掉落好物品: mapID=%s,npcID=%s,killerName=%s,itemID=%s, userData=%s, weightValue=%s" 
-                       % (mapID, npcID, killerName, itemID, userData, weightValue))
+    playerID, killerName, mapID, lineID, npcID, itemID, userData, weightValue, serverGroupID, playerLV = msgList
+    GameWorld.DebugLog("击杀Boss掉落好物品: mapID=%s,npcID=%s,killerName=%s,itemID=%s, userData=%s, weightValue=%s, serverGroupID=%s" 
+                       % (mapID, npcID, killerName, itemID, userData, weightValue, serverGroupID))
     maxRecordCnt = IpyGameDataPY.GetFuncCfg('DropRecordNum')
     if not maxRecordCnt:
         return
+    
+    if GameWorld.IsCrossServer():
+        # 同步到玩家对应子服
+        if not serverGroupID:
+            return
+        zoneIpyData = CrossRealmPlayer.GetCrossZoneIpyDataByServerGroupID(mapID, serverGroupID)
+        if not zoneIpyData:
+            return
+        serverGroupIDList = zoneIpyData.GetServerGroupIDList()
+        CrossRealmMsg.SendMsgToClientServer(ShareDefine.CrossServerMsg_DropGoodItem, msgList, serverGroupIDList)
+        return
+    
     recType = ShareDefine.Def_UniversalGameRecType_BossDropGoodItemInfo
     universalRecMgr = GameWorld.GetUniversalRecMgr()
     recordList = universalRecMgr.GetTypeList(recType)
@@ -542,8 +595,11 @@
             if commonList and commonList[0][0] != -1:
                 recordList.Delete(commonList[0][0])
         
-    PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID, npcID, itemID, playerID, weightValue],
-                                                      [killerName, "", userData])
+    PlayerUniversalGameRec.MapServer_UniversalGameRec(None, recType, [mapID*100+lineID, npcID, itemID, playerID, weightValue],
+                                                      [killerName, '%s|%s'%(serverGroupID, playerLV), userData])
+    
+    msgList = [killerName, playerID, mapID, npcID, itemID, userData, serverGroupID, playerLV, lineID]
+    PlayerControl.WorldNotify(0, 'DropRecord' , msgList)
     return
 
 
@@ -555,11 +611,16 @@
     if not GameWorld.SetWorldDictKey(ChConfig.TYPE_WorldBossOnlineCntTick, tick):
         #间隔未到 
         return
+    if GameWorld.IsCrossServer():
+        return
     GameWorld.DebugLog('世界boss在线人数统计')
     bossRebornDict = {}
     for i in xrange(IpyGameDataPY.IPY_Data().GetBOSSInfoCount()):
         ipyData = IpyGameDataPY.IPY_Data().GetBOSSInfoByIndex(i)
         bossID = ipyData.GetNPCID()
+        mapID = ipyData.GetMapID()
+        if mapID in ChConfig.Def_CrossMapIDList:
+            continue
         refreshTimeStr = ipyData.GetRefreshTime()
         if 'onlineCnt' in refreshTimeStr:
             bossRebornDict[bossID] = ipyData.GetLVLimit()
@@ -605,8 +666,6 @@
     
     newNum = newOnlieCnt * 100 + unUpdataCnt
     PlayerDBGSEvent.SetDBGSTrig_ByKey(ShareDefine.Def_Notify_WorldKey_GameWorldBossOnlineCnt % bossid, newNum)
-    if bossid == IpyGameDataPY.GetFuncCfg('DogzFBRefreshCfg', 2):
-        GameWorld.SendMapServerMsgEx(ShareDefine.Def_Notify_WorldKey_BossOnlineHeroCnt % bossid, newOnlieCnt)
     GameWorld.DebugLog("设置计算boss刷新时间用的在线人数 Change:bossid=%s, beforeOnlineCnt = %s, newOnlieCnt = %s, unUpdataCnt=%s" % (bossid, beforeOnlineCnt, newOnlieCnt, unUpdataCnt))
     return
 
@@ -669,6 +728,7 @@
     def GetBossAttentionDict(self):
         return self.bossAttentionDict
 
+    # RecordData改json记录 bossid存为字符串
     def UpdateBossAttention(self, playerid, bossid, isAdd):
         if playerid in self.bossAttentionDict:
             bossAttentionData = self.bossAttentionDict[playerid]
@@ -710,7 +770,7 @@
         packData.BossList = []
         for bossid, addState in bttentionDict.items():
             bossInfo = ChPyNetSendPack.tagGCBossAttention()
-            bossInfo.BossID=bossid
+            bossInfo.BossID=int(bossid)
             bossInfo.AddState=addState
             packData.BossList.append(bossInfo)
         
@@ -742,10 +802,7 @@
             data.clear()
             pos += data.readData(datas, pos, dataslen)
             playerID = data.PlayerID
-            if type(eval(data.RecordData)) != list:
-                self.bossAttentionDict[playerID] = data
-            else:
-                data.clear()
+            self.bossAttentionDict[playerID] = data
             
         return pos
 
@@ -1030,38 +1087,6 @@
     packData.RebornCnt = PlayerDBGSEvent.GetDBGSTrig_ByKey(PlayerDBGSEvent.Def_BossRebornCnt)
     playerManager = GameWorld.GetPlayerManager()
     if not curPlayer:
-        for i in xrange(playerManager.GetActivePlayerCount()):
-            curPlayer = playerManager.GetActivePlayerAt(i)
-            if curPlayer == None or not curPlayer.GetInitOK():
-                continue
-            if PlayerControl.GetIsTJG(curPlayer):
-                continue
-            NetPackCommon.SendFakePack(curPlayer, packData)
-    else:
-        if PlayerControl.GetIsTJG(curPlayer):
-            return
-        NetPackCommon.SendFakePack(curPlayer, packData)
-    return
-
-def Sync_DogzNPCRefreshTime(curPlayer=None):
-    #同步神兽副本NPC刷新时间
-    refreshTimeDict = PyGameData.g_dogzNPCRefreshTimeDict
-
-    if not refreshTimeDict:
-        return
-    curTime = int(time.time())
-    packData = ChPyNetSendPack.tagGCDogzNPCRefreshTime()
-    packData.InfoList=[]
-    for npcid, timeinfo in refreshTimeDict.items():
-        lastRefreshTime, nextNeedTime = timeinfo
-        remainTime = max(0, nextNeedTime - curTime + lastRefreshTime)
-        timeInfo = ChPyNetSendPack.tagDogzTimeInfoObj()
-        timeInfo.NPCID = npcid
-        timeInfo.RefreshSecond = remainTime
-        packData.InfoList.append(timeInfo)
-    packData.Cnt = len(packData.InfoList)
-    if not curPlayer:
-        playerManager = GameWorld.GetPlayerManager()
         for i in xrange(playerManager.GetActivePlayerCount()):
             curPlayer = playerManager.GetActivePlayerAt(i)
             if curPlayer == None or not curPlayer.GetInitOK():

--
Gitblit v1.8.0