From f2cf64ffabcd15d5497aee8914b8d37d8b9a88b0 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 07 二月 2026 15:39:43 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(公会GM命令支持跨服 CreateFamily、Family、Zhenbaoge;跨服公会聊天支持,包含公会聊天缓存;查看玩家A705回包增加公会所在服务器ID信息;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py |   64 +++++++++++++++++++++++++------
 1 files changed, 51 insertions(+), 13 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
index 069562e..f45f86a 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GameWorldLogic/FBProcess/GameLogic_Dingjunge.py
@@ -24,6 +24,7 @@
 import ItemControler
 import IpyGameDataPY
 import NetPackCommon
+import PlayerOnline
 import ChConfig
 
 # 自动选择排序优先级索引
@@ -49,6 +50,7 @@
         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGSelectEffect % sIndex, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGUnSelectCnt, 0)
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGEffAuto, 0) # 每日重置自动开关
+    RefreshDingjungeAttr(curPlayer)
     SyncDingjungeInfo(curPlayer)
     return
 
@@ -208,18 +210,17 @@
                        % (highestLineID, passLayerMax, quickStartLayer, todayLineID), playerID)
     
     # 快速过关奖励按历史最大过关层级领取
-    awardItemDict = {}
+    awardIpyData = None
     ipyDataMgr = IpyGameDataPY.IPY_Data()
     for index in range(ipyDataMgr.GetFBDJGQuickCount()):
         quickIpyData = ipyDataMgr.GetFBDJGQuickByIndex(index)
         needLayer = quickIpyData.GetNeedLayer()
         if needLayer > passLayerMax:
             break
-        quickItemList = quickIpyData.GetQuickAwardList()
-        for itemInfo in quickItemList:
-            itemID, itemCount = itemInfo[:2]
-            awardItemDict[itemID] = awardItemDict.get(itemID, 0) + itemCount
-    awardItemList = [[itemID, itemCount] for itemID, itemCount in awardItemDict.items()]
+        awardIpyData = quickIpyData
+    if not awardIpyData:
+        return
+    awardItemList = awardIpyData.GetQuickAwardList()
     
     # 设置起始层关卡
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGLineID, todayLineID)
@@ -295,6 +296,7 @@
     else:
         if __doSelectEff(curPlayer, selectIndex, replaceHole):
             __randSelectEff(curPlayer, isReset=True)
+            RefreshDingjungeAttr(curPlayer)
             
     SyncDingjungeInfo(curPlayer)
     return
@@ -316,7 +318,7 @@
     GameWorld.DebugLog("执行一键选择加成效果: unSelectCnt=%s,effHoleCnt=%s,selectSetAttrIDList=%s" % (unSelectCnt, effHoleCnt, selectSetAttrIDList))
     
     randEffCnt = IpyGameDataPY.GetFuncCfg("DingjungeEff", 3)
-    for _ in range(unSelectCnt):
+    for _ in range(unSelectCnt + 1): # 多执行一次+1是因为可能存在未选择的视为1次,内层有验证剩余未选择数,所以多执行一次没关系
         effIDList = __randSelectEff(curPlayer, randEffCnt)
         if not effIDList:
             break
@@ -326,6 +328,8 @@
         # 自动选择后重置
         for sIndex in range(randEffCnt):
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGSelectEffect % sIndex, 0)
+            
+    RefreshDingjungeAttr(curPlayer)
     return True
 
 def __getUnlockEffHoleCnt(curPlayer):
@@ -340,17 +344,16 @@
 
 def __randSelectEff(curPlayer, randEffCnt=0, isReset=False):
     ## 随机生成待选择加成效果
-    unSelectCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGUnSelectCnt)
-    if unSelectCnt <= 0:
-        GameWorld.DebugLog("没有未处理的加成效果次数了")
-        return
     if not randEffCnt:
         randEffCnt = IpyGameDataPY.GetFuncCfg("DingjungeEff", 3)
-    effIDList = []
     if isReset:
         # 重置
         for sIndex in range(randEffCnt):
             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGSelectEffect % sIndex, 0)
+            
+    effIDList = []
+    if isReset:
+        pass
     else:
         for sIndex in range(randEffCnt):
             effID = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGSelectEffect % sIndex)
@@ -358,8 +361,13 @@
                 break
             effIDList.append(effID)
     if effIDList:
-        GameWorld.DebugLog("已存在未选择的加成效果等选择后再生成: effIDList=%s,unSelectCnt=%s" % (effIDList, unSelectCnt))
+        #GameWorld.DebugLog("已存在未选择的加成效果等选择后再生成: effIDList=%s,unSelectCnt=%s" % (effIDList, unSelectCnt))
         return effIDList
+    
+    unSelectCnt = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGUnSelectCnt)
+    if unSelectCnt <= 0:
+        GameWorld.DebugLog("没有未处理的加成效果次数了")
+        return []
     
     fullLVEffIDList = [] # 已满级的效果ID列表
     effMaxLV = IpyGameDataPY.GetFuncCfg("DingjungeEff", 2)
@@ -546,6 +554,36 @@
     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_DJGEffect % replaceIndex, effInfo)
     return True
 
+def RefreshDingjungeAttr(curPlayer):
+    CalcDingjungeAttr(curPlayer)
+    PlayerOnline.GetOnlinePlayer(curPlayer).RefreshRoleAttr(exclusiveMapID=ChConfig.Def_FBMapID_Dingjunge)
+    return
+
+def CalcDingjungeAttr(curPlayer):
+    
+    playerID = curPlayer.GetPlayerID()
+    attrDict = {}
+    
+    effHoleCnt = __getUnlockEffHoleCnt(curPlayer)
+    for eIndex in range(effHoleCnt):
+        effInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGEffect % eIndex)
+        if not effInfo:
+            continue
+        effID, effLV = effInfo / 100, effInfo % 100
+        effIpyData = IpyGameDataPY.GetIpyGameData("FBDJGEffect", effID)
+        if not effIpyData:
+            continue
+        attrID = effIpyData.GetAttrID()
+        attrValue = effIpyData.GetAttrValue()
+        attrValueTotal = attrValue * effLV
+        attrDict[attrID] = attrDict.get(attrID, 0) + attrValueTotal
+        #GameWorld.DebugLog("eIndex=%s,effID=%s,attrID=%s,attrValue=%s,effLV=%s,%s" % (eIndex, effID, attrID, attrValue, effLV, attrDict), playerID)
+        
+    # 保存计算值
+    GameWorld.DebugLog("定军属性: %s" % attrDict, playerID)
+    PlayerOnline.GetOnlinePlayer(curPlayer).SetCalcAttr(ChConfig.Def_CalcAttr_Dingjunge, attrDict)
+    return
+
 def SyncDingjungeInfo(curPlayer):
     clientPack = ChPyNetSendPack.tagSCDingjungeInfo()
     clientPack.TodayPass = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_DJGLineID)

--
Gitblit v1.8.0