From 83dfcaf24534339782da86b3e5fd54a161345544 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 19 十二月 2025 14:44:23 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(增加自动传位;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 78 +++++++++++++++++++++++++++++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py | 24 ++++++++++++
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py | 1
3 files changed, 103 insertions(+), 0 deletions(-)
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
index 3842ea6..9d504b5 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
@@ -29,8 +29,10 @@
if not msgList:
GameWorld.DebugAnswer(curPlayer, "设置等级: Family lv 等级 经验")
GameWorld.DebugAnswer(curPlayer, "设置徽章: Family e 徽章ID [剩余时间秒]")
+ GameWorld.DebugAnswer(curPlayer, "设置贡献: Family c 今日贡献 累计贡献 [成员ID]")
GameWorld.DebugAnswer(curPlayer, "设置离开: Family l 主动离开次数 被踢次数 上次是否主动 离开多久了")
GameWorld.DebugAnswer(curPlayer, "添加成员: Family m 人数 [仙盟ID]")
+ GameWorld.DebugAnswer(curPlayer, "成员离线: Family ml 成员ID 离线分钟数")
GameWorld.DebugAnswer(curPlayer, "创建仙盟相关使用命令: CreateFamily")
return
@@ -78,5 +80,27 @@
CreateFamily.OnExec(curPlayer, msgList)
return
+ elif value == "c":
+ contribDay = msgList[1] if len(msgList) > 1 else 0
+ contribTotal = msgList[2] if len(msgList) > 2 else 0
+ memID = msgList[3] if len(msgList) > 3 else curPlayer.GetPlayerID()
+ member = curFamily.FindMember(memID)
+ if not member:
+ GameWorld.DebugAnswer(curPlayer, "不存在该成员ID:%s" % memID)
+ return
+ member.SetContribDay(contribDay)
+ member.SetContribTotal(contribTotal)
+ GameWorld.DebugAnswer(curPlayer, "设置贡献:%s/%s, ID:%s" % (contribDay, contribTotal, memID))
+
+ elif value == "ml":
+ memID = msgList[1] if len(msgList) > 1 else 0
+ logoutMinutes = msgList[2] if len(msgList) > 2 else 0
+ member = curFamily.FindMember(memID)
+ if not member:
+ GameWorld.DebugAnswer(curPlayer, "不存在该成员ID:%s" % memID)
+ return
+ member.SetOffTime(int(time.time()) - logoutMinutes * 60)
+ GameWorld.DebugAnswer(curPlayer, "成员ID:%s,离线时间:%s" % (memID, GameWorld.ChangeTimeNumToStr(member.GetOffTime())))
+
PlayerFamily.Sync_FamilyInfo(curPlayer)
return
diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
index 824208a..cc22c03 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -131,6 +131,7 @@
def DoLogic_OnHour(tick):
GameWorld.Log("MapServer -> OnHour!")
+ PlayerFamily.FamilyOnHour()
#副本OnHour事件
FBLogic.OnHour(time, tick)
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 2420dbf..3ee482d 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -30,6 +30,7 @@
import IPY_GameWorld
import ItemControler
import GameFuncComm
+import PlayerMail
import PlayerTask
import DBDataMgr
import DirtyList
@@ -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
@@ -1174,6 +1187,71 @@
#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()
+ memPassTime = curTime - memOffTime
+ memPassHours = memPassTime / 3600.0
+ sortTime = memOffTime if memOffTime else curTime # 排序用的时间,越大越优先
+
+ 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
--
Gitblit v1.8.0