From d1aa37504456311fe9d7ddc2f23f537c2408b90c Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 09 一月 2024 11:06:44 +0800
Subject: [PATCH] 10019 【砍树】回合战斗(灵宠通用;技能通用;玩家镜像支持) 1. 灵宠修改为通用模式,玩家及NPC均可召唤灵宠,NPC对应召唤的灵宠NPC与玩家的灵宠NPCID区分; 2. 技能全部为通用技能,玩家、玩家镜像、NPC均通用;支持玩家镜像赋予玩家技能进行攻击; 3. 技能释放方式8(单体恢复:增加方式6-按目标攻击力恢复血量) 4. 修改玩家技能缓存格式 5. 修复玩家灵宠技能升级bug

---
 ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py |   65 +++++++++++++++++++++++++++-----
 1 files changed, 55 insertions(+), 10 deletions(-)

diff --git a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
index 322b1a8..93d0bc6 100644
--- a/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
+++ b/ServerPython/CoreServerGroup/GameServer/Script/Player/PlayerViewCache.py
@@ -23,11 +23,15 @@
 import NetPackCommon
 import GameWorldArena
 import ChPyNetSendPack
+import ChGameToMapPyPack
 import PlayerFBHelpBattle
+import GameWorldSkyTower
+import CrossChampionship
 import CrossBattlefield
 import PyGameDataStruct
 import IpyGameDataPY
 import PyDataManager
+import ShareDefine
 import ChConfig
 
 import json
@@ -46,6 +50,12 @@
         return True
     
     if CrossBattlefield.IsBattlefieldCallPlayer(playerID):
+        return True
+    
+    if CrossChampionship.IsChampionshipPlayer(playerID):
+        return True
+    
+    if GameWorldSkyTower.IsSkyTowerPassPlayer(playerID):
         return True
     
     SaveDBLimitLV = IpyGameDataPY.GetFuncCfg("PlayerViewCache", 1)
@@ -67,6 +77,9 @@
     if CrossBattlefield.IsBattlefieldCallPlayer(playerID):
         return True
     
+    if CrossChampionship.IsChampionshipPlayer(playerID):
+        return True
+    
     NeedCheckBillBoardType = IpyGameDataPY.GetFuncEvalCfg("PlayerViewCache", 2)
     #校验玩家是否上排行榜
     billboardMgr = GameWorld.GetBillboard()
@@ -77,6 +90,16 @@
         if curBillboard.FindByID(playerID):
             return True
         
+    #跨服榜单上的默认保留
+    if GameWorld.IsCrossServer():
+        billboardMgr = PyDataManager.GetCrossBillboardManager()
+        for billboardType in ShareDefine.CrossBillboardTypeList:
+            groupList = billboardMgr.GetBillboardGroupList(billboardType)
+            for billboardType, groupValue1, groupValue2 in groupList:
+                billboardObj = billboardMgr.GetCrossBillboard(billboardType, groupValue1, groupValue2)
+                if billboardObj.FindByID(playerID):
+                    return True
+                
     return False
 
 def DelOutofTimeViewCacheData():
@@ -106,8 +129,9 @@
     GameWorld.DebugLog("删除查看缓存!", playerID)
     return
 
-def FindViewCache(playerID, isAddNew=False):
+def FindViewCache(playerID, isAddNew=False, newPropData={}):
     ## 查找玩家缓存
+    # @param newPropData: 新数据初始PropData {}, key: LV,RealmLV,Job,VIPLV,Name,FamilyID,FamilyName,FightPower
     curCache = None
     pyViewCacheMgr = PyDataManager.GetPlayerViewCachePyManager()
     playerViewCachePyDict = pyViewCacheMgr.playerViewCachePyDict
@@ -116,6 +140,9 @@
     elif isAddNew:
         curCache = PyGameDataStruct.tagPlayerViewCachePy()
         curCache.PlayerID = playerID
+        if newPropData:
+            curCache.PropData = json.dumps(newPropData, ensure_ascii=False).replace(" ", "")
+            curCache.PropDataSize = len(curCache.PropData)
         playerViewCachePyDict[playerID] = curCache
     return curCache
 
@@ -143,8 +170,8 @@
 #    WORD        ItemDataSize1;
 #    char        ItemData1[ItemDataSize1];    //1阶装备数据
 #    ...         ...
-#    WORD        ItemDataSize15;
-#    char        ItemData15[ItemDataSize15];
+#    WORD        ItemDataSize20;
+#    char        ItemData20[ItemDataSize20];
 #};
 def OnMGUpdatePlayerCache(routeIndex, mapID, curPackData, tick):
     playerID = curPackData.PlayerID
@@ -165,12 +192,7 @@
         return
     curCache.LV = curPackData.PlayerLV
     curCache.OffTime = curPackData.OffTime
-    if isLogout:
-        curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
-        if curPlayer:
-            curCache.GeTuiID = curPlayer.GetGeTuiClientID()
-            curCache.GeTuiIDSize = len(curCache.GeTuiID)
-            
+    
     curCache.PropDataDict = {} # 每次更新数据时,重置字典缓存,下次获取时重新eval缓存
     curCache.PropData = curPackData.PropData
     curCache.PropDataSize = curPackData.PropDataSize
@@ -181,7 +203,7 @@
     #GameWorld.DebugLog("    更新Plus数据: size=%s, %s" % (curCache.PlusDataSize, curCache.PlusData), playerID)
     
     # 装备数据存储,不保存装备数据的话则清空
-    for classLV in xrange(1, 15 + 1):
+    for classLV in xrange(1, 20 + 1):
         if not isSaveAll:
             itemDataSize = 0
             itemData = ""
@@ -212,16 +234,36 @@
 #    DWORD        PlayerID;        //玩家ID
 #    DWORD        FindPlayerID;    //要查询的玩家ID
 #    BYTE        EquipClassLV;    //大于0为查看指定境界阶装备信息,  0为查看默认信息
+#    BYTE        CallMap;        //是否需要通知地图
 #};
 def OnMGQueryPlayerCache(routeIndex, mapID, curPackData, tick):
     curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(curPackData.PlayerID)
     findPlayerID = curPackData.FindPlayerID
     equipClassLV = curPackData.EquipClassLV
+    callMap = curPackData.CallMap
     curCache = FindViewCache(findPlayerID)
     if not curCache:
         PlayerControl.NotifyCode(curPlayer, "ViewPlayer_OffLine")
+        if callMap:
+            sendPack = ChGameToMapPyPack.tagGMPlayerCache()
+            sendPack.PlayerID = curPlayer.GetPlayerID()
+            sendPack.FindPlayerID = findPlayerID
+            sendPack.PropData = ""
+            sendPack.PropDataSize = len(sendPack.PropData)
+            sendPack.PlusData = ""
+            sendPack.PlusDataSize = len(sendPack.PlusData)
+            NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack) 
         return
     Sync_PlayerCache(curPlayer, curCache, equipClassLV)
+    if callMap:
+        sendPack = ChGameToMapPyPack.tagGMPlayerCache()
+        sendPack.PlayerID = curPlayer.GetPlayerID()
+        sendPack.FindPlayerID = findPlayerID
+        sendPack.PropData = curCache.PropData
+        sendPack.PropDataSize = len(sendPack.PropData)
+        sendPack.PlusData = curCache.PlusData
+        sendPack.PlusDataSize = len(sendPack.PlusData)
+        NetPackCommon.SendPyPackToMapServer(routeIndex, mapID, sendPack) 
     return
 
 def Sync_PlayerCache(curPlayer, curCache, equipClassLV=0):
@@ -272,6 +314,7 @@
             answerPack.RealmLV = 1
             answerPack.OnlineType = ChConfig.Def_Offline
             answerPack.ServerGroupID = 0
+            answerPack.Face = 0
         else:
             cacheDict = GetCachePropDataDict(curCache)
             answerPack.PlayerID = clientPack.PlayerID
@@ -280,6 +323,7 @@
             answerPack.LV = cacheDict["LV"]
             answerPack.RealmLV = cacheDict["RealmLV"]
             answerPack.OnlineType = ChConfig.Def_Offline
+            answerPack.Face = cacheDict.get("Face", 0)
             
             if GameWorld.IsCrossServer():
                 answerPack.ServerGroupID = cacheDict.get("ServerGroupID", 0)
@@ -294,6 +338,7 @@
         answerPack.OnlineType = ChConfig.Def_Online
         answerPack.IsInTeam = tagPlayer.GetTeamID() > 0
         answerPack.ServerGroupID = PlayerControl.GetPlayerServerGroupID(tagPlayer)
+        answerPack.Face = tagPlayer.GetFace()
 
     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
     NetPackCommon.SendFakePack(curPlayer, answerPack)

--
Gitblit v1.8.0