| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GM.Commands.CreateFamily  | 
| #  | 
| # @todo:´´½¨¼ÙÏÉÃË  | 
| # @author hxp  | 
| # @date 2025-05-09  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ´´½¨¼ÙÏÉÃË  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2025-05-09 12:20"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import ShareDefine  | 
| import IPY_PlayerDefine  | 
| import PlayerFamily  | 
| import DBDataMgr  | 
| import random  | 
|   | 
| ## Ö´ÐÐÂß¼  | 
| #  @param curPlayer µ±Ç°Íæ¼Ò  | 
| #  @param gmList []  | 
| #  @return None  | 
| def OnExec(curPlayer, gmList):  | 
|       | 
|     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]")  | 
|         return  | 
|       | 
|     value1 = gmList[0]  | 
|     if value1 == "c":  | 
|         # ¿ç·þÃüÁî  | 
|         return  | 
|       | 
|     if value1 == "pl":  | 
|         __printFamilyList(curPlayer, gmList)  | 
|         return  | 
|       | 
|     if value1 == "pf":  | 
|         __printFamilyInfo(curPlayer, gmList)  | 
|         return  | 
|       | 
|     if value1 == "j":  | 
|         __addFackRequestJoin(curPlayer, gmList)  | 
|         return  | 
|       | 
|     creatCount = value1  | 
|     if creatCount <= 0:  | 
|         __delFackFamily(curPlayer)  | 
|         return  | 
|     __createFackFamily(curPlayer, gmList)  | 
|     return  | 
|   | 
| def __addFackRequestJoin(curPlayer, gmList):  | 
|     reqCnt = gmList[1] if len(gmList) > 1 else 1  | 
|     familyID = gmList[2] if len(gmList) > 2 else curPlayer.GetFamilyID()  | 
|       | 
|     familyMgr = DBDataMgr.GetFamilyMgr()  | 
|     family = familyMgr.FindFamily(familyID)  | 
|     if not family:  | 
|         GameWorld.DebugAnswer(curPlayer, "ûÓиÃÏÉÃË: %s" % familyID)  | 
|         return  | 
|       | 
|     reqCnt = min(reqCnt, 100)  | 
|     fackIDList = range(1, 200)  | 
|     random.shuffle(fackIDList)  | 
|     addCnt = 0  | 
|     reqDict = family.GetReqJoinPlayerInfo()  | 
|     for fackID in fackIDList:  | 
|         if fackID in reqDict:  | 
|             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())))  | 
|     return  | 
|   | 
| def __printFamilyList(curPlayer, gmList):  | 
|     printCnt = gmList[1] if len(gmList) > 1 else 100  | 
|     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)  | 
|               | 
|     return  | 
|   | 
| def __printFamilyInfo(curPlayer, gmList):  | 
|     familyID = gmList[1] if len(gmList) > 1 else curPlayer.GetFamilyID()  | 
|       | 
|     familyMgr = DBDataMgr.GetFamilyMgr()  | 
|     family = familyMgr.FindFamily(familyID)  | 
|     if not family:  | 
|         GameWorld.DebugAnswer(curPlayer, "ÏÉÃ˲»´æÔÚ: %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" % (family.GetEmblemID()))  | 
|     GameWorld.DebugAnswer(curPlayer, "×ÜÕ½Á¦:%s,ÈËÊý:%s" % (family.GetFightPowerTotal(), family.GetCount()))  | 
|     GameWorld.DebugAnswer(curPlayer, "ÃËÖ÷:%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))  | 
|           | 
|     return  | 
|   | 
| def __delFackFamily(curPlayer):  | 
|       | 
|     delCnt = 0  | 
|     familyMgr = DBDataMgr.GetFamilyMgr()  | 
|     for index in range(familyMgr.GetCount())[::-1]:  | 
|         family = familyMgr.GetAt(index)  | 
|         familyID = family.GetID()  | 
|         if familyID > ShareDefine.FackFamilyIDMax:  | 
|             continue  | 
|         familyMgr.DelFamily(family.GetID())  | 
|           | 
|     if curPlayer:  | 
|         GameWorld.DebugAnswer(curPlayer, "ɾ³ý¼ÙÏÉÃËÊý: %s,Ê£Óà:%s" % (delCnt, familyMgr.GetCount()))  | 
|     elif GameWorld.IsCrossServer():  | 
|         GameWorld.DebugAnswer(None, "ɾ³ý¿ç·þ¼ÙÏÉÃË: %s,Ê£Óà:%s" % (delCnt, familyMgr.GetCount()))  | 
|     return  | 
|   | 
| def __createFackFamily(curPlayer, 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)  | 
|     familyLV = gmList[3] if len(gmList) > 3 else 1 # Ä¬ÈÏ1¼¶  | 
|     memberCnt = gmList[4] if len(gmList) > 4 else random.randint(1, 10)  | 
|       | 
|     FakeFamilyName = GameWorld.GbkToCode("ÉñÃØ¾üÍÅ")  | 
|       | 
|     fackFamilyID = ShareDefine.FackFamilyIDStart  | 
|     fackMemID = ShareDefine.FackPlayerIDStart  | 
|     fackMemIDMax = ShareDefine.FackPlayerIDMax  | 
|       | 
|     fackMemIDList = []  | 
|     createOKCnt = 0  | 
|     familyMgr = DBDataMgr.GetFamilyMgr()  | 
|     for _ in range(min(creatCount, 100)):  | 
|         fackFamily = familyMgr.FindFamily(fackFamilyID)  | 
|         while fackFamily and fackFamilyID < ShareDefine.FackFamilyIDMax:  | 
|             for m in xrange(fackFamily.GetCount()):  | 
|                 member = fackFamily.GetAt(m)  | 
|                 memID = member.GetPlayerID()  | 
|                 if memID and memID not in fackMemIDList:  | 
|                     fackMemIDList.append(memID)  | 
|             fackFamilyID += 1  | 
|             fackFamily = familyMgr.FindFamily(fackFamilyID)  | 
|               | 
|         if fackFamily:  | 
|             break  | 
|           | 
|         fackFamilyName = "%s%s" % (FakeFamilyName, fackFamilyID)  | 
|         fackFamily = familyMgr.AddFamily(fackFamilyID, fackFamilyName, serverID)  | 
|         fackFamilyID += 1  | 
|         if not fackFamily:  | 
|             continue  | 
|           | 
|         fackFamily.SetLV(familyLV)  | 
|         fackFamily.SetFightPowerTotal(familyFightPower)  | 
|         fackFamily.SetEmblemID(1)  | 
|         fackFamily.SetJoinReview(1) # ÉèÖÃÐèÒªÉóºË  | 
|         fackFamily.SetJoinLVMin(random.randint(0, 1000))  | 
|           | 
|         GameWorld.DebugLog("´´½¨¼ÙÏÉÃË: fackFamilyID=%s,serverID=%s,familyFightPower=%s,memberCnt=%s"   | 
|                            % (fackFamilyID, serverID, familyFightPower, memberCnt))  | 
|         for _ in range(memberCnt):  | 
|               | 
|             while fackMemID in fackMemIDList and fackMemID < fackMemIDMax:  | 
|                 fackMemID += 1  | 
|                       | 
|             if fackMemID in fackMemIDList:  | 
|                 break  | 
|               | 
|             member = fackFamily.AddMember(fackMemID)  | 
|             if not member:  | 
|                 continue  | 
|               | 
|             if not fackFamily.GetLeaderID():  | 
|                 member.SetFmLV(IPY_PlayerDefine.fmlLeader)  | 
|                 fackFamily.SetLeaderID(fackMemID)  | 
|                   | 
|             fackMemID += 1  | 
|               | 
|         # ¸ù¾Ý³É¹¦´´½¨µÄ³ÉԱƽ¾ù·ÖÅä×ÜÕ½Á¦  | 
|         memFightPowerTotal = familyFightPower  | 
|         memCnt = fackFamily.GetCount()  | 
|         avgValue = memFightPowerTotal / memCnt  | 
|         for m in range(memCnt):  | 
|             member = fackFamily.GetAt(m)  | 
|             memID = member.GetPlayerID()  | 
|             fmLV = member.GetFmLV()  | 
|             if m == memCnt - 1:  | 
|                 memFightPower = memFightPowerTotal  | 
|             else:  | 
|                 memFightPower = avgValue + memCnt / 2 - m  | 
|                 memFightPowerTotal -= memFightPower  | 
|             viewCache = DBDataMgr.GetPlayerViewCacheMgr().FindViewCache(memID, True)  | 
|             viewCache.SetFightPowerTotal(memFightPower)  | 
|             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()))  | 
|     return  |