From 6f2c8b0e79e4963cc6aceda674847d04d23e02b2 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期三, 24 十二月 2025 18:25:40 +0800
Subject: [PATCH] 16 卡牌服务端(MainLevelPass流向增加祝福树等级信息;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py |   89 +++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 87 insertions(+), 2 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 93c6f86..9b03311 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -30,9 +30,10 @@
 import IPY_GameWorld
 import ItemControler
 import GameFuncComm
+import PlayerMail
+import PlayerTask
 import DBDataMgr
 import DirtyList
-import ObjPool
 
 import random
 import time
@@ -92,6 +93,18 @@
             member.SetDonateCntDay(0)
             
         Broadcast_FamilyChange(familyID, FamilyChangeType_OnDay)
+        
+    return
+
+def FamilyOnHour():
+    if GameWorld.IsCrossServer():
+        return
+    
+    familyManager = DBDataMgr.GetFamilyMgr()
+    for i in range(0, familyManager.GetCount()):
+        family = familyManager.GetAt(i)
+        #自动传位
+        __AutoChangeLeader(family)
         
     return
 
@@ -465,6 +478,7 @@
     familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
     Sync_RequestAddFamilyInfo(curPlayer)
     PlayerFamilyTaofa.OnPlayerEnterFamily(curPlayer)
+    PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily)
     return
 
 def __OnLeaveFamily(curPlayer, isVoluntarily, tick):
@@ -661,6 +675,7 @@
     
     # 申请加入
     if requestType == 0:
+        PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily, 1)
         if not tagFamilyID:
             AutoJoinFamily(curPlayer)
         else:
@@ -1172,6 +1187,76 @@
     #GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # 成员职位变更
     return
 
+def __AutoChangeLeader(curFamily):
+    ## 自动传位
+    leaderID = curFamily.GetLeaderID()
+    leaderMem = curFamily.FindMember(leaderID)
+    if not leaderMem:
+        return
+    offTime = leaderMem.GetOffTime()
+    if not offTime:
+        return
+    familyID = curFamily.GetID()
+    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:
+            continue
+        
+        memOffTime = member.GetOffTime()
+        if memOffTime:
+            sortTime = memOffTime
+            memPassTime = curTime - memOffTime
+            memPassHours = memPassTime / 3600.0
+        else:
+            sortTime = curTime # 排序用的时间,越大越优先
+            memPassTime = 0
+            memPassHours = 0
+            
+        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:
+        # 没有可传位的目标成员
+        return
+    
+    toMember = None
+    if priorityList:
+        priorityList.sort(reverse=True)
+        toMember = priorityList[0][-1]
+    else:
+        commList.sort(reverse=True)
+        toMember = commList[0][-1]
+        
+    if not toMember:
+        return
+    
+    newLeaderID = toMember.GetPlayerID()
+    GameWorld.Log("公会自动传位: familyID=%s,leaderID=%s,offTime=%s,passHours=%s,newLeaderID=%s" 
+                  % (familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, newLeaderID))
+    ChangeFamilyLeader(curFamily, toMember)
+    Broadcast_FamilyChange(familyID, FamilyChangeType_LeaderChange, excludeIDList=[leaderID, newLeaderID])
+    
+    # 邮件通知
+    PlayerMail.SendMailByKey("FamilyLeaderAutoChange", newLeaderID, [], [curFamily.GetName()])
+    return
+
 #// A6 26 请求家族成员列表 #tagCMGetFamilyInfo
 #
 #struct    tagCMGetFamilyInfo
@@ -1524,7 +1609,7 @@
         donateCntList.append(donateCnt)
     if not donateCntList:
         return
-    clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCDonateCntInfo)
+    clientPack = ChPyNetSendPack.tagSCDonateCntInfo()
     clientPack.DonateCntList = donateCntList
     clientPack.Count = len(clientPack.DonateCntList)
     NetPackCommon.SendFakePack(curPlayer, clientPack)

--
Gitblit v1.8.0