| | |
| | | import ChPyNetSendPack
|
| | | import PlayerFamilyEmblem
|
| | | import PlayerFamilyZhenbaoge
|
| | | import PlayerFamilyTaofa
|
| | | import IPY_PlayerDefine
|
| | | import IpyGameDataPY
|
| | | import IPY_GameWorld
|
| | | import ItemControler
|
| | | import GameFuncComm
|
| | | import PlayerMail
|
| | | import PlayerTask
|
| | | import DBDataMgr
|
| | | import DirtyList
|
| | | import ObjPool
|
| | |
|
| | | import random
|
| | | import time
|
| | |
| | | family = familyManager.GetAt(i)
|
| | | familyID = family.GetID()
|
| | |
|
| | | #珍宝阁
|
| | | PlayerFamilyZhenbaoge.OnDay(family)
|
| | | PlayerFamilyTaofa.OnDay(family)
|
| | |
|
| | | for index in xrange(family.GetCount()):
|
| | | member = family.GetAt(index)
|
| | |
| | |
|
| | | return
|
| | |
|
| | | def FamilyOnHour():
|
| | | if GameWorld.IsCrossServer():
|
| | | return
|
| | | |
| | | familyManager = DBDataMgr.GetFamilyMgr()
|
| | | for i in range(0, familyManager.GetCount()):
|
| | | family = familyManager.GetAt(i)
|
| | | #自动传位
|
| | | __AutoChangeLeader(family)
|
| | | |
| | | return
|
| | |
|
| | | def PlayerOnDay(curPlayer):
|
| | | if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family):
|
| | | return
|
| | | ResetDailyDonateCnt(curPlayer)
|
| | | PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer)
|
| | | PlayerFamilyTaofa.PlayerOnDay(curPlayer)
|
| | | return
|
| | |
|
| | | def OnPlayerLogin(curPlayer, tick):
|
| | |
| | | Sync_RequestAddFamilyInfo(curPlayer, False)
|
| | | SyncDonateCntInfo(curPlayer)
|
| | | PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer)
|
| | | PlayerFamilyTaofa.OnPlayerLogin(curPlayer)
|
| | | return
|
| | |
|
| | | def OnPlayerLogout(curPlayer):
|
| | |
| | | familyMgr = DBDataMgr.GetFamilyMgr()
|
| | | familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID())
|
| | | Sync_RequestAddFamilyInfo(curPlayer)
|
| | | PlayerFamilyTaofa.OnPlayerEnterFamily(curPlayer)
|
| | | PlayerTask.UpdTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily)
|
| | | return
|
| | |
|
| | | def __OnLeaveFamily(curPlayer, isVoluntarily, tick):
|
| | |
| | | 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
|
| | |
|
| | |
| | |
|
| | | # 申请加入
|
| | | if requestType == 0:
|
| | | PlayerTask.AddTaskValue(curPlayer, ChConfig.TaskType_ReqOrJoinFamily, 1)
|
| | | if not tagFamilyID:
|
| | | AutoJoinFamily(curPlayer)
|
| | | else:
|
| | |
| | | family = familyMgr.GetAt(index)
|
| | | if not family:
|
| | | continue
|
| | | familyID = family.GetID()
|
| | | #familyID = family.GetID()
|
| | | lvMin = family.GetJoinLVMin()
|
| | | if lvMin and realmLV < lvMin:
|
| | | GameWorld.DebugLog(" 官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
|
| | | #GameWorld.DebugLog(" 官职不足的不处理! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID)
|
| | | continue
|
| | | if family.GetJoinReview():
|
| | | GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID)
|
| | | #GameWorld.DebugLog(" 需要审核的不处理! familyID=%s" % familyID, playerID)
|
| | | continue
|
| | | MemberMax = GetFamilySetting(family.GetLV(), "MemberMax")
|
| | | if family.GetCount() >= MemberMax:
|
| | | GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID)
|
| | | #GameWorld.DebugLog(" 成员已满的不处理! familyID=%s" % familyID, playerID)
|
| | | continue
|
| | |
|
| | | #直接加入
|
| | |
| | | #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()
|
| | | if memOffTime:
|
| | | sortTime = memOffTime
|
| | | memPassTime = curTime - memOffTime
|
| | | memPassHours = memPassTime / 3600.0
|
| | | else:
|
| | | sortTime = curTime # 排序用的时间,越大越优先
|
| | | memPassTime = 0
|
| | | memPassHours = 0
|
| | | |
| | | 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
|
| | |
| | | #XW_JZ_LeaveFamily <n color="0,190,255">{%S1%}</n><n color="255,255,0">退出了家族!</n> 25 - -
|
| | | NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()])
|
| | |
|
| | | __DoPlayerLeaveFamilyByID(family, playerID, curPlayer)
|
| | | MapServer_FamilyRefresh(curPlayer, 0, 1)
|
| | |
|
| | | if family.GetCount() == 0:
|
| | |
| | |
|
| | | #删除玩家
|
| | | 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
|
| | |
| | | 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):
|
| | |
| | | donateCntList.append(donateCnt)
|
| | | if not donateCntList:
|
| | | return
|
| | | clientPack = ObjPool.GetPoolMgr().acquire(ChPyNetSendPack.tagSCDonateCntInfo)
|
| | | clientPack = ChPyNetSendPack.tagSCDonateCntInfo()
|
| | | clientPack.DonateCntList = donateCntList
|
| | | clientPack.Count = len(clientPack.DonateCntList)
|
| | | NetPackCommon.SendFakePack(curPlayer, clientPack)
|
| | |
| | | def SendFamilyActionInfo(curPlayer, familyID, actionType):
|
| | | ## 发送家族行为
|
| | | # @param curPlayer: 为None时通知该仙盟所有成员
|
| | | |
| | | if not familyID:
|
| | | return
|
| | | familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType)
|
| | |
|
| | | clientPack = ChPyNetSendPack.tagMCFamilyActionInfo()
|