From 35d98e9c630fd4408561c8c54b4c09193bb9ce9e Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期五, 20 三月 2026 14:57:32 +0800
Subject: [PATCH] 0312 修改服务端补主线进度通知

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py |  105 ++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 80 insertions(+), 25 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
index 924a4e1..6c501bb 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -85,13 +85,26 @@
     return
 
 def __doFamilyOnHour():
+    
+    needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
+    priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 2) # 优先传给离线不超过x小时的成员,一样按优先级
+    if GameWorld.IsMainServer() and not DBFamily.IsFamilyCross():
+        # 开服前X天会长离线Y小时触发自动转让,优先级高于数值1,格式 X|Y
+        openServerSet = IpyGameDataPY.GetFuncEvalCfg("FamilyLeaderAutoChange", 3)
+        befServerDay = openServerSet[0]
+        serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
+        if serverDay <= befServerDay:
+            needHours = openServerSet[1]
+            priorityHours = openServerSet[2]
+            
+    GameWorld.DebugLog("自动传位时长设定: needHours=%s,priorityHours=%s" % (needHours, priorityHours))
     familyManager = DBDataMgr.GetFamilyMgr()
     for zoneID in familyManager.GetZoneIDListThisServer():
         zoneMgr = familyManager.GetZoneFamilyMgr(zoneID)
         for i in range(0, zoneMgr.GetCount()):
             family = zoneMgr.GetAt(i)
             #自动传位
-            __AutoChangeLeader(family)
+            __AutoChangeLeader(family, needHours, priorityHours)
     return
 
 def FamilyCrossCenterOnDay():
@@ -165,6 +178,8 @@
     PlayerLoginRefreshFamily(crossPlayer) # 必须先刷新
     Sync_RequestAddFamilyInfo(crossPlayer, False)
     PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcFamily]) # 公会聊天缓存
+    if GameWorld.IsCrossServer():
+        PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcCountry]) # 跨服公会聊天缓存
     PlayerFamilyTaofa.OnCrossPlayerLogin(crossPlayer)
     return
 
@@ -295,6 +310,7 @@
     if not member:
         return
     member.RefreshMemberByID(playerID)
+    Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # 成员信息变更
     return
 
 def FamilyPyPackForwarding(curPlayer, clientData, tick, funcName, needResult=False, reqCD=0.5, reqDataEx=None):
@@ -804,12 +820,17 @@
             joinCDMinute = joinCDMinuteList[kickedCnt - 1] if len(joinCDMinuteList) >= kickedCnt else joinCDMinuteList[-1]
     if joinCDMinute:
         cdTimes = joinCDMinute * 60
-        passTimes = int(time.time()) - leaveFamilyTime
+        passTimes = GetFamilyTime() - leaveFamilyTime
         if passTimes < cdTimes:
             GameWorld.DebugLog("加入公会CD中: leaveCnt=%s,kickedCnt=%s,lastVoluntarily=%s,leaveFamilyTime=%s(%s),passTimes=%s < %s" 
                    % (leaveCnt, kickedCnt, lastVoluntarily, leaveFamilyTime, GameWorld.ChangeTimeNumToStr(leaveFamilyTime), passTimes, cdTimes))
             return True
     return False
+
+def GetFamilyTime():
+    if GameWorld.IsMainServer() and DBFamily.IsFamilyCross():
+        return CrossMgr.GetSSServerMgr().GetCrossTime()
+    return int(time.time())
 
 def AutoJoinFamily(crossPlayer):
     if crossPlayer.GetFamilyID():
@@ -1326,7 +1347,7 @@
     CrossPlayer.FamilyNotify(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV])
     return
 
-def __AutoChangeLeader(curFamily):
+def __AutoChangeLeader(curFamily, needHours, priorityHours):
     ## 自动传位
     leaderID = curFamily.GetLeaderID()
     leaderMem = curFamily.FindMember(leaderID)
@@ -1339,16 +1360,12 @@
     curTime = int(time.time())
     passTime = curTime - offTime
     passHours = passTime / 3600.0
-    needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
     if passHours < needHours:
         GameWorld.DebugLogEx("盟主离线未超过限制小时,不处理自动传位!familyID=%s,leaderID=%s,offTime=%s,passHours=%s < %s", 
                              familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, needHours)
         return
     
-    priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1) # 优先传给离线不超过x小时的成员,一样按优先级
-    
     priorityList = []
-    commList = []
     for i in range(0, curFamily.GetCount()):
         member = curFamily.GetAt(i)
         if member.GetFmLV() == IPY_PlayerDefine.fmlLeader:
@@ -1367,22 +1384,16 @@
         fmLV = member.GetFmLV() # 职位
         contribTotal = member.GetContribTotal() # 总贡献
         
-        commList.append([fmLV, sortTime, contribTotal, member])
         if priorityHours and memPassHours <= priorityHours:
             priorityList.append([fmLV, sortTime, contribTotal, member])
             
-    if not priorityList and not commList:
-        # 没有可传位的目标成员
+    if not priorityList:
+        GameWorld.DebugLog("没有可传位的目标成员! familyID=%s" % familyID)
         return
     
-    toMember = None
-    if priorityList:
-        priorityList.sort(reverse=True)
-        toMember = priorityList[0][-1]
-    else:
-        commList.sort(reverse=True)
-        toMember = commList[0][-1]
-        
+    priorityList.sort(reverse=True)
+    toMember = priorityList[0][-1]
+    
     if not toMember:
         return
     
@@ -1593,13 +1604,19 @@
     if CheckFamilyNameExists(crossPlayer, newName, fromServerID):
         return
     
+    zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(familyID)
+    if not zoneMgr:
+        return
+    
+    if not zoneMgr.FamilyRemainName(family, newName):
+        return
+    
+    if cdHours:
+        SetRenameTime(family, curTime)
+        
     moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyRename", 1)
     if moneyType and moneyValue:
         CrossPlayer.CostPlayerResources(crossPlayer, "FamilyRename", costMoneyDict={moneyType:moneyValue})
-        
-    family.SetName(newName)        
-    if cdHours:
-        SetRenameTime(family, curTime)
         
     crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
     for index in xrange(family.GetCount()):
@@ -1918,7 +1935,7 @@
     curMember.SetContribTotal(contribTotal)
     GameWorld.DebugLog("增加成员贡献: familyID=%s,addContribValue=%s,contribDay=%s,contribTotal=%s" % (familyID, addContribValue, contribDay, contribTotal), playerID)
     
-    Broadcast_FamilyInfo(familyID, isSyncMem=False) # 成员贡献
+    Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID]) # 成员贡献
     return
 
 ## ------------------------------------------------------------------------------------------------
@@ -2022,7 +2039,7 @@
 def OnFamilyTalk(curPlayer, familyID, talkPack, tick):
     clientData, tick = None, 0
     reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
-    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqCD=0, reqDataEx=reqDataEx)
+    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqDataEx=reqDataEx)
     return
 def __OnFamilyTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
     talkBuffer = reqDataEx["talkBuffer"]
@@ -2040,6 +2057,44 @@
     content = clientPack.Content
     bubbleBox = clientPack.BubbleBox
     PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox, familyID)
+    return
+
+def OnCrossFamilyTalk(curPlayer, talkPack, tick):
+    ## 跨服公会聊天,与跨服公会互通范围一致
+    crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
+    if crossServerID <= 0:
+        GameWorld.DebugLog("本服公会未互通,不允许跨服聊天")
+        return
+    clientData, tick = None, 0
+    reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
+    FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnCrossTalk", reqDataEx=reqDataEx)
+    return
+def __OnCrossTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
+    talkBuffer = reqDataEx["talkBuffer"]
+    playerID = crossPlayer.GetPlayerID()
+    
+    if not talkBuffer:
+        return
+    
+    familyMgr = DBDataMgr.GetFamilyMgr()
+    zoneID = familyMgr.GetZoneIDInThisServer(fromServerID)
+    if zoneID < 0:
+        GameWorld.ErrLog("找不到服务器ID在跨服中的公会分区! fromServerID=%s" % fromServerID)
+        return
+    zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID)
+    serverIDList = zoneMgr.GetZoneServerIDList()
+    if not serverIDList:
+        return
+    
+    clientPack = ChPyNetSendPack.tagMCTalk()
+    clientPack.ReadData(talkBuffer)
+    CrossPlayer.SendFackPackToServerList(clientPack, serverIDList)
+    
+    # 聊天缓存
+    channelType = clientPack.ChannelType
+    content = clientPack.Content
+    bubbleBox = clientPack.BubbleBox
+    PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox)
     return
 
 ## -------------------------------------- 游戏服本服处理 --------------------------------------------
@@ -2140,7 +2195,7 @@
     curPlayer.SetFamilyActiveValue(0)
     curPlayer.SetLastWeekFamilyActiveValue(0)
     curPlayer.SetFamilyLV(0)
-    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()))
+    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, GetFamilyTime())
     leaveCnt, kickedCnt, _ = PlayerControl.GetLeaveFamilyInfo(curPlayer)
     GameWorld.DebugLog("__OnLeaveFamily: isVoluntarily=%s,leaveCnt=%s,kickedCnt=%s" % (isVoluntarily, leaveCnt, kickedCnt))
     delMoneyType, delMoneyPer = IpyGameDataPY.GetFuncCfg("FamilyLeave", 3), 0

--
Gitblit v1.8.0