hxp
9 天以前 83dfcaf24534339782da86b3e5fd54a161345544
66 【公会】基础主体-服务端(增加自动传位;)
3个文件已修改
103 ■■■■■ 已修改文件
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/GM/Commands/Family.py
@@ -29,8 +29,10 @@
    if not msgList:
        GameWorld.DebugAnswer(curPlayer, "设置等级: Family lv 等级 经验")
        GameWorld.DebugAnswer(curPlayer, "设置徽章: Family e 徽章ID [剩余时间秒]")
        GameWorld.DebugAnswer(curPlayer, "设置贡献: Family c 今日贡献 累计贡献 [成员ID]")
        GameWorld.DebugAnswer(curPlayer, "设置离开: Family l 主动离开次数 被踢次数 上次是否主动  离开多久了")
        GameWorld.DebugAnswer(curPlayer, "添加成员: Family m 人数 [仙盟ID]")
        GameWorld.DebugAnswer(curPlayer, "成员离线: Family ml 成员ID 离线分钟数")
        GameWorld.DebugAnswer(curPlayer, "创建仙盟相关使用命令: CreateFamily")
        return
    
@@ -78,5 +80,27 @@
        CreateFamily.OnExec(curPlayer, msgList)
        return
    
    elif value == "c":
        contribDay = msgList[1] if len(msgList) > 1 else 0
        contribTotal = msgList[2] if len(msgList) > 2 else 0
        memID = msgList[3] if len(msgList) > 3 else curPlayer.GetPlayerID()
        member = curFamily.FindMember(memID)
        if not member:
            GameWorld.DebugAnswer(curPlayer, "不存在该成员ID:%s" % memID)
            return
        member.SetContribDay(contribDay)
        member.SetContribTotal(contribTotal)
        GameWorld.DebugAnswer(curPlayer, "设置贡献:%s/%s, ID:%s" % (contribDay, contribTotal, memID))
    elif value == "ml":
        memID = msgList[1] if len(msgList) > 1 else 0
        logoutMinutes = msgList[2] if len(msgList) > 2 else 0
        member = curFamily.FindMember(memID)
        if not member:
            GameWorld.DebugAnswer(curPlayer, "不存在该成员ID:%s" % memID)
            return
        member.SetOffTime(int(time.time()) - logoutMinutes * 60)
        GameWorld.DebugAnswer(curPlayer, "成员ID:%s,离线时间:%s" % (memID, GameWorld.ChangeTimeNumToStr(member.GetOffTime())))
    PlayerFamily.Sync_FamilyInfo(curPlayer)
    return
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerEventCounter.py
@@ -131,6 +131,7 @@
def DoLogic_OnHour(tick):
    GameWorld.Log("MapServer -> OnHour!")
    
    PlayerFamily.FamilyOnHour()
    #副本OnHour事件
    FBLogic.OnHour(time, tick)
    
ServerPython/ZoneServerGroup/map1_8G/MapServer/MapServerData/Script/Player/PlayerFamily.py
@@ -30,6 +30,7 @@
import IPY_GameWorld
import ItemControler
import GameFuncComm
import PlayerMail
import PlayerTask
import DBDataMgr
import DirtyList
@@ -92,6 +93,18 @@
            member.SetDonateCntDay(0)
            
        Broadcast_FamilyChange(familyID, FamilyChangeType_OnDay)
    return
def FamilyOnHour():
    if GameWorld.IsCrossServer():
        return
    familyManager = DBDataMgr.GetFamilyMgr()
    for i in range(0, familyManager.GetCount()):
        family = familyManager.GetAt(i)
        #自动传位
        __AutoChangeLeader(family)
        
    return
@@ -1174,6 +1187,71 @@
    #GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # 成员职位变更
    return
def __AutoChangeLeader(curFamily):
    ## 自动传位
    leaderID = curFamily.GetLeaderID()
    leaderMem = curFamily.FindMember(leaderID)
    if not leaderMem:
        return
    offTime = leaderMem.GetOffTime()
    if not offTime:
        return
    familyID = curFamily.GetID()
    curTime = int(time.time())
    passTime = curTime - offTime
    passHours = passTime / 3600.0
    needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
    if passHours < needHours:
        GameWorld.DebugLogEx("盟主离线未超过限制小时,不处理自动传位!familyID=%s,leaderID=%s,offTime=%s,passHours=%s < %s",
                             familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, needHours)
        return
    priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1) # 优先传给离线不超过x小时的成员,一样按优先级
    priorityList = []
    commList = []
    for i in range(0, curFamily.GetCount()):
        member = curFamily.GetAt(i)
        if member.GetFmLV() == IPY_PlayerDefine.fmlLeader:
            continue
        memOffTime = member.GetOffTime()
        memPassTime = curTime - memOffTime
        memPassHours = memPassTime / 3600.0
        sortTime = memOffTime if memOffTime else curTime # 排序用的时间,越大越优先
        fmLV = member.GetFmLV() # ְλ
        contribTotal = member.GetContribTotal() # 总贡献
        commList.append([fmLV, sortTime, contribTotal, member])
        if priorityHours and memPassHours <= priorityHours:
            priorityList.append([fmLV, sortTime, contribTotal, member])
    if not priorityList and not commList:
        # 没有可传位的目标成员
        return
    toMember = None
    if priorityList:
        priorityList.sort(reverse=True)
        toMember = priorityList[0][-1]
    else:
        commList.sort(reverse=True)
        toMember = commList[0][-1]
    if not toMember:
        return
    newLeaderID = toMember.GetPlayerID()
    GameWorld.Log("公会自动传位: familyID=%s,leaderID=%s,offTime=%s,passHours=%s,newLeaderID=%s"
                  % (familyID, leaderID, GameWorld.ChangeTimeNumToStr(offTime), passHours, newLeaderID))
    ChangeFamilyLeader(curFamily, toMember)
    Broadcast_FamilyChange(familyID, FamilyChangeType_LeaderChange, excludeIDList=[leaderID, newLeaderID])
    # 邮件通知
    PlayerMail.SendMailByKey("FamilyLeaderAutoChange", newLeaderID, [], [curFamily.GetName()])
    return
#// A6 26 请求家族成员列表 #tagCMGetFamilyInfo
#
#struct    tagCMGetFamilyInfo