ServerPython/CoreServerGroup/GameServer/Script/GM/Commands/CreateFamily.py
@@ -18,7 +18,10 @@
import ShareDefine
import PlayerFamily
import GameWorldFamilyWar
import IPY_GameServer
import random
FackFamilyIDStart = 1000000000
## 执行逻辑
#  @param curPlayer 当前玩家
@@ -27,11 +30,17 @@
def OnExec(curPlayer, gmList):
    
    if not gmList:
        GameWorld.DebugAnswer(curPlayer, "CreatFamily 创建假仙盟个数 可选参数(仙盟等级 是否设置联赛名次)")
        GameWorld.DebugAnswer(curPlayer, "删除创建的假仙盟: CreatFamily 0")
        GameWorld.DebugAnswer(curPlayer, "创建跨服假仙盟: CreatFamily c 个数 [总战力 ServerID 等级 成员数]")
        GameWorld.DebugAnswer(curPlayer, "删除跨服假仙盟: CreatFamily c 0")
        GameWorld.DebugAnswer(curPlayer, "创建本服假仙盟: CreatFamily 个数 [等级 设置联赛名次]")
        GameWorld.DebugAnswer(curPlayer, "删除本服假仙盟: CreatFamily 0")
        return
    
    creatCount = gmList[0]
    value1 = gmList[0]
    if value1 == "c":
        return
    creatCount = value1
    if creatCount <= 0:
        delFamilyList = []
        familyManager = GameWorld.GetFamilyManager()
@@ -94,4 +103,135 @@
    PlayerFamily.DoFamilySort()
    return
def OnGetMergeParam(curPlayer):
    return []
def OnMergeServerExec(gmList, tick):
    ## 跨服执行命令
    if not gmList:
        return
    value1 = gmList[0]
    if value1 != "c":
        return
    value2 = gmList[1] if len(gmList) > 1 else 1 # 默认1个
    if not value2:
        __delMergeServerFackFamily()
        return
    __createMergeServerFackFamily(gmList)
    return
def __delMergeServerFackFamily():
    delCnt = 0
    familyManager = GameWorld.GetFamilyManager()
    for i in range(familyManager.GetCount())[::-1]:
        family = familyManager.GetAt(i)
        if not family:
            continue
        if family.GetID() >= FackFamilyIDStart:
            familyManager.DelFamily(family.GetID())
            delCnt += 1
    GameWorld.DebugAnswer(None, "成功删除跨服假仙盟: %s,剩余:%s" % (delCnt, familyManager.GetCount()))
    return
def __createMergeServerFackFamily(gmList):
    ## c 个数 [总战力 ServerID 等级 成员数]
    creatCount = gmList[1] if len(gmList) > 1 else 1 # 默认1个
    familyFightPower = gmList[2] if len(gmList) > 2 else 10000000
    serverID = gmList[3] if len(gmList) > 3 else random.randint(1, 200)
    familyLV = gmList[4] if len(gmList) > 4 else 1 # 默认1级
    memberCnt = gmList[5] if len(gmList) > 5 else random.randint(1, 10)
    FakeFamilyName = "假仙盟".decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
    FakeMemberName = "假成员".decode(ShareDefine.Def_Game_Character_Encoding).encode(GameWorld.GetCharacterEncoding())
    fackFamilyID = FackFamilyIDStart # 跨服假仙盟ID从10亿开始,因为子服的仙盟ID分配是从1开始
    fackFamilyIDMax = fackFamilyID + 10000 # 限制最大假盟数
    fackMemID = 1 # 假成员 1~9999
    fackMemIDMax = 9999
    fackMemIDList = []
    createOKCnt = 0
    familyManager = GameWorld.GetFamilyManager()
    for _ in range(min(creatCount, 100)):
        fackFamily = familyManager.FindFamily(fackFamilyID)
        while fackFamily and fackFamilyID < 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 = familyManager.FindFamily(fackFamilyID)
        if fackFamily:
            break
        fackFamilyName = "%s%s" % (FakeFamilyName, fackFamilyID)
        fackFamily = familyManager.AddFamilyEx(fackFamilyName, fackFamilyID)
        fackFamilyID += 1
        if not fackFamily:
            continue
        fackFamily.SetLV(familyLV)
        PlayerFamily.SetFamilyTotalFightPower(fackFamily, familyFightPower)
        PlayerFamily.SetFamilyEmblemID(fackFamily, 1)
        fackFamily.SetServerID(serverID)
        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
            fackMemName = "%s%s" % (FakeMemberName, fackMemID)
            member = fackFamily.AddMemberEx(fackMemID)
            if not member:
                continue
            member.SetName(fackMemName)
            member.SetLV(random.randint(100, 200))
            member.SetJob(random.randint(1, 2))
            member.SetOfficialRank(random.randint(1, 20))
            if not fackFamily.GetLeaderID():
                member.SetFamilyLV(IPY_GameServer.fmlLeader)
                fackFamily.SetLeaderID(fackMemID)
                fackFamily.SetLeaderName(fackMemName)
                fackFamily.SetLeaderOfficialRank(member.GetOfficialRank())
            fackMemID += 1
        # 根据成功创建的成员平均分配总战力
        memFightPowerTotal = familyFightPower
        memCnt = fackFamily.GetCount()
        avgValue = memFightPowerTotal / memCnt
        for m in range(memCnt):
            member = fackFamily.GetAt(m)
            memID = member.GetPlayerID()
            fmLV = member.GetFamilyLV()
            if m == memCnt - 1:
                memFightPower = memFightPowerTotal
            else:
                memFightPower = avgValue + memCnt / 2 - m
                memFightPowerTotal -= memFightPower
            PlayerFamily.SetMemberFightPower(member, memFightPower)
            GameWorld.DebugLog("    仙盟成员: memID=%s,memFightPower=%s,fmLV=%s" % (memID, memFightPower, fmLV))
        createOKCnt += 1
        familyFightPower += 10000
    GameWorld.DebugAnswer(None, "成功创建跨服假仙盟: %s,总:%s" % (creatCount, familyManager.GetCount()))
    return