hxp
2025-10-24 3432541b467d53ffe4ed3872c734e76638e30df8
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -23,8 +23,8 @@
import PlayerViewCache
import ChPyNetSendPack
import PlayerFamilyEmblem
#import PlayerFamilyZhenfa
import PlayerFamilyZhenbaoge
import PlayerFamilyTaofa
import IPY_PlayerDefine
import IpyGameDataPY
import IPY_GameWorld
@@ -82,8 +82,8 @@
        family = familyManager.GetAt(i)
        familyID = family.GetID()
        
        #珍宝阁
        PlayerFamilyZhenbaoge.OnDay(family)
        PlayerFamilyTaofa.OnDay(family)
        
        for index in xrange(family.GetCount()):
            member = family.GetAt(index)
@@ -100,6 +100,7 @@
        return
    ResetDailyDonateCnt(curPlayer)
    PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
    PlayerFamilyTaofa.PlayerOnDay(curPlayer)
    return
def OnPlayerLogin(curPlayer, tick):
@@ -108,8 +109,8 @@
    PlayerLoginRefreshFamily(curPlayer, tick)
    Sync_RequestAddFamilyInfo(curPlayer, False)
    SyncDonateCntInfo(curPlayer)
    #PlayerFamilyZhenfa.OnPlayerLogin(curPlayer)
    PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
    PlayerFamilyTaofa.OnPlayerLogin(curPlayer)
    return
def OnPlayerLogout(curPlayer):
@@ -126,7 +127,7 @@
        return
    curMember.SetOffTime(int(time.time()))
    #XW_JZ_LeaguerLeaveline  <n color="0,190,255">{%S1%}</n><n color="255,255,0">下线了!</n>    25  -   -
    NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerLeaveline", [curPlayer.GetPlayerName()])
    #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerLeaveline", [curPlayer.GetPlayerName()])
    Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogout, excludeIDList=[playerID])
    return
@@ -162,7 +163,7 @@
        NetPackCommon.SendFakePack(curPlayer, GetPack_FamilyReqJoinInfo(familyID))
            
    #XW_JZ_LeaguerOnline <n color="0,190,255">{%S1%}</n><n color="255,255,0">上线了!</n>    25  -   -
    NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerOnline", [curPlayer.GetName()], [playerID])
    #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerOnline", [curPlayer.GetName()], [playerID])
    Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogin, excludeIDList=[playerID])
    
    # 盟主上线处理
@@ -279,17 +280,17 @@
    
    if DirtyList.IsWordForbidden(familyName):
        #XW_JZ_Family_NameNoLegality 对不起,家族名称中含有非法字符
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_Family_NameNoLegality")
        PlayerControl.NotifyCode(curPlayer, "NameSensitive")
        return
    
    if len(familyName) <= 0 or len(familyName) > Def_CreatFamily_MaxStr:
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [Def_CreatFamily_MaxStr / 2, Def_CreatFamily_MaxStr])
        PlayerControl.NotifyCode(curPlayer, "NameLenLimit", [Def_CreatFamily_MaxStr / 3, Def_CreatFamily_MaxStr])
        return
    
    familyMgr = DBDataMgr.GetFamilyMgr()
    if familyMgr.FindFamilyByName(fullFamilyName):
        #XW_JZ_EstablishErr_Name    <n color="255,255,0">对不起,您输入的家族名已存在,建立家族失败!</n> 25  -   -
        PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishErr_Name")
        PlayerControl.NotifyCode(curPlayer, "NameExists")
        return
    
    return fullFamilyName
@@ -317,7 +318,7 @@
    maxLen = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 2)
    if len(fullName) > maxLen:
        GameWorld.ErrLog("仙盟全名 familyName=%s,全名=%s len=%s > %s, check FamilyNameFormat.txt" % (familyName, fullName, len(fullName), maxLen))
        PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [maxLen / 2, maxLen])
        PlayerControl.NotifyCode(curPlayer, "NameLenLimit", [maxLen / 3, maxLen])
        return ""
    
    return fullName
@@ -357,7 +358,7 @@
        if broadcastFamilyChange:
            Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=[playerID])
        #通知所有家族成员, 这个人加入了家族
        NotifyAllFamilyMemberMsg(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID])
        #NotifyAllFamilyMemberMsg(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID])
        if jionPlayer:
            PlayerControl.NotifyCode(jionPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()])
            
@@ -394,9 +395,10 @@
            setFunc(value)
    return True
def MapServer_FamilyRefresh(curPlayer, refreshFamilyID):
def MapServer_FamilyRefresh(curPlayer, refreshFamilyID, isVoluntarily=0):
    ''' 相当于GameServer调用 curPlayer.MapServer_FamilyRefresh()
    @param familyID: 玩家更新的familyID
    @param isVoluntarily: 是否自愿离开的,仅离开刷新时有效
    '''
    
    tick = GameWorld.GetGameWorld().GetTick()
@@ -443,7 +445,7 @@
        
    if lastFamilyID != 0 and curPlayer.GetFamilyID() == 0:
        #玩家离开家族
        __OnLeaveFamily(curPlayer, tick)
        __OnLeaveFamily(curPlayer, isVoluntarily, tick)
        
    elif lastFamilyID == 0 and curPlayer.GetFamilyID() != 0:
        #刚进家族并为族长,触发建家族事件
@@ -462,9 +464,10 @@
    familyMgr = DBDataMgr.GetFamilyMgr()
    familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
    Sync_RequestAddFamilyInfo(curPlayer)
    PlayerFamilyTaofa.OnPlayerEnterFamily(curPlayer)
    return
def __OnLeaveFamily(curPlayer, tick):
def __OnLeaveFamily(curPlayer, isVoluntarily, tick):
    ## 退出家族触发事件
    #---清空家族相关信息---
    curPlayer.SetPerExp(0)
@@ -473,7 +476,31 @@
    curPlayer.SetLastWeekFamilyActiveValue(0)
    curPlayer.SetFamilyLV(0)
    PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()))
    leaveCnt, kickedCnt, _ = PlayerControl.GetLeaveFamilyInfo(curPlayer)
    GameWorld.DebugLog("__OnLeaveFamily: isVoluntarily=%s,leaveCnt=%s,kickedCnt=%s" % (isVoluntarily, leaveCnt, kickedCnt))
    delMoneyType, delMoneyPer = IpyGameDataPY.GetFuncCfg("FamilyLeave", 3), 0
    if isVoluntarily:
        delMoneyPerList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 4)
        if delMoneyPerList:
            delMoneyPer = delMoneyPerList[leaveCnt] if len(delMoneyPerList) > leaveCnt else delMoneyPerList[-1]
        leaveCnt += 1
        GameWorld.DebugLog("    增加主动离开次数: leaveCnt=%s" % (leaveCnt))
    else:
        delMoneyPerList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 5)
        if delMoneyPerList:
            delMoneyPer = delMoneyPerList[kickedCnt] if len(delMoneyPerList) > kickedCnt else delMoneyPerList[-1]
        kickedCnt += 1
        GameWorld.DebugLog("    增加被踢离开次数: kickedCnt=%s" % (kickedCnt))
    PlayerControl.SetLeaveFamilyInfo(curPlayer, leaveCnt, kickedCnt, isVoluntarily)
    if delMoneyType and delMoneyPer:
        nowMoney = PlayerControl.GetMoney(curPlayer, delMoneyType)
        delMoney = int(nowMoney * delMoneyPer / 100.0)
        GameWorld.DebugLog("    扣除货币: delMoneyType=%s,delMoneyPer=%s,nowMoney=%s,delMoney=%s" % (delMoneyType, delMoneyPer, nowMoney, delMoney))
        PlayerControl.PayMoney(curPlayer, delMoneyType, delMoney, "LeaveFamily")
    PlayerFamilyTaofa.OnPlayerLeaveFamily(curPlayer)
    FBLogic.OnLeaveFamily(curPlayer, tick)
    return
@@ -645,12 +672,43 @@
        
    return
def CheckInJoinCD(curPlayer):
    ## 检查是否加入仙盟CD中
    leaveFamilyTime = PlayerControl.GetLeaveFamilyTimeEx(curPlayer)
    if not leaveFamilyTime:
        return False
    leaveCnt, kickedCnt, lastVoluntarily = PlayerControl.GetLeaveFamilyInfo(curPlayer)
    joinCDMinute = 0
    if lastVoluntarily:
        if leaveCnt <= 0:
            return False
        joinCDMinuteList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 1)
        if joinCDMinuteList:
            joinCDMinute = joinCDMinuteList[leaveCnt - 1] if len(joinCDMinuteList) >= leaveCnt else joinCDMinuteList[-1]
    else:
        if kickedCnt <= 0:
            return False
        joinCDMinuteList = IpyGameDataPY.GetFuncEvalCfg("FamilyLeave", 2)
        if joinCDMinuteList:
            joinCDMinute = joinCDMinuteList[kickedCnt - 1] if len(joinCDMinuteList) >= kickedCnt else joinCDMinuteList[-1]
    if joinCDMinute:
        cdTimes = joinCDMinute * 60
        passTimes = int(time.time()) - leaveFamilyTime
        if passTimes < cdTimes:
            GameWorld.DebugLog("加入仙盟CD中: leaveCnt=%s,kickedCnt=%s,lastVoluntarily=%s,leaveFamilyTime=%s(%s),passTimes=%s < %s"
                   % (leaveCnt, kickedCnt, lastVoluntarily, leaveFamilyTime, GameWorld.ChangeTimeNumToStr(leaveFamilyTime), passTimes, cdTimes))
            return True
    return False
def AutoJoinFamily(curPlayer):
    if curPlayer.GetFamilyID():
        return
    playerID = curPlayer.GetPlayerID()
    playerLV = curPlayer.GetLV()
    GameWorld.DebugLog("玩家一键自动加入家族! playerLV=%s" % playerLV, playerID)
    realmLV = curPlayer.GetOfficialRank()
    GameWorld.DebugLog("玩家一键自动加入家族! realmLV=%s" % realmLV, playerID)
    if CheckInJoinCD(curPlayer):
        return
    
    familyMgr = DBDataMgr.GetFamilyMgr()
    indexList = range(familyMgr.GetCount())
@@ -661,8 +719,8 @@
            continue
        familyID = family.GetID()
        lvMin = family.GetJoinLVMin()
        if lvMin and playerLV < lvMin:
            GameWorld.DebugLog("    等级不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
        if lvMin and realmLV < lvMin:
            GameWorld.DebugLog("    官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
            continue
        if family.GetJoinReview():
            GameWorld.DebugLog("    需要审核的不处理! familyID=%s" % familyID, playerID)
@@ -678,6 +736,7 @@
    
    # 可再扩展自动请求,暂时不处理
    GameWorld.DebugLog("没有可自动进入的仙盟!")
    PlayerControl.NotifyCode(curPlayer, "QuickEnterFamilyFail")
    return
def GetFamilySetting(familyLV, fieldName):
@@ -694,6 +753,8 @@
def RequestJoinTagFamily(curPlayer, familyID):
    ## 申请加入
    if CheckInJoinCD(curPlayer):
        return
    playerID = curPlayer.GetPlayerID()
    if curPlayer.GetFamilyID():
        GameWorld.DebugLog('已经有仙盟不能再申请加入! familyID=%s' % curPlayer.GetFamilyID(), playerID)
@@ -714,8 +775,8 @@
        return
    
    lvMin = tagFamily.GetJoinLVMin()
    if curPlayer.GetLV() < lvMin:
        GameWorld.DebugLog('等级未达到该仙盟加入最低等级限制! lv=%s < %s' % (curPlayer.GetLV(), lvMin), playerID)
    if curPlayer.GetOfficialRank() < lvMin:
        GameWorld.DebugLog('官职未达到该仙盟加入最低限制! realmLV=%s < %s' % (curPlayer.GetOfficialRank(), lvMin), playerID)
        return
    
    # 需要审核,满员后端不限制申请,由前端自行决定是否可申请
@@ -912,7 +973,7 @@
def OnChangeFamilyJoin(index, clientData, tick):
    curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)
    joinReview = clientData.JoinReview
    joinLVMin = clientData.JoinLVMin
    joinLVMin = clientData.JoinLVMin # 官职
    
    playerID = curPlayer.GetPlayerID()
    familyID = curPlayer.GetFamilyID()
@@ -1164,7 +1225,8 @@
    #XW_JZ_LeaveFamily   <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n>  25  -   -
    NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
    
    MapServer_FamilyRefresh(curPlayer, 0)
    __DoPlayerLeaveFamilyByID(family, playerID, curPlayer)
    MapServer_FamilyRefresh(curPlayer, 0, 1)
    
    if family.GetCount() == 0:
        #玩家离开后, 家族没有人了 , 删除这个家族
@@ -1229,10 +1291,16 @@
    
    #删除玩家
    tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagMemberID)
    __DoPlayerLeaveFamilyByID(family, tagPlayerID, tagPlayer)
    if tagPlayer:
        MapServer_FamilyRefresh(tagPlayer, 0)
        
    Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave)
    return
def __DoPlayerLeaveFamilyByID(curFamily, leavePlayerID, tagPlayer=None):
    ## 有玩家离开家族处理,主要针对家族层级的,玩家个人的在 __OnLeaveFamily 处理
    PlayerFamilyTaofa.OnFamilyMemberLeave(curFamily, leavePlayerID, tagPlayer)
    return
#// A6 11 家族改名 #tagCMRenameFamily
@@ -1355,6 +1423,7 @@
            else:
                continue
        familyView = ChPyNetSendPack.tagMCFamilyView()
        familyView.Rank = index + 1
        familyView.FamilyID = family.GetID()
        familyView.FamilyName = family.GetName()
        familyView.FamilyNameLen = len(familyView.FamilyName)
@@ -1428,7 +1497,7 @@
    curMember.SetDonateCntTotal(memDonateCntTotal)
    GameWorld.DebugLog("家族捐献: donateType=%s,donateCnt=%s,%s,memDonateCntDay=%s,memDonateCntDay=%s" 
                       % (donateType, donateCnt, awardItemList, memDonateCntDay, memDonateCntTotal), playerID)
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList)
    ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, event=["FamilyMoneyDonate", False, {}])
    return
def ResetDailyDonateCnt(curPlayer):
@@ -1548,7 +1617,8 @@
def SendFamilyActionInfo(curPlayer, familyID, actionType):
    ## 发送家族行为
    # @param curPlayer: 为None时通知该仙盟所有成员
    if not familyID:
        return
    familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType)
    
    clientPack = ChPyNetSendPack.tagMCFamilyActionInfo()