From 6343277477b190efbc389bab2706cf94eb09be8d Mon Sep 17 00:00:00 2001
From: hxp <ale99527@vip.qq.com>
Date: 星期六, 07 二月 2026 20:59:32 +0800
Subject: [PATCH] 358 【内政】红颜系统-服务端(红颜时装默认解锁的状态也通知;红颜时装物品解锁改为直接取背包中的物品;)

---
 ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py |  226 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 149 insertions(+), 77 deletions(-)

diff --git a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
index beee8be..56f9470 100644
--- a/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
+++ b/ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/CreateFamily.py
@@ -4,12 +4,12 @@
 #
 ##@package GM.Commands.CreateFamily
 #
-# @todo:创建假仙盟
+# @todo:创建假公会
 # @author hxp
 # @date 2025-05-09
 # @version 1.0
 #
-# 详细描述: 创建假仙盟
+# 详细描述: 创建假公会
 #
 #-------------------------------------------------------------------------------
 #"""Version = 2025-05-09 12:20"""
@@ -20,57 +20,129 @@
 import PlayerViewCache
 import IPY_PlayerDefine
 import PlayerFamily
+import CrossPlayer
 import DBDataMgr
 import random
 
-## 执行逻辑
-#  @param curPlayer 当前玩家
-#  @param gmList []
-#  @return None
+def GetGMServerIDList(curPlayer):
+    ## 获取命令额外发送到其他服务器,如跨服
+    crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
+    if crossServerID:
+        GameWorld.DebugAnswer(curPlayer, "本服公会已互通跨服ID:%s" % crossServerID)
+        return [crossServerID]
+    GameWorld.DebugAnswer(curPlayer, "本服公会未互通")
+    return []
+
 def OnExec(curPlayer, gmList):
+    ## 游戏服执行命令
     
+    isMainServer = GameWorld.IsMainServer()
     if not gmList:
-        #GameWorld.DebugAnswer(curPlayer, "创建跨服假仙盟: CreatFamily c 个数 [总战力 ServerID 等级 成员数]")
-        #GameWorld.DebugAnswer(curPlayer, "删除跨服假仙盟: CreatFamily c 0")
-        GameWorld.DebugAnswer(curPlayer, "建本服假仙盟: CreatFamily 个数 [总战力 ServerID 等级 成员数]")
-        GameWorld.DebugAnswer(curPlayer, "删本服假仙盟: CreatFamily 0")
-        GameWorld.DebugAnswer(curPlayer, "输出仙盟列表: CreatFamily pl [条数 从第x名]")
-        GameWorld.DebugAnswer(curPlayer, "输出仙盟明细: CreatFamily pf 仙盟ID")
-        GameWorld.DebugAnswer(curPlayer, "添加假申请人: CreatFamily j [申请数 仙盟ID]")
+        if not isMainServer:
+            return
+        GameWorld.DebugAnswer(curPlayer, "-----%s-----" % GameWorld.GetCurrentDataTimeStr())
+        GameWorld.DebugAnswer(curPlayer, "创建假人公会: CreatFamily 个数 [总战力 ServerID 等级 成员数  是否审核 官职限制]")
+        GameWorld.DebugAnswer(curPlayer, "删除假人公会: CreatFamily 0")
+        GameWorld.DebugAnswer(curPlayer, "输出公会列表: CreatFamily pl [条数 从第x名]")
+        GameWorld.DebugAnswer(curPlayer, "输出公会明细: CreatFamily pf 公会ID")
+        GameWorld.DebugAnswer(curPlayer, "添加假申请人: CreatFamily sq [申请数 公会ID]")
+        GameWorld.DebugAnswer(curPlayer, "添加公会成员: CreatFamily m 人数 [公会ID]")
         return
     
+    if isMainServer:
+        crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
+        if crossServerID:
+            # 本服公会已互通不再执行本服命令
+            return
+        
+    crossPlayer = CrossPlayer.GetCrossPlayerMgr().FindCrossPlayer(curPlayer.GetPlayerID())
+    if not crossPlayer:
+        return
+    
+    if GameWorld.IsCrossServer():
+        playerID = crossPlayer.GetPlayerID()
+        familyMgr = DBDataMgr.GetFamilyMgr()
+        familyID = familyMgr.GetPlayerFamilyID(playerID)
+        zoneID = familyMgr.GetFamilyZoneID(familyID)
+        GameWorld.DebugAnswer(crossPlayer, "跨服公会ID:%s,zoneID=%s" % (familyID, zoneID))
+        
     value1 = gmList[0]
-    if value1 == "c":
-        # 跨服命令
-        return
-    
     if value1 == "pl":
-        __printFamilyList(curPlayer, gmList)
+        __printFamilyList(crossPlayer, gmList)
         return
     
     if value1 == "pf":
-        __printFamilyInfo(curPlayer, gmList)
+        __printFamilyInfo(crossPlayer, gmList)
         return
     
-    if value1 == "j":
-        __addFackRequestJoin(curPlayer, gmList)
+    if value1 == "sq":
+        __addFackRequestJoin(crossPlayer, gmList)
+        return
+    
+    if value1 == "m":
+        __addFackMember(crossPlayer, gmList)
         return
     
     creatCount = value1
     if creatCount <= 0:
-        __delFackFamily(curPlayer)
+        __delFackFamily(crossPlayer)
         return
-    __createFackFamily(curPlayer, gmList)
+    __createFackFamily(crossPlayer, gmList)
     return
 
-def __addFackRequestJoin(curPlayer, gmList):
+def __addFackMember(crossPlayer, gmList):
+    memCnt = gmList[1] if len(gmList) > 1 else 1
+    familyID = gmList[2] if len(gmList) > 2 else crossPlayer.GetFamilyID()
+    
+    familyMgr = DBDataMgr.GetFamilyMgr()
+    curFamily = familyMgr.FindFamily(familyID)
+    if not curFamily:
+        GameWorld.DebugAnswer(crossPlayer, "没有该公会: %s" % familyID)
+        return
+    
+    MemberMax = PlayerFamily.GetFamilySetting(curFamily.GetLV(), "MemberMax")
+    if curFamily.GetCount() >= MemberMax:
+        GameWorld.DebugAnswer(crossPlayer, "成员已满: %s" % MemberMax)
+        return
+    memCnt = min(memCnt, MemberMax - curFamily.GetCount())
+    
+    curZoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(familyID)
+    if not curZoneMgr:
+        return
+    
+    fackIDStart = 0
+    for zoneID in familyMgr.GetZoneIDListThisServer():
+        zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID)
+        for i in range(0, zoneMgr.GetCount()):
+            family = zoneMgr.GetAt(i)
+            for index in xrange(family.GetCount()):
+                member = family.GetAt(index)
+                memID = member.GetPlayerID()
+                if memID > ShareDefine.FackPlayerIDMax:
+                    continue
+                fackIDStart = max(memID, fackIDStart)
+            
+    addCnt = 0
+    for i in range(memCnt):
+        fackID = fackIDStart + i + 1
+        if fackID >= ShareDefine.FackPlayerIDMax:
+            break
+        PlayerFamily.DoPlayerJionFamily(curFamily, fackID, None, broadcastFamilyChange=False)
+        addCnt += 1
+        
+    curZoneMgr.Sort()
+    PlayerFamily.Sync_FamilyInfo(crossPlayer)
+    GameWorld.DebugAnswer(crossPlayer, "增加成员数:%s, 总成员:%s" % (addCnt, curFamily.GetCount()))
+    return
+
+def __addFackRequestJoin(crossPlayer, gmList):
     reqCnt = gmList[1] if len(gmList) > 1 else 1
-    familyID = gmList[2] if len(gmList) > 2 else curPlayer.GetFamilyID()
+    familyID = gmList[2] if len(gmList) > 2 else crossPlayer.GetFamilyID()
     
     familyMgr = DBDataMgr.GetFamilyMgr()
     family = familyMgr.FindFamily(familyID)
     if not family:
-        GameWorld.DebugAnswer(curPlayer, "没有该仙盟: %s" % familyID)
+        GameWorld.DebugAnswer(crossPlayer, "没有该公会: %s" % familyID)
         return
     
     reqCnt = min(reqCnt, 100)
@@ -81,89 +153,93 @@
     for fackID in fackIDList:
         if fackID in reqDict:
             continue
+        if familyMgr.GetPlayerFamilyID(fackID):
+            continue
         family.AddReqJoinPlayerID(fackID)
         addCnt += 1
         if addCnt >= reqCnt:
             break
     # 广播给有招人权限的
-    clientPack = PlayerFamily.GetPack_FamilyReqJoinInfo(familyID)
-    PlayerFamily.Broadcast_FamilyPack(familyID, clientPack, PlayerFamily.FamilyPowerID_Call)
-    GameWorld.DebugAnswer(curPlayer, "增加申请数:%s, 总申请:%s" % (addCnt, len(family.GetReqJoinPlayerInfo())))
+    PlayerFamily.SendFamilyReqJoinInfo(familyID)
+    GameWorld.DebugAnswer(crossPlayer, "增加申请数:%s, 总申请:%s" % (addCnt, len(family.GetReqJoinPlayerInfo())))
     return
 
-def __printFamilyList(curPlayer, gmList):
-    printCnt = gmList[1] if len(gmList) > 1 else 100
+def __printFamilyList(crossPlayer, gmList):
+    printCnt = gmList[1] if len(gmList) > 1 else 20
     fromIndex = gmList[2] if len(gmList) > 2 else 0
     
     printAnswerCnt = 0
     familyMgr = DBDataMgr.GetFamilyMgr()
-    familyMgr.Sort()
-    familyCnt = familyMgr.GetCount()
-    GameWorld.DebugAnswer(curPlayer, "仙盟总数: %s" % familyCnt)
-    for index in range(fromIndex, fromIndex + printCnt):
-        if index >= familyCnt:
-            break
-        family = familyMgr.GetAt(index)
-        rank = index + 1
-        
-        text = "%s,ID:%s,LV:%s,战力:%s,成员:%s" % (rank, family.GetID(), family.GetLV(), family.GetFightPowerTotal(), family.GetCount())
-        printAnswerCnt += 1
-        if printAnswerCnt <= 100:
-            GameWorld.DebugAnswer(curPlayer, text)
-        else:
-            GameWorld.DebugLog(text)
+    zoneIDList = familyMgr.GetZoneIDListThisServer()
+    for zoneID in zoneIDList:
+        zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID)
+        zoneMgr.Sort()
+        familyCnt = zoneMgr.GetCount()
+        GameWorld.DebugAnswer(crossPlayer, "----- 【分区%s】公会总数: %s -----" % (zoneID, familyCnt))
+        for index in range(fromIndex, fromIndex + printCnt):
+            if index >= familyCnt:
+                break
+            family = zoneMgr.GetAt(index)
+            rank = index + 1
+            
+            text = "%s,ID:%s,LV:%s,战:%s,成:%s,审:%s,官:%s" % (rank, family.GetID(), family.GetLV(), family.GetFightPowerTotal(), family.GetCount(), family.GetJoinReview(), family.GetJoinLVMin())
+            printAnswerCnt += 1
+            if printAnswerCnt <= 100:
+                GameWorld.DebugAnswer(crossPlayer, text)
+            else:
+                GameWorld.DebugLog(text)
             
     return
 
-def __printFamilyInfo(curPlayer, gmList):
-    familyID = gmList[1] if len(gmList) > 1 else curPlayer.GetFamilyID()
+def __printFamilyInfo(crossPlayer, gmList):
+    familyID = gmList[1] if len(gmList) > 1 else crossPlayer.GetFamilyID()
     
     familyMgr = DBDataMgr.GetFamilyMgr()
     family = familyMgr.FindFamily(familyID)
     if not family:
-        GameWorld.DebugAnswer(curPlayer, "仙盟不存在: %s" % familyID)
+        GameWorld.DebugAnswer(crossPlayer, "公会不存在: %s" % familyID)
         return
     
-    GameWorld.DebugAnswer(curPlayer, "----- 【%s】 -----" % (GameWorld.CodeToGbk(family.GetName())))
-    GameWorld.DebugAnswer(curPlayer, "仙盟ID:%s,ServerID:%s" % (familyID, family.GetServerID()))
-    GameWorld.DebugAnswer(curPlayer, "LV:%s,Exp:%s" % (family.GetLV(), family.GetExp()))
-    GameWorld.DebugAnswer(curPlayer, "审核:%s,等级条件:%s,申请数:%s" % (family.GetJoinReview(), family.GetJoinLVMin(), len(family.GetReqJoinPlayerInfo())))
-    GameWorld.DebugAnswer(curPlayer, "徽章:%s,%s" % (family.GetEmblemID(), GameWorld.CodeToGbk(family.GetEmblemWord())))
-    GameWorld.DebugAnswer(curPlayer, "总战力:%s,人数:%s" % (family.GetFightPowerTotal(), family.GetCount()))
-    GameWorld.DebugAnswer(curPlayer, "盟主:%s" % (family.GetLeaderID()))
+    zoneID = familyMgr.GetFamilyZoneID(familyID)
+    GameWorld.DebugAnswer(crossPlayer, "----- 【%s】 -----" % (GameWorld.CodeToGbk(family.GetName())))
+    GameWorld.DebugAnswer(crossPlayer, "公会ID:%s, ServerID:%s, 分区:%s" % (familyID, family.GetServerID(), zoneID))
+    GameWorld.DebugAnswer(crossPlayer, "LV:%s, Exp:%s" % (family.GetLV(), family.GetExp()))
+    GameWorld.DebugAnswer(crossPlayer, "审核:%s, 官职条件:%s, 申请数:%s" % (family.GetJoinReview(), family.GetJoinLVMin(), len(family.GetReqJoinPlayerInfo())))
+    GameWorld.DebugAnswer(crossPlayer, "战旗:%s, 旗号【%s】" % (family.GetEmblemID(), GameWorld.CodeToGbk(family.GetEmblemWord())))
+    GameWorld.DebugAnswer(crossPlayer, "总战力:%s, 人数:%s" % (family.GetFightPowerTotal(), family.GetCount()))
+    GameWorld.DebugAnswer(crossPlayer, "盟主ID:%s" % (family.GetLeaderID()))
     for index in range(family.GetCount()):
         member = family.GetAt(index)
         playerID = member.GetPlayerID()
         fightPower = member.GetFightPowerTotal()
-        GameWorld.DebugAnswer(curPlayer, "%s,%s,职位:%s,战力:%s" % (index, playerID, member.GetFmLV(), fightPower))
+        GameWorld.DebugAnswer(crossPlayer, "%s,ID:%s,职位:%s,战力:%s" % (index, playerID, member.GetFmLV(), fightPower))
         
     return
 
-def __delFackFamily(curPlayer):
+def __delFackFamily(crossPlayer):
     
     delCnt = 0
     familyMgr = DBDataMgr.GetFamilyMgr()
-    for index in range(familyMgr.GetCount())[::-1]:
-        family = familyMgr.GetAt(index)
-        familyID = family.GetID()
+    for familyID in familyMgr.GetFamilyIDList():
         if familyID > ShareDefine.FackFamilyIDMax:
             continue
-        familyMgr.DelFamily(family.GetID())
+        delCnt += 1
+        familyMgr.DelFamily(familyID)
         
-    if curPlayer:
-        GameWorld.DebugAnswer(curPlayer, "删除假仙盟数: %s,剩余:%s" % (delCnt, familyMgr.GetCount()))
-    elif GameWorld.IsCrossServer():
-        GameWorld.DebugAnswer(None, "删除跨服假仙盟: %s,剩余:%s" % (delCnt, familyMgr.GetCount()))
+    remainCnt = len(familyMgr.GetFamilyIDList())
+    GameWorld.DebugAnswer(crossPlayer, "删除假公会数: %s,剩余:%s" % (delCnt, remainCnt))
     return
 
-def __createFackFamily(curPlayer, gmList):
+def __createFackFamily(crossPlayer, gmList):
     ## 个数 [总战力 ServerID 等级 成员数]
     
     creatCount = gmList[0] if len(gmList) > 0 else 1 # 默认1个
     familyFightPower = gmList[1] if len(gmList) > 1 else 10000000
-    serverID = gmList[2] if len(gmList) > 2 else random.randint(1, 200)
+    serverID = gmList[2] if len(gmList) > 2 else GameWorld.GetGameWorld().GetServerID() #random.randint(1, 200)
     familyLV = gmList[3] if len(gmList) > 3 else 1 # 默认1级
     memberCnt = gmList[4] if len(gmList) > 4 else random.randint(1, 10)
+    joinReview = gmList[5] if len(gmList) > 5 else 1
+    joinLVMin = gmList[6] if len(gmList) > 6 else random.randint(1, 10)
     
     FakeFamilyName = GameWorld.GbkToCode("神秘军团")
     FakeEmblemWord = GameWorld.GbkToCode("神")
@@ -199,10 +275,10 @@
         fackFamily.SetFightPowerTotal(familyFightPower)
         fackFamily.SetEmblemID(1)
         fackFamily.SetEmblemWord(FakeEmblemWord)
-        fackFamily.SetJoinReview(1) # 设置需要审核
-        fackFamily.SetJoinLVMin(random.randint(0, 1000))
+        fackFamily.SetJoinReview(joinReview) # 设置需要审核
+        fackFamily.SetJoinLVMin(joinLVMin) # 官职
         
-        GameWorld.DebugLog("创建假仙盟: fackFamilyID=%s,serverID=%s,familyFightPower=%s,memberCnt=%s" 
+        GameWorld.DebugLog("创建假公会: fackFamilyID=%s,serverID=%s,familyFightPower=%s,memberCnt=%s" 
                            % (fackFamilyID, serverID, familyFightPower, memberCnt))
         for _ in range(memberCnt):
             
@@ -237,15 +313,11 @@
                 memFightPowerTotal -= memFightPower
             viewCache = PlayerViewCache.FindViewCache(memID)
             viewCache.SetFightPowerTotal(memFightPower)
-            GameWorld.DebugLog("    仙盟成员: memID=%s,memFightPower=%s,fmLV=%s" % (memID, memFightPower, fmLV))
+            GameWorld.DebugLog("    公会成员: memID=%s,memFightPower=%s,fmLV=%s" % (memID, memFightPower, fmLV))
             member.RefreshMemberByID(memID)
             
         createOKCnt += 1
         familyFightPower += 10000
         
-    familyMgr.Sort()
-    if curPlayer:
-        GameWorld.DebugAnswer(curPlayer, "成功创建假仙盟: %s,剩余:%s" % (creatCount, familyMgr.GetCount()))
-    elif GameWorld.IsCrossServer():
-        GameWorld.DebugAnswer(None, "成功创建跨服假仙盟: %s,总:%s" % (creatCount, familyMgr.GetCount()))
+    GameWorld.DebugAnswer(crossPlayer, "成功创建假公会: %s,总:%s" % (creatCount, len(familyMgr.GetFamilyIDList())))
     return

--
Gitblit v1.8.0