| | |
| | | return
|
| | |
|
| | | def __doFamilyOnHour():
|
| | | |
| | | needHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 1)
|
| | | if GameWorld.IsMainServer() and not DBFamily.IsFamilyCross():
|
| | | # 开服前X天会长离线Y小时触发自动转让,优先级高于数值1,格式 X|Y
|
| | | befServerDay, needHours2 = IpyGameDataPY.GetFuncEvalCfg("FamilyLeaderAutoChange", 3)
|
| | | serverDay = DBDataMgr.GetEventTrigMgr().GetValue(ShareDefine.Def_ServerDay) + 1
|
| | | if serverDay <= befServerDay:
|
| | | needHours = needHours2
|
| | | |
| | | #GameWorld.DebugLog("自动传位时长设定: needHours=%s" % needHours)
|
| | | familyManager = DBDataMgr.GetFamilyMgr()
|
| | | for zoneID in familyManager.GetZoneIDListThisServer():
|
| | | zoneMgr = familyManager.GetZoneFamilyMgr(zoneID)
|
| | | for i in range(0, zoneMgr.GetCount()):
|
| | | family = zoneMgr.GetAt(i)
|
| | | #自动传位
|
| | | __AutoChangeLeader(family)
|
| | | __AutoChangeLeader(family, needHours)
|
| | | return
|
| | |
|
| | | def FamilyCrossCenterOnDay():
|
| | |
| | | PlayerLoginRefreshFamily(crossPlayer) # 必须先刷新
|
| | | Sync_RequestAddFamilyInfo(crossPlayer, False)
|
| | | PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcFamily]) # 公会聊天缓存
|
| | | if GameWorld.IsCrossServer():
|
| | | PlayerTalk.NotifyTalkCache(crossPlayer, [IPY_GameWorld.tcCountry]) # 跨服公会聊天缓存
|
| | | PlayerFamilyTaofa.OnCrossPlayerLogin(crossPlayer)
|
| | | return
|
| | |
|
| | |
| | | joinCDMinute = joinCDMinuteList[kickedCnt - 1] if len(joinCDMinuteList) >= kickedCnt else joinCDMinuteList[-1]
|
| | | if joinCDMinute:
|
| | | cdTimes = joinCDMinute * 60
|
| | | passTimes = int(time.time()) - leaveFamilyTime
|
| | | passTimes = GetFamilyTime() - 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 GetFamilyTime():
|
| | | if GameWorld.IsMainServer() and DBFamily.IsFamilyCross():
|
| | | return CrossMgr.GetSSServerMgr().GetCrossTime()
|
| | | return int(time.time())
|
| | |
|
| | | def AutoJoinFamily(crossPlayer):
|
| | | if crossPlayer.GetFamilyID():
|
| | |
| | | CrossPlayer.FamilyNotify(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV])
|
| | | return
|
| | |
|
| | | def __AutoChangeLeader(curFamily):
|
| | | def __AutoChangeLeader(curFamily, needHours):
|
| | | ## 自动传位
|
| | | leaderID = curFamily.GetLeaderID()
|
| | | leaderMem = curFamily.FindMember(leaderID)
|
| | |
| | | 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小时的成员,一样按优先级
|
| | | priorityHours = IpyGameDataPY.GetFuncCfg("FamilyLeaderAutoChange", 2) # 优先传给离线不超过x小时的成员,一样按优先级
|
| | |
|
| | | priorityList = []
|
| | | commList = []
|
| | | for i in range(0, curFamily.GetCount()):
|
| | | member = curFamily.GetAt(i)
|
| | | if member.GetFmLV() == IPY_PlayerDefine.fmlLeader:
|
| | |
| | | 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:
|
| | | # 没有可传位的目标成员
|
| | | if not priorityList:
|
| | | GameWorld.DebugLog("没有可传位的目标成员! familyID=%s" % familyID)
|
| | | return
|
| | |
|
| | | toMember = None
|
| | | if priorityList:
|
| | | priorityList.sort(reverse=True)
|
| | | toMember = priorityList[0][-1]
|
| | | else:
|
| | | commList.sort(reverse=True)
|
| | | toMember = commList[0][-1]
|
| | | |
| | | priorityList.sort(reverse=True)
|
| | | toMember = priorityList[0][-1]
|
| | | |
| | | if not toMember:
|
| | | return
|
| | |
|
| | |
| | | if CheckFamilyNameExists(crossPlayer, newName, fromServerID):
|
| | | return
|
| | |
|
| | | zoneMgr = familyMgr.GetZoneFamilyMgrByFamilyID(familyID)
|
| | | if not zoneMgr:
|
| | | return
|
| | | |
| | | if not zoneMgr.FamilyRemainName(family, newName):
|
| | | return
|
| | | |
| | | if cdHours:
|
| | | SetRenameTime(family, curTime)
|
| | | |
| | | moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyRename", 1)
|
| | | if moneyType and moneyValue:
|
| | | CrossPlayer.CostPlayerResources(crossPlayer, "FamilyRename", costMoneyDict={moneyType:moneyValue})
|
| | | |
| | | family.SetName(newName) |
| | | if cdHours:
|
| | | SetRenameTime(family, curTime)
|
| | |
|
| | | crossPlayerMgr = CrossPlayer.GetCrossPlayerMgr()
|
| | | for index in xrange(family.GetCount()):
|
| | |
| | | curMember.SetContribTotal(contribTotal)
|
| | | GameWorld.DebugLog("增加成员贡献: familyID=%s,addContribValue=%s,contribDay=%s,contribTotal=%s" % (familyID, addContribValue, contribDay, contribTotal), playerID)
|
| | |
|
| | | Broadcast_FamilyInfo(familyID, isSyncMem=False) # 成员贡献
|
| | | Broadcast_FamilyInfo(familyID, changeMemIDList=[playerID]) # 成员贡献
|
| | | return
|
| | |
|
| | | ## ------------------------------------------------------------------------------------------------
|
| | |
| | | def OnFamilyTalk(curPlayer, familyID, talkPack, tick):
|
| | | clientData, tick = None, 0
|
| | | reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
|
| | | FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqCD=0, reqDataEx=reqDataEx)
|
| | | FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnFamilyTalk", reqDataEx=reqDataEx)
|
| | | return
|
| | | def __OnFamilyTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
|
| | | talkBuffer = reqDataEx["talkBuffer"]
|
| | |
| | | content = clientPack.Content
|
| | | bubbleBox = clientPack.BubbleBox
|
| | | PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox, familyID)
|
| | | return
|
| | |
|
| | | def OnCrossFamilyTalk(curPlayer, talkPack, tick):
|
| | | ## 跨服公会聊天,与跨服公会互通范围一致
|
| | | crossServerID = DBDataMgr.GetFamilyMgr().GetCurCrossServerID()
|
| | | if crossServerID <= 0:
|
| | | GameWorld.DebugLog("本服公会未互通,不允许跨服聊天")
|
| | | return
|
| | | clientData, tick = None, 0
|
| | | reqDataEx = {"talkBuffer":talkPack.GetBuffer()}
|
| | | FamilyPyPackForwarding(curPlayer, clientData, tick, "__OnCrossTalk", reqDataEx=reqDataEx)
|
| | | return
|
| | | def __OnCrossTalk(crossPlayer, clientData, tick, fromServerID=0, reqDataEx=None):
|
| | | talkBuffer = reqDataEx["talkBuffer"]
|
| | | playerID = crossPlayer.GetPlayerID()
|
| | | |
| | | if not talkBuffer:
|
| | | return
|
| | | |
| | | familyMgr = DBDataMgr.GetFamilyMgr()
|
| | | zoneID = familyMgr.GetZoneIDInThisServer(fromServerID)
|
| | | if zoneID < 0:
|
| | | GameWorld.ErrLog("找不到服务器ID在跨服中的公会分区! fromServerID=%s" % fromServerID)
|
| | | return
|
| | | zoneMgr = familyMgr.GetZoneFamilyMgr(zoneID)
|
| | | serverIDList = zoneMgr.GetZoneServerIDList()
|
| | | if not serverIDList:
|
| | | return
|
| | | |
| | | clientPack = ChPyNetSendPack.tagMCTalk()
|
| | | clientPack.ReadData(talkBuffer)
|
| | | CrossPlayer.SendFackPackToServerList(clientPack, serverIDList)
|
| | | |
| | | # 聊天缓存
|
| | | channelType = clientPack.ChannelType
|
| | | content = clientPack.Content
|
| | | bubbleBox = clientPack.BubbleBox
|
| | | PlayerTalk.DoTalkCache(channelType, playerID, content, bubbleBox)
|
| | | return
|
| | |
|
| | | ## -------------------------------------- 游戏服本服处理 --------------------------------------------
|
| | |
| | | curPlayer.SetFamilyActiveValue(0)
|
| | | curPlayer.SetLastWeekFamilyActiveValue(0)
|
| | | curPlayer.SetFamilyLV(0)
|
| | | PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time()))
|
| | | PlayerControl.SetLeaveFamilyTimeEx(curPlayer, GetFamilyTime())
|
| | | leaveCnt, kickedCnt, _ = PlayerControl.GetLeaveFamilyInfo(curPlayer)
|
| | | GameWorld.DebugLog("__OnLeaveFamily: isVoluntarily=%s,leaveCnt=%s,kickedCnt=%s" % (isVoluntarily, leaveCnt, kickedCnt))
|
| | | delMoneyType, delMoneyPer = IpyGameDataPY.GetFuncCfg("FamilyLeave", 3), 0
|