From bc5f3f1c88d225109fa39a85b209ef13f5fb52a9 Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期五, 06 二月 2026 21:28:13 +0800
Subject: [PATCH] 66 【公会】基础主体-服务端(跨服公会所有基本功能支持、跨服砍价支持;修改查看目标公会、查看目标玩家方式;)
---
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py | 151 ++++++++++++++++++++++++++++++++++++--------------
1 files changed, 109 insertions(+), 42 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 267b678..c2c6d64 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -35,6 +35,7 @@
import DBDataMgr
import DBFamily
import CrossMsg
+import CrossMgr
import random
import time
@@ -77,7 +78,7 @@
def FamilyOnHour():
if not GameWorld.IsMainServer() or DBFamily.IsFamilyCross():
- # 非游戏服或本服已跨服互通了不处理
+ GameWorld.DebugLog("非游戏服或本服已跨服互通了不处理 FamilyOnHour")
return
__doFamilyOnHour()
return
@@ -101,7 +102,7 @@
## 本服时间自己触发的onday逻辑
if not GameWorld.IsMainServer() or DBFamily.IsFamilyCross():
- # 非游戏服或本服已跨服互通了不处理
+ GameWorld.DebugLog("非游戏服或本服已跨服互通了不处理 FamilyOnDay")
return
__doFamilyOnDay()
@@ -125,7 +126,7 @@
member.SetContribDay(0)
member.SetDonateCntDay(0)
- Broadcast_FamilyInfo(familyID)
+ Broadcast_FamilyInfo(familyID) # onday
return
def PlayerCrossCenterOnDay(curPlayer):
@@ -153,7 +154,7 @@
def OnPlayerLogin(curPlayer, tick):
Do_MapServer_PlayerLogin(curPlayer)
if DBFamily.IsFamilyCross():
- #公会已跨服不处理,由所属跨服服务器处理成员登录逻辑
+ GameWorld.DebugLog("公会已跨服不处理,由所属跨服服务器处理成员登录逻辑 OnPlayerLogin", curPlayer.GetPlayerID())
return
crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
OnCrossPlayerLogin(crossPlayer)
@@ -168,7 +169,7 @@
def OnPlayerLogout(curPlayer):
if DBFamily.IsFamilyCross():
- #公会已跨服不处理,由所属跨服服务器处理成员登录逻辑
+ GameWorld.DebugLog("公会已跨服不处理,由所属跨服服务器处理成员离线逻辑 OnPlayerLogout", curPlayer.GetPlayerID())
return
crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
OnCrossPlayerLogout(crossPlayer)
@@ -190,7 +191,7 @@
curMember.SetOffTime(int(time.time()))
# 通知成员下线
- Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID])
+ Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID]) # 成员下线
return
def SendToFamilyMapPlayer(crossPlayer, doType, doData):
@@ -225,6 +226,8 @@
familyID = 0
crossPlayer.SetFamilyID(familyID)
+ # 同步更新查看缓存
+ PlayerViewCache.UpdPlayerViewFamilyInfo(playerID, familyID, FamilyName, EmblemID, EmblemWord)
doData = {"FamilyID":familyID}
if familyID:
@@ -242,7 +245,7 @@
refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID)
GameWorld.DebugLog("PlayerLoginRefreshFamily playerID=%s,refreshFamilyID=%s" % (playerID, refreshFamilyID))
crossPlayer.SetFamilyID(refreshFamilyID)
- MapServer_FamilyRefresh(crossPlayer, refreshFamilyID)
+ MapServer_FamilyRefresh(crossPlayer, refreshFamilyID) # 登录
familyID = refreshFamilyID
if not familyID:
return
@@ -258,7 +261,7 @@
Sync_FamilyInfo(crossPlayer) # 给自己同步完整的
# 广播成员在线
- Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID])
+ Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # 成员登录
#通知招人
if GetFamilyMemberHasPow(curMember, FamilyPowerID_Call):
@@ -312,13 +315,18 @@
__doFamilyPyPackRet(curPlayer, clientData, funcName, isOK)
return
+ ssServer = CrossMgr.GetSSServerMgr().GetSSServer(crossServerID)
+ if not ssServer or not ssServer.IsServerOpen():
+ PlayerControl.NotifyCode(curPlayer, "ServerNoOpen")
+ return
+
# 转发请求CD验证
if reqCD:
- reqTick = curPlayer.GetDictByKey("FamilyPyPackForwardingTick")
+ reqTick = curPlayer.GetDictByKey(funcName) # 根据函数名单独处理CD,防止相互影响
if reqTick and (tick - reqTick) < reqCD * 1000:
PlayerControl.NotifyCode(curPlayer, "RequestLater")
return
- curPlayer.SetDict("FamilyPyPackForwardingTick", tick)
+ curPlayer.SetDict(funcName, tick)
# 剩下的就是大于0
dataMsg = {"funcName":funcName}
@@ -352,10 +360,11 @@
curPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)
if not curPlayer:
return
- curPlayer.SetDict("FamilyPyPackForwardingTick", 0)
-
funcName = dataMsg["funcName"]
packBuff = dataMsg.get("packBuff")
+
+ curPlayer.SetDict(funcName, 0) # 重置CD
+
clientData = None
if packBuff:
clientData = NetPackCommon.ReadRecPyPackData(packBuff)
@@ -470,11 +479,13 @@
GameWorld.ErrLog("创建家族失败", playerID)
return
newFamilyID = curFamily.GetID()
+ zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(newFamilyID)
+ zoneID = zoneMgr.GetZoneID() if zoneMgr else -1
curFamily.SetLV(1)
emblemIDList = PlayerFamilyEmblem.GetDefaultFamilyEmblemIDList()
if not emblemID or emblemID not in emblemIDList:
emblemID = random.choice(emblemIDList) # 从默认徽章中随机选择一个
- GameWorld.Log("创建公会: familyID=%s,playerID=%s,emblemID=%s,serverID=%s" % (newFamilyID, playerID, emblemID, serverID))
+ GameWorld.Log("创建公会: familyID=%s,playerID=%s,emblemID=%s,serverID=%s,zoneID=%s" % (newFamilyID, playerID, emblemID, serverID, zoneID))
curFamily.SetEmblemID(emblemID)
curFamily.SetEmblemWord(emblemWord)
@@ -486,9 +497,9 @@
#-设置家族成员属性
DoPlayerJionFamily(curFamily, playerID, crossPlayer, IPY_PlayerDefine.fmlLeader)
- zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(newFamilyID)
- zoneMgr and zoneMgr.Sort()
-
+ if zoneMgr:
+ zoneMgr.Sort()
+
#XW_JZ_EstablishSud <n color="255,255,0">恭喜您,家族建立成功!</n> 25 - -
#CrossPlayer.NotifyCode(crossPlayer, "XW_JZ_EstablishSud")
#PlayerControl.WorldNotify(0, "jiazu_liubo_671654", [curPlayer.GetName(), fullFamilyName, newFamilyID])
@@ -559,26 +570,25 @@
member = curFamily.AddMember(playerID)
member.SetFmLV(jionFamilySetLv)
member.RefreshMemberByID(playerID)
- curFamily.SetFightPowerTotal(curFamily.GetFightPowerTotal() + member.GetFightPowerTotal())
if jionFamilySetLv == IPY_PlayerDefine.fmlLeader:
curFamily.SetLeaderID(playerID)
if broadcastFamilyChange:
# 广播其他在线成员
- Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID])
+ Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID], excludeIDList=[playerID]) # 成员加入
familyMgr.DelPlayerReqJoinFamilyIDAll(playerID)
#设置玩家身上保存的家族信息
if crossPlayer:
- MapServer_FamilyRefresh(crossPlayer, familyID)
+ MapServer_FamilyRefresh(crossPlayer, familyID) # 加入
Sync_FamilyInfo(crossPlayer) # 给自己同步完整的
Sync_RequestAddFamilyInfo(crossPlayer)
PlayerFamilyTaofa.OnCrossPlayerEnterFamily(crossPlayer)
- #if jionFamilySetLv != IPY_PlayerDefine.fmlLeader:
+ if jionFamilySetLv != IPY_PlayerDefine.fmlLeader:
#通知所有家族成员, 这个人加入了家族
- #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID])
+ CrossPlayer.FamilyNotify(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID])
#if jionPlayer:
# PlayerControl.NotifyCode(jionPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()])
@@ -1086,7 +1096,7 @@
# return
SendFamilyReqJoinInfo(familyID)
if joinOKPlayerIDList:
- Broadcast_FamilyInfo(familyID, changeMemIDList=joinOKPlayerIDList, excludeIDList=joinOKPlayerIDList)
+ Broadcast_FamilyInfo(familyID, changeMemIDList=joinOKPlayerIDList, excludeIDList=joinOKPlayerIDList) # 审核
return
#// A6 22 修改收人方式 #tagCMChangeFamilyJoin
@@ -1124,7 +1134,7 @@
GameWorld.DebugLog("修改招人设置: familyID=%s,joinReview=%s,joinLVMin=%s" % (familyID, joinReview, joinLVMin), playerID)
family.SetJoinReview(joinReview)
family.SetJoinLVMin(joinLVMin)
- Broadcast_FamilyInfo(familyID, isSyncMem=False)
+ Broadcast_FamilyInfo(familyID, isSyncMem=False) # 修改招人
return
#// A6 23 修改家族公告 #tagCMChangeFamilyBroadcast
@@ -1158,7 +1168,7 @@
return
family.SetBroadcast(broadcast)
GameWorld.DebugLog('更改公会公告: Family=%s,公告=%s' % (GameWorld.CodeToGbk(family.GetName()), GameWorld.CodeToGbk(broadcast)), playerID)
- Broadcast_FamilyInfo(familyID, isSyncMem=False)
+ Broadcast_FamilyInfo(familyID, isSyncMem=False) # 修改公告
return
#// A6 24 修改家族徽章 #tagCMChangeFamilyEmblem
@@ -1265,7 +1275,7 @@
if isGMOP:
family.SetBroadcast("")
- Broadcast_FamilyInfo(familyID, changeMemIDList=changeMemIDList)
+ Broadcast_FamilyInfo(familyID, changeMemIDList=changeMemIDList) # 修改职位
return True
def ChangeFamilyLeader(family, newLeaderMem):
@@ -1298,7 +1308,7 @@
tagCrossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(tagID)
if tagCrossPlayer:
- MapServer_FamilyRefresh(tagCrossPlayer, familyID)
+ MapServer_FamilyRefresh(tagCrossPlayer, familyID) # 修改职位
if GetFamilyMemberHasPow(tagMember, FamilyPowerID_Call):
CrossPlayer.SendFakePack(tagCrossPlayer, GetPack_FamilyReqJoinInfo(familyID))
@@ -1308,8 +1318,7 @@
[ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_FMLV, changeFamilyLV, befFamilyLV], tick)
#xx被任命为xx
- #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV])
- #GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # 成员职位变更
+ CrossPlayer.FamilyNotify(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV])
return
def __AutoChangeLeader(curFamily):
@@ -1376,7 +1385,7 @@
GameWorld.Log("公会自动传位: familyID=%s,leaderID=%s,offTime=%s,passHours=%s,newLeaderID=%s"
% (familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, newLeaderID))
ChangeFamilyLeader(curFamily, toMember)
- Broadcast_FamilyInfo(familyID, changeMemIDList=[leaderID, newLeaderID])
+ Broadcast_FamilyInfo(familyID, changeMemIDList=[leaderID, newLeaderID]) # 自动传位
# 邮件通知
toServerID = toMember.GetServerID()
@@ -1437,12 +1446,11 @@
AddFamilyActionNote(crossPlayer.GetPlayerName(), familyID, ShareDefine.Def_ActionType_FamilyEvent,
[ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Leave], tick)
- #XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n> 25 - -
- #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
-
__DoPlayerLeaveFamilyByID(family, playerID, crossPlayer)
- MapServer_FamilyRefresh(crossPlayer, 0, 1)
+ MapServer_FamilyRefresh(crossPlayer, 0, 1) # 主动退出
CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyDel(playerID, crossPlayer.GetPlayerName(), 1))
+ CrossPlayer.FamilyNotify(familyID, "XW_JZ_LeaveFamily", [crossPlayer.GetPlayerName()])
+ Broadcast_FamilyInfo(familyID, isSyncMem=False) # 退出
if family.GetCount() == 0:
#玩家离开后, 家族没有人了 , 删除这个家族
@@ -1508,15 +1516,17 @@
[ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_KickOut], tick)
#XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n> 25 - -
- #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [tagPlayerName])
+ CrossPlayer.FamilyNotify(familyID, "XW_JZ_LeaveFamily", [tagPlayerName])
#删除玩家
- crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(tagMemberID)
- __DoPlayerLeaveFamilyByID(family, tagPlayerID, crossPlayer)
- if crossPlayer:
- MapServer_FamilyRefresh(crossPlayer, 0)
+ tagCrossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(tagMemberID)
+ __DoPlayerLeaveFamilyByID(family, tagPlayerID, tagCrossPlayer)
+ if tagCrossPlayer:
+ MapServer_FamilyRefresh(tagCrossPlayer, 0) # 被踢
+ CrossPlayer.NotifyCode(tagCrossPlayer, "XW_JZ_LeaveFamilyKick", [curMember.GetPlayerName()])
CrossPlayer.SendFakePackByFamily(familyID, GetPack_FamilyDel(tagMemberID, tagPlayerName, 0))
+ Broadcast_FamilyInfo(familyID, isSyncMem=False) # 踢人
return
def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, crossPlayer=None):
@@ -1593,11 +1603,66 @@
memCrossPlayer = crossPlayerMgr.FindCrossPlayer(memID)
if not memCrossPlayer:
continue
- MapServer_FamilyRefresh(memCrossPlayer, familyID)
+ MapServer_FamilyRefresh(memCrossPlayer, familyID) # 改名
#player.Notify_FamilyNameRefresh() #//04 36 周围玩家家族名刷新#tagPlayerFamilyNameRefresh
- Broadcast_FamilyInfo(familyID, isSyncMem=False)
+ Broadcast_FamilyInfo(familyID, isSyncMem=False) # 改名
return True
+
+#// A6 19 查看目标公会 #tagCSViewTagFamily
+#
+#struct tagCSViewTagFamily
+#{
+# tagHead Head;
+# DWORD FamilyID;
+# DWORD DataServerID; //数据所在服务器ID
+#};
+def OnViewTagFamily(index, clientData, tick):
+ curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
+ playerID = curPlayer.GetPlayerID()
+ tagFamilyID = clientData.FamilyID
+ dataServerID = clientData.DataServerID
+
+ # 本服或主服是本服
+ if not dataServerID or dataServerID == GameWorld.GetGameWorld().GetServerID():
+ NetPackCommon.SendFakePack(curPlayer, GetTagFamilyInfoPack(tagFamilyID))
+ return
+
+ CrossMsg.SendToServer(ShareDefine.S2S_ViewTagFamily, {"tagFamilyID":tagFamilyID}, [dataServerID], ShareDefine.dirType_All, playerID)
+ return
+
+def S2S_ViewTagFamily(dataMsg, fromServerID, playerID):
+ tagFamilyID = dataMsg["tagFamilyID"]
+ CrossPlayer.SendFakePackByID(playerID, GetTagFamilyInfoPack(tagFamilyID), fromServerID)
+ return
+
+def GetTagFamilyInfoPack(tagFamilyID):
+ familyMgr = DBDataMgr.GetFamilyMgr()
+ family = familyMgr.FindFamily(tagFamilyID)
+ if not family:
+ GameWorld.ErrLog("本服数据找不到目标公会! tagFamilyID=%s" % tagFamilyID)
+ return
+ clientPack = ChPyNetSendPack.tagSCTagFamilyInfo()
+ clientPack.FamilyID = family.GetID()
+ clientPack.FamilyName = family.GetName()
+ clientPack.FamilyNameLen = len(clientPack.FamilyName)
+ clientPack.LeaderID = family.GetLeaderID()
+ leaderMember = family.FindMember(clientPack.LeaderID)
+ if leaderMember:
+ clientPack.LeaderName = leaderMember.GetPlayerName()
+ clientPack.LeaderNameLen = len(clientPack.LeaderName)
+ clientPack.LeaderServerID = leaderMember.GetServerID()
+ clientPack.FamilyLV = family.GetLV()
+ clientPack.ServerID = family.GetServerID()
+ clientPack.EmblemID = family.GetEmblemID()
+ clientPack.EmblemWord = family.GetEmblemWord()
+ clientPack.FightPower = family.GetFightPower()
+ clientPack.FightPowerEx = family.GetFightPowerEx()
+ clientPack.Broadcast = family.GetBroadcast()
+ clientPack.BroadcastLen = len(clientPack.Broadcast)
+ clientPack.MemberCount = family.GetCount()
+ clientPack.DataServerID = GameWorld.GetGameWorld().GetServerID()
+ return clientPack
#// A6 20 搜索家族列表 #tagCMViewFamilyPage
#
@@ -1687,6 +1752,7 @@
clientPack.FamilyCount = len(clientPack.FamilyList)
if clientPack.FamilyCount >= showCount:
break
+ clientPack.DataServerID = GameWorld.GetGameWorld().GetServerID()
CrossPlayer.SendFakePack(crossPlayer, clientPack)
return
@@ -1815,7 +1881,7 @@
curFamily.SetLV(updLV)
curFamily.SetExp(updExp)
- Broadcast_FamilyInfo(familyID, isSyncMem=False)
+ Broadcast_FamilyInfo(familyID, isSyncMem=False) # 公会经验
return True
def AddFamilyContrib(curPlayer, addContribValue):
@@ -1847,7 +1913,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, isSyncMem=False) # 成员贡献
return
## ------------------------------------------------------------------------------------------------
@@ -1970,6 +2036,7 @@
return
def Do_MapServer_PlayerLogin(curPlayer):
+ DBFamily.Sync_FamilyCrossInfo(curPlayer)
SyncDonateCntInfo(curPlayer)
PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
return
--
Gitblit v1.8.0