From 6a875d29696c5625a779a379b0de523b2383d7ef Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期四, 28 十一月 2024 16:41:11 +0800
Subject: [PATCH] 10312 【越南】【英文】【bt】【砍树】查看跨服玩家数据向对应子服查询

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py |   53 +++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
index 468be9f..769946e 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerViewCacheTube.py
@@ -29,8 +29,6 @@
 import IpyGameDataPY
 import PlayerHorse
 import ChEquip
-import FBCommon
-import BossHurtMng
 import ItemCommon
 import PyGameData
 import PlayerTJG
@@ -81,18 +79,50 @@
     #GameWorld.DebugLog("packData=%s %s %s" % (type(packData), len(packData), packData), playerID)
     return packData
 
+def UpdPackDataSyncState(curPlayer, msgData):
+    ## 更新打包数据同步状态,这里只更新状态即可,具体同步由定时同步处理
+    syncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
+    updSyncState = syncState
+    if msgData.get("PackData"):
+        updSyncState = GameWorld.SetBitValue(updSyncState, 0, 1)
+    if msgData.get("PackDataCross"):
+        updSyncState = GameWorld.SetBitValue(updSyncState, 1, 1)
+    if msgData.get("ViewCacheCross"):
+        updSyncState = GameWorld.SetBitValue(updSyncState, 2, 1)
+    if syncState == updSyncState:
+        return
+    PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_PackDataSyncState, updSyncState)
+    GameWorld.DebugLog("更新打包数据同步状态: msgData=%s,syncState=%s,updSyncState=%s" 
+                       % (msgData, syncState, updSyncState), curPlayer.GetPlayerID())
+    return
+
+def SetPackDataSyncState(curPlayer): UpdPackDataSyncState(curPlayer, {"PackData":1})
+def SetPackDataCrossSyncState(curPlayer): UpdPackDataSyncState(curPlayer, {"PackDataCross":1})
+def SetViewCacheCrossSyncState(curPlayer): UpdPackDataSyncState(curPlayer, {"ViewCacheCross":1})
 
 ##更新玩家当前详细信息到GameServer
 #  @param curPlayer, tick
 #  @return None
-def UpdateGameServerPlayerCache(curPlayer, tick, IsLogouting=False, forcePackData=False, packMsg=None):
+def UpdateGameServerPlayerCache(curPlayer, tick, IsLogouting=False, forcePackData=False, packMsg=None, isOnlyViewCache=False):
     if PlayerTJG.GetIsTJG(curPlayer):
         # 脱机不处理
         return
     curPlayer.SetDict(Def_Process_Tick, tick)
+    PackDataSyncState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
+    isAllEquip = False
+    # 需要同步跨服缓存 且 还没同步装备的
+    if PackDataSyncState&pow(2, 2) and curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipViewCacheState) != 2:
+        PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 2)
+        isAllEquip = True
+        GameWorld.DebugLog("本次登录首次同步跨服缓存,全装备同步", curPlayer.GetPlayerID())
+        
+    if forcePackData:
+        SetPackDataSyncState(curPlayer)
+        SetPackDataCrossSyncState(curPlayer)
+        
     #获取当前玩家缓存数据
     PropData, PlusData = GetPlayerPropPlusCache(curPlayer)
-    itemDataDict = __GetPlayerItemDataCache(curPlayer)
+    itemDataDict = __GetPlayerItemDataCache(curPlayer, isAllEquip)
     
     #同步发送到GameServer
     sendPack = ChMapToGamePyPack.tagMGUpdatePlayerCache()
@@ -108,20 +138,23 @@
         setattr(sendPack, "ItemData%s" % classLV, itemData)
         setattr(sendPack, "ItemDataSize%s" % classLV, len(itemData))
     # 打包数据相关
-    sendPack.PackDataSyncState = 11 if forcePackData else curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_PackDataSyncState)
-    sendPack.PackData = GetSyncPlayerPackData(curPlayer, forcePackData)
+    sendPack.PackDataSyncState = PackDataSyncState
+    sendPack.PackData = "" if isOnlyViewCache else GetSyncPlayerPackData(curPlayer, forcePackData)
     sendPack.PackDataLen = len(sendPack.PackData)
     sendPack.PackMsg = str(packMsg) if packMsg else "{}"
     sendPack.PackMsgLen = len(sendPack.PackMsg)
-    #GameWorld.DebugLog("同步缓存: %s" % sendPack.OutputString())
+    GameWorld.DebugLog("同步缓存: logout=%s,forcePackData=%s,isOnlyViewCache=%s,PackDataSyncState=%s,isAllEquip=%s,classList=%s" 
+                       % (IsLogouting, forcePackData, isOnlyViewCache, PackDataSyncState, isAllEquip, itemDataDict.keys()), curPlayer.GetPlayerID())
     NetPackCommon.SendPyPackToGameServer(sendPack)
     return
 
-def __GetPlayerItemDataCache(curPlayer):
+def __GetPlayerItemDataCache(curPlayer, isAllEquip=False):
     ## 装备及装备位养成缓存,由于装备位比较多,所以按阶同步,重登第一次同步所有阶
-    
-    if not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipViewCacheState):
+    if not isAllEquip and not curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_EquipViewCacheState):
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_EquipViewCacheState, 1)
+        isAllEquip = True
+        
+    if isAllEquip:
         needSyncClassLVList = xrange(1, IpyGameDataPY.GetFuncCfg('EquipMaxClasslv') + 1)
     else:
         playerID = curPlayer.GetPlayerID()

--
Gitblit v1.8.0