From ec5de0b415bb3fd2c12367b1babfe0d4351a2827 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期二, 17 三月 2026 15:03:38 +0800
Subject: [PATCH] 405 【公会】自动转让会长规则调整(优化优先传位配置;优化跨服邮件发送;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 62 +++++++++++++++++++------------
1 files changed, 38 insertions(+), 24 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 9e5032a..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():
@@ -807,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():
@@ -1329,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)
@@ -1342,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:
@@ -1370,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
@@ -1596,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()):
@@ -1921,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
## ------------------------------------------------------------------------------------------------
@@ -2181,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