#!/usr/bin/python # -*- coding: GBK -*- #--------------------------------------------------------------------- # #--------------------------------------------------------------------- ##@package PlayerFamily #¼Ò×åÂß¼­´¦Àí # # @author eggxp # @date 2010-4-23 # @version 1.0 # #--------------------------------------------------------------------- #"""Version = 2017-07-12 21:00""" #--------------------------------------------------------------------- import FBLogic import ChConfig import GameWorld import ShareDefine import PlayerControl import NetPackCommon import PlayerViewCache import ChPyNetSendPack import PlayerFamilyTech import PlayerFamilyEmblem import PlayerFamilyZhenfa import PlayerFamilyZhenbaoge import IPY_PlayerDefine import IpyGameDataPY import IPY_GameWorld import GameFuncComm import ItemCommon import DBDataMgr import DirtyList import random import time #ÉêÇë¡¢ÉóºË¡¢Í˳ö¡¢ÌßÈË¡¢¾èÏס¢Éý¼¶ Def_CreatFamily_MaxStr = 33 #ÏÉÃ˱ä¸üÀàÐÍ FamilyChangeTypes = ( FamilyChangeType_None, FamilyChangeType_MemJoin, # ³ÉÔ±¼ÓÈë 1 FamilyChangeType_MemLeave, # ³ÉÔ±Í˳ö 2 FamilyChangeType_JoinSet, # ÊÕÈËÉèÖÃÐÞ¸Ä 3 FamilyChangeType_Broadcast, # ¹«¸æÐÞ¸Ä 4 FamilyChangeType_EChange, # »ÕÕÂÐÞ¸Ä 5 FamilyChangeType_LeaderChange, # ÃËÖ÷±ä¸ü 6 FamilyChangeType_MemFmlvChange, # ³ÉԱְλ±ä¸ü 7 FamilyChangeType_MemLogin, # ³ÉÔ±ÉÏÏß 8 FamilyChangeType_MemLogout, # ³ÉÔ±ÀëÏß9 ) = range(10) #ÏÉÃËȨÏÞ ( FamilyPowerID_Call, #ÕÐÈË 1 FamilyPowerID_ChangeFmlv, #±ä¸üְλ 2 FamilyPowerID_Broadcast, #·¢²¼¹«¸æ 3 FamilyPowerID_Kick, #ÌßÈË 4 ) = range(1, 1 + 4) #ÏÉÃËְλ¶ÔÓ¦ÈËÊýÉèÖÃÊôÐÔÃû Def_FmlSetAttrName = { IPY_PlayerDefine.fmlMember:"MemberMax", IPY_PlayerDefine.fmlCounsellor:"EliteMax", IPY_PlayerDefine.fmlViceLeader:"DeputyLeaderMax", } def FamilyOnDay(): if GameWorld.IsCrossServer(): return familyManager = DBDataMgr.GetFamilyMgr() for i in range(0, familyManager.GetCount()): family = familyManager.GetAt(i) #Õ䱦¸ó PlayerFamilyZhenbaoge.OnDay(family) return def PlayerOnDay(curPlayer): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): return #ÿÈÕ¸£Àû½±Àø Sync_FamilyDayRewardState(curPlayer) __FamilyAffair_Refresh(curPlayer, True) PlayerFamilyZhenbaoge.PlayerOnDay(curPlayer) return def OnPlayerLogin(curPlayer, tick): if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): return PlayerLoginRefreshFamily(curPlayer, tick) Sync_RequestAddFamilyInfo(curPlayer, False) Sync_FamilyDayRewardState(curPlayer) PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer) __FamilyAffair_CheckReset(curPlayer) PlayerFamilyZhenfa.OnPlayerLogin(curPlayer) PlayerFamilyZhenbaoge.OnPlayerLogin(curPlayer) return def OnPlayerLogout(curPlayer): playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if not familyID: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return curMember.SetOffTime(int(time.time())) #XW_JZ_LeaguerLeaveline {%S1%}ÏÂÏßÁË£¡ 25 - - NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerLeaveline", [curPlayer.GetPlayerName()]) Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogout, excludeIDList=[playerID]) return def OnWeekEx(curPlayer): #ÖØÖà PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityAwardRecord, 0) for actionid in ShareDefine.FamilyActiveIDList: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyActivityFinishCnt%actionid, 0) return def PlayerLoginRefreshFamily(curPlayer, tick): ## Íæ¼ÒµÇ¼ʱˢмÒ×å playerID = curPlayer.GetPlayerID() familyMgr = DBDataMgr.GetFamilyMgr() refreshFamilyID = familyMgr.GetPlayerFamilyID(playerID) MapServer_FamilyRefresh(curPlayer, refreshFamilyID) familyID = curPlayer.GetFamilyID() if not familyID: return family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return curMember.SetOffTime(0) # ÔÚÏß0£¬ÍÑ»ú1£¬>1ÀëÏßʱ¼ä curMember.RefreshMember(curPlayer) Sync_FamilyInfo(curPlayer) #֪ͨÕÐÈË if GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): NetPackCommon.SendFakePack(curPlayer, GetPack_FamilyReqJoinInfo(familyID)) #XW_JZ_LeaguerOnline {%S1%}ÉÏÏßÁË£¡ 25 - - NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaguerOnline", [curPlayer.GetName()], [playerID]) Broadcast_FamilyChange(familyID, FamilyChangeType_MemLogin, excludeIDList=[playerID]) # ÃËÖ÷ÉÏÏß´¦Àí if curMember.GetFmLV() == IPY_PlayerDefine.fmlLeader: OnFamilyLeaderLogin(curPlayer) return def OnFamilyLeaderLogin(curPlayer): ## ÃËÖ÷µÇ¼¶îÍâ´¦Àí return #// A6 04 ´´½¨¼Ò×å #tagCMCreateFamily # #struct tagCMCreateFamily #{ # tagHead Head; # char Name[33]; # WORD EmblemID; //Ñ¡Ôñ»ÕÕÂID£¬½âËøÏÉÃ˵ȼ¶Îª1¼¶µÄ¾ùΪ¿ÉÑ¡ID #}; def OnCreateFamily(index, clientPack, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) inputName = clientPack.Name emblemID = clientPack.EmblemID if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Family): return playerID = curPlayer.GetPlayerID() playerFamilyID = curPlayer.GetFamilyID() familyMgr = DBDataMgr.GetFamilyMgr() if playerFamilyID: curFamily = familyMgr.FindFamily(playerFamilyID) if curFamily: if curFamily.FindMember(playerID): #Íæ¼ÒÒѾ­ÓмÒ×å, ´´½¨Ê§°Ü PlayerControl.NotifyCode(curPlayer, "GeRen_chenxin_85890") return fullFamilyName = CheckInputFamilyName(curPlayer, inputName) if not fullFamilyName: return needMoney = IpyGameDataPY.GetFuncCfg("CreateFamily", 1) moneyType = IpyGameDataPY.GetFuncCfg("CreateFamily", 2) if moneyType and needMoney: if not PlayerControl.PayMoney(curPlayer, moneyType, needMoney, "CreateFamily"): return serverID = GameWorld.GetPlayerServerID(curPlayer) curFamily = familyMgr.AddFamily(fullFamilyName, serverID) if curFamily == None: GameWorld.ErrLog("´´½¨¼Ò×åʧ°Ü", playerID) return newFamilyID = curFamily.GetID() curFamily.SetLV(1) emblemIDList = PlayerFamilyEmblem.GetDefaultFamilyEmblemIDList() if not emblemID or emblemID not in emblemIDList: emblemID = random.choice(emblemIDList) # ´ÓĬÈÏ»ÕÕÂÖÐËæ»úÑ¡ÔñÒ»¸ö GameWorld.Log("´´½¨ÏÉÃË: familyID=%s,playerID=%s,emblemID=%s" % (newFamilyID, playerID, emblemID)) curFamily.SetEmblemID(emblemID) #-ÉèÖüÒ×å³ÉÔ±ÊôÐÔ DoPlayerJionFamily(curFamily, playerID, curPlayer, IPY_PlayerDefine.fmlLeader) familyMgr.Sort() #XW_JZ_EstablishSud ¹§Ï²Äú£¬¼Ò×彨Á¢³É¹¦! 25 - - PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishSud") PlayerControl.WorldNotify(0, "jiazu_liubo_671654", [curPlayer.GetName(), fullFamilyName, newFamilyID]) PlayerFamilyZhenbaoge.OnZhenbaogeReset(curFamily) return def CheckInputFamilyName(curPlayer, inputName): '''¼ì²éÍæ¼ÒÊäÈëµÄÏÉÃËÃûÊÇ·ñºÏ·¨£¬½¨ÃË¡¢¸ÄÃûͨÓà @return: None-²»ºÏ·¨£»·Ç¿Õ-ºÏ·¨µÄÏÉÃËÈ«Ãû ''' #C++¹ýÂ˿ոñ familyName = GameWorld.GetGameWorld().GetCharTrim(inputName) fullFamilyName = GetFamilyFullName(curPlayer, familyName) if not fullFamilyName: GameWorld.ErrLog("¼Ò×åÈ«ÃûÒì³£!", curPlayer.GetPlayerID()) return if DirtyList.IsWordForbidden(familyName): #XW_JZ_Family_NameNoLegality ¶Ô²»Æð,¼Ò×åÃû³ÆÖк¬ÓзǷ¨×Ö·û PlayerControl.NotifyCode(curPlayer, "XW_JZ_Family_NameNoLegality") return if len(familyName) <= 0 or len(familyName) > Def_CreatFamily_MaxStr: PlayerControl.NotifyCode(curPlayer, "GeRen_liubo_980181", [Def_CreatFamily_MaxStr / 2, Def_CreatFamily_MaxStr]) return familyMgr = DBDataMgr.GetFamilyMgr() if familyMgr.FindFamilyByName(fullFamilyName): #XW_JZ_EstablishErr_Name ¶Ô²»Æð£¬ÄúÊäÈëµÄ¼Ò×åÃûÒÑ´æÔÚ£¬½¨Á¢¼Ò×åʧ°Ü£¡ 25 - - PlayerControl.NotifyCode(curPlayer, "XW_JZ_EstablishErr_Name") return return fullFamilyName ## »ñÈ¡¼Ò×åÈ«Ãû def GetFamilyFullName(curPlayer, familyName): serverID = GameWorld.GetPlayerServerID(curPlayer) maxServerID = IpyGameDataPY.GetFuncCfg("FamilyNameFormat", 3) if serverID > maxServerID or serverID <= 0: GameWorld.ErrLog("ÏÉÃËÈ«Ãû serverID=%s error! maxServerID=%s, check FamilyNameFormat.txt" % (serverID, maxServerID)) return "" specServerDict = IpyGameDataPY.GetFuncEvalCfg("FamilyNameFormat", 4, {}) nameFormatInfo = GameWorld.GetDictValueByRangeKey(specServerDict, serverID) if not nameFormatInfo: nameFormatInfo = IpyGameDataPY.GetFuncEvalCfg("FamilyNameFormat", 1) if not nameFormatInfo: return "" nameFormat = nameFormatInfo[0] paramList = [eval(pName) for pName in nameFormatInfo[1:]] fullName = nameFormat % tuple(paramList) 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]) return "" return fullName def DoPlayerJionFamily(family, playerID, jionPlayer, jionFamilySetLv=IPY_PlayerDefine.fmlMember, broadcastFamilyChange=True): '''¼ÓÈë¼Ò×壬֧³ÖÀëÏßÍæ¼Ò¼ÓÈë @param jionPlayer: Èç¹ûÊÇÀëÏßÍæ¼ÒÔòΪNone ''' if isinstance(family, int): familyID = family familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) else: curFamily = family if not curFamily: return familyID = curFamily.GetID() member = curFamily.AddMember(playerID) member.SetFmLV(jionFamilySetLv) if jionPlayer: member.RefreshMember(jionPlayer) else: member.RefreshMemberByID(playerID) curFamily.SetFightPowerTotal(curFamily.GetFightPowerTotal() + member.GetFightPowerTotal()) if jionFamilySetLv == IPY_PlayerDefine.fmlLeader: curFamily.SetLeaderID(playerID) #ÉèÖÃÍæ¼ÒÉíÉϱ£´æµÄ¼Ò×åÐÅÏ¢ if jionPlayer: MapServer_FamilyRefresh(jionPlayer, familyID) Sync_FamilyInfo(jionPlayer) if jionFamilySetLv != IPY_PlayerDefine.fmlLeader: if broadcastFamilyChange: Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=[playerID]) #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å NotifyAllFamilyMemberMsg(familyID, "XW_JZ_EnterFamily", [member.GetPlayerName()], excludeIDList=[playerID]) if jionPlayer: PlayerControl.NotifyCode(jionPlayer, 'XW_JZ_EnterFamilyInfo', [family.GetName()]) #¼Ç¼¼ÓÈëʼþ tick = GameWorld.GetGameWorld().GetTick() AddFamilyActionNote(member.GetPlayerName(), familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Join, jionFamilySetLv, 0], tick) #Íæ¼Ò»º´æ #PlayerViewCache.OnPlayerFamilyChange(jionPlayer.GetPlayerID(), curFamily.GetID(), curFamily.GetName()) #PlayerTeam.OnTeamMemFamilyRefresh(jionPlayer, curFamily.GetID()) #SetMemberFightPower(familyMember, PlayerControl.GetFightPower(jionPlayer)) #GetFamilyMgr().AddFamilyIDToFightPowerChangeList(curFamily.GetID(), jionPlayer.GetPlayerID()) return def AddFamilyActionNote(curName, familyID, actionType, actionDataList, tick, isClearNone=True, useData=""): '''ͳһÌí¼Ó¼Ò×åActionÊý¾Ý ''' if actionType not in ShareDefine.Def_ActionTypeList: #¼Ç¼ÐÐΪÀàÐÍ´íÎó GameWorld.ErrLog("¼Ç¼¼Ò×åÐÐΪÀàÐÍ:%s ´íÎó") return False familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) actionData = familyAction.AddAction() if not actionData: return False #---ÉèÖÃÐÐΪ¶ÔÏóÊý¾Ý--- actionData.SetName(curName) # ÉèÖÃÃû×Ö actionData.SetUserData(useData) # ÉèÖÃ×Ô¶¨ÒåÊý¾Ý for num, value in enumerate(actionDataList, 1): setFunc = getattr(actionData, "SetValue%s" % num) if setFunc: setFunc(value) return True def MapServer_FamilyRefresh(curPlayer, refreshFamilyID): ''' Ï൱ÓÚGameServerµ÷Óà curPlayer.MapServer_FamilyRefresh() @param familyID: Íæ¼Ò¸üеÄfamilyID ''' tick = GameWorld.GetGameWorld().GetTick() playerID = curPlayer.GetPlayerID() refreshFmLV = 0 refreshFamilyLV = 0 refreshEmblemID = 0 refreshFamilyName = "" if refreshFamilyID: familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(refreshFamilyID) if curFamily: refreshFamilyLV = curFamily.GetLV() refreshFamilyName = curFamily.GetName() refreshEmblemID = curFamily.GetEmblemID() member = curFamily.FindMember(playerID) if member: refreshFmLV = member.GetFmLV() else: refreshFamilyID = 0 lastFamilyID = curPlayer.GetFamilyID() lastFamilyLV = curPlayer.GetFamilyLV() # ÏÉÃ˵ȼ¶£¬·ÇְλµÈ¼¶ lastFmLV = PlayerControl.GetFamilyMemberLV(curPlayer) if lastFamilyID != refreshFamilyID: curPlayer.SetFamilyID(refreshFamilyID) if curPlayer.GetFamilyName() != refreshFamilyName: curPlayer.SetFamilyName(refreshFamilyName) curPlayer.Notify_FamilyNameRefresh() #//04 36 ÖÜÎ§Íæ¼Ò¼Ò×åÃûË¢ÐÂ#tagPlayerFamilyNameRefresh if PlayerControl.GetFamilyEmblemID(curPlayer) != refreshEmblemID: PlayerControl.SetFamilyEmblemID(curPlayer, refreshEmblemID) if lastFmLV != refreshFmLV: PlayerControl.SetFamilyMemberLV(curPlayer, refreshFmLV) if lastFamilyLV != refreshFamilyLV: isLVUP = False if lastFamilyLV and refreshFamilyLV > 0: #´¥·¢¼Ò×åÉý¼¶Ê¼þ isLVUP = True curPlayer.SetFamilyLV(refreshFamilyLV) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyLV, refreshFamilyLV) #´¥·¢¼Ò×åÉý¼¶Ê¼þ, ÔÚSetFamilyLVÖ®ºó£¬ÈÎÎñ¿ÉÒÔÈ¡µÈ¼¶Åж¨ if isLVUP: pass if lastFamilyID != 0 and curPlayer.GetFamilyID() == 0: #Íæ¼ÒÀ뿪¼Ò×å __OnLeaveFamily(curPlayer, tick) elif lastFamilyID == 0 and curPlayer.GetFamilyID() != 0: #¸Õ½ø¼Ò×岢Ϊ×峤,´¥·¢½¨¼Ò×åʼþ if curPlayer.GetFamilyMemberLV() == IPY_GameWorld.fmlLeader: pass #½øÈë¼Ò×å´¥·¢Ê¼þ __OnEnterFamily(curPlayer, tick) #---֪ͨ¿Í»§¶ËË¢ÐÂÊôÐÔ--- curPlayer.View_FamilyInfoRefresh() #//04 30 Íæ¼Ò¼Ò×åÃû×ÖְλµÈÐÅϢˢÐÂ#tagPlayerInFamilyInfoRefresh return def __OnEnterFamily(curPlayer, tick): ## ½øÈë¼Ò×å´¥·¢Ê¼þ familyMgr = DBDataMgr.GetFamilyMgr() familyMgr.DelPlayerReqJoinFamilyIDAll(curPlayer.GetPlayerID()) Sync_RequestAddFamilyInfo(curPlayer) __FamilyAffair_CheckReset(curPlayer) PlayerFamilyTech.Sync_PlayerFamilyTechLV(curPlayer) #GameLogic_FamilyWar.DoCheckChampionFamilyTitle(curPlayer) #GameLogic_FamilyBoss.OnEnterFamily(curPlayer) #PlayerFamilyRedPacket.CreatCacheRedPacktet(curPlayer) #PlayerFamilyZhenfa.OnEnterFamily(curPlayer) return def __OnLeaveFamily(curPlayer, tick): ## Í˳ö¼Ò×å´¥·¢Ê¼þ #---Çå¿Õ¼Ò×åÏà¹ØÐÅÏ¢--- curPlayer.SetPerExp(0) curPlayer.SetFamilyHornor(0) curPlayer.SetFamilyActiveValue(0) curPlayer.SetLastWeekFamilyActiveValue(0) curPlayer.SetFamilyLV(0) PlayerControl.SetLeaveFamilyTimeEx(curPlayer, int(time.time())) FBLogic.OnLeaveFamily(curPlayer, tick) return def GetFamilyMemberHasPow(member, powerID): ## ÏÉÃ˳ÉÔ±ÊÇ·ñÓиÃȨÏÞ powerDict = IpyGameDataPY.GetFuncEvalCfg("FamilyPower", 1, {}) if str(powerID) not in powerDict: return False needMemberLV = powerDict[str(powerID)] return member.GetFmLV() >= needMemberLV def Sync_FamilyInfo(curPlayer, infoPack=None): ## // A5 20 Íæ¼Ò¼Ò×åÐÅÏ¢ #tagMCRoleFamilyInfo familyID = curPlayer.GetFamilyID() if not familyID: return if not infoPack: infoPack = GetPack_FamilyInfo(familyID) NetPackCommon.SendFakePack(curPlayer, infoPack) return def GetPack_FamilyInfo(familyID): familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return clientPack = ChPyNetSendPack.tagMCRoleFamilyInfo() clientPack.FamilyID = familyID clientPack.FamilyName = curFamily.GetName() clientPack.FamilyLV = curFamily.GetLV() clientPack.FamilyLVExp = curFamily.GetExp() clientPack.JoinReview = curFamily.GetJoinReview() clientPack.JoinLVMin = curFamily.GetJoinLVMin() clientPack.ServerID = curFamily.GetServerID() clientPack.EmblemID = curFamily.GetEmblemID() clientPack.FightPower = curFamily.GetFightPower() clientPack.FightPowerEx = curFamily.GetFightPowerEx() clientPack.Broadcast = curFamily.GetBroadcast() clientPack.BroadcastLen = len(clientPack.Broadcast) clientPack.LeaderID = curFamily.GetLeaderID() clientPack.MemberList = [] for index in xrange(curFamily.GetCount()): member = curFamily.GetAt(index) memInfo = ChPyNetSendPack.tagMCRoleFamilyMember() memInfo.PlayerID = member.GetPlayerID() memInfo.JoinTime = member.GetJoinTime() memInfo.Name = member.GetPlayerName() memInfo.NameLen = len(memInfo.Name) memInfo.LV = member.GetLV() memInfo.Job = member.GetJob() memInfo.RealmLV = member.GetRealmLV() memInfo.Face = member.GetFace() memInfo.FacePic = member.GetFacePic() memInfo.FightPower = member.GetFightPower() memInfo.FightPowerEx = member.GetFightPowerEx() memInfo.FmLV = member.GetFmLV() memInfo.ServerID = member.GetServerID() memInfo.ContribTotal = member.GetContribTotal() memInfo.ContribWeek = member.GetContribWeek() memInfo.OffTime = member.GetOffTime() clientPack.MemberList.append(memInfo) clientPack.MemberCount = len(clientPack.MemberList) return clientPack def Broadcast_FamilyChange(familyID, changeType=FamilyChangeType_None, powerID=None, excludeIDList=None): ## // A5 21 ¼Ò×å±ä¸ü #tagMCFamilyChange # @param excludeIDList: ²»¹ã²¥µÄ³ÉÔ±IDÁбí clientPack = ChPyNetSendPack.tagMCFamilyChange() clientPack.Type = changeType Broadcast_FamilyPack(familyID, clientPack, powerID, excludeIDList) return def Broadcast_FamilyPack(familyID, clientPack, powerID=None, excludeIDList=None): ## ¹ã²¥¼Ò×å³ÉÔ±·â°ü # @param powerID: ¿ÉÖ¸¶¨Ö»·¢¸øÓиÃȨÏ޵ijÉÔ± # @param excludeIDList: ²»¹ã²¥µÄ³ÉÔ±IDÁбí if not clientPack: return familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return playerManager = GameWorld.GetPlayerManager() for index in xrange(curFamily.GetCount()): member = curFamily.GetAt(index) playerID = member.GetPlayerID() if excludeIDList and playerID in excludeIDList: continue curPlayer = playerManager.FindPlayerByID(playerID) if not curPlayer: continue if powerID != None and not GetFamilyMemberHasPow(member, powerID): continue NetPackCommon.SendFakePack(curPlayer, clientPack) return def NotifyAllFamilyMemberMsg(familyID, code, paramList=[], excludeIDList=None): ## ֪ͨËùÓмÒ×å³ÉÔ±ÐÅÏ¢ # @param excludeIDList: ²»Í¨ÖªµÄ³ÉÔ±IDÁбí familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return playerManager = GameWorld.GetPlayerManager() for i in xrange(curFamily.GetCount()): member = curFamily.GetAt(i) playerID = member.GetPlayerID() if excludeIDList and playerID in excludeIDList: continue curPlayer = playerManager.FindPlayerByID(playerID) if not curPlayer: continue PlayerControl.NotifyCode(curPlayer, code, paramList) return #// A6 01 ÏòÍæ¼ÒÉêÇë¼ÓÈë¼Ò×å #tagCMRequestJoinFamilyByPlayer # #struct tagCMRequestJoinFamilyByPlayer #{ # tagHead Head; # DWORD TagPlayerID; //Ä¿±ê¼Ò×åÍæ¼ÒID #}; def OnRequestJoinFamilyByPlayer(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) tagPlayerID = clientData.TagPlayerID tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagPlayerID) if not tagPlayer: GameWorld.DebugLog("¶Ô·½²»ÔÚÏß! tagPlayerID=%s" % tagPlayerID) return tagFamilyID = tagPlayer.GetFamilyID() if tagFamilyID <= 0: GameWorld.DebugLog("¶Ô·½Ã»ÓмÒ×å! tagPlayerID=%s" % tagPlayerID) return RequestJoinTagFamily(curPlayer, tagFamilyID) return #// A6 02 ÉêÇë¼ÓÈë¼Ò×å#tagCMRequesJoinFamily # #struct tagCMRequesJoinFamily #{ # tagHead Head; # BYTE Type; //ÉêÇëÀàÐÍ£¬0-ÉêÇ룻1-³·Ïú # DWORD TagFamilyID; //Ä¿±ê¼Ò×åID£¬ÉêÇëʱΪ0´ú±íÒ»¼üÉêÇë¼Ò×åÈÎÒâ¼Ò×å #}; def OnRequesJoinFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) tagFamilyID = clientData.TagFamilyID # ÉêÇë½øÈëµÄ¼Ò×åID requestType = clientData.Type # ÉêÇëÀàÐÍ(ÉêÇë/³·Ïú) # ÉêÇë¼ÓÈë if requestType == 0: if not tagFamilyID: AutoJoinFamily(curPlayer) else: RequestJoinTagFamily(curPlayer, tagFamilyID) # ³·ÏúÉêÇë elif requestType == 1: CancelJoinTagFamily(curPlayer, tagFamilyID) return def AutoJoinFamily(curPlayer): if curPlayer.GetFamilyID(): return playerID = curPlayer.GetPlayerID() playerLV = curPlayer.GetLV() GameWorld.DebugLog("Íæ¼ÒÒ»¼ü×Ô¶¯¼ÓÈë¼Ò×壡 playerLV=%s" % playerLV, playerID) familyMgr = DBDataMgr.GetFamilyMgr() indexList = range(familyMgr.GetCount()) random.shuffle(indexList) #´òÂÒ˳Ðò for index in indexList: family = familyMgr.GetAt(index) if not family: continue familyID = family.GetID() lvMin = family.GetJoinLVMin() if lvMin and playerLV < lvMin: GameWorld.DebugLog(" µÈ¼¶²»×ãµÄ²»´¦Àí! familyID=%s,lvMin=%s" % (familyID, lvMin), playerID) continue if family.GetJoinReview(): GameWorld.DebugLog(" ÐèÒªÉóºËµÄ²»´¦Àí! familyID=%s" % familyID, playerID) continue MemberMax = GetFamilySetting(family.GetLV(), "MemberMax") if family.GetCount() >= MemberMax: GameWorld.DebugLog(" ³ÉÔ±ÒÑÂúµÄ²»´¦Àí! familyID=%s" % familyID, playerID) continue #Ö±½Ó¼ÓÈë DoPlayerJionFamily(family, playerID, curPlayer) return # ¿ÉÔÙÀ©Õ¹×Ô¶¯ÇëÇó£¬ÔÝʱ²»´¦Àí GameWorld.DebugLog("ûÓпÉ×Ô¶¯½øÈëµÄÏÉÃË!") return def GetFamilySetting(familyLV, fieldName): ## »ñÈ¡ÏÉÃ˵ȼ¶±í¶ÔÓ¦×Ö¶ÎÖµ if not fieldName: return 0 ipyData = IpyGameDataPY.GetIpyGameData("Family", familyLV) if not ipyData: return 0 attrName = "Get%s" % fieldName if not hasattr(ipyData, attrName): return 0 return getattr(ipyData, attrName)() def RequestJoinTagFamily(curPlayer, familyID): ## ÉêÇë¼ÓÈë playerID = curPlayer.GetPlayerID() if curPlayer.GetFamilyID(): GameWorld.DebugLog('ÒѾ­ÓÐÏÉÃ˲»ÄÜÔÙÉêÇë¼ÓÈë! familyID=%s' % curPlayer.GetFamilyID(), playerID) return familyMgr = DBDataMgr.GetFamilyMgr() reqFamilyIDList = familyMgr.GetPlayerReqJoinFamilyIDList(playerID) if playerID in reqFamilyIDList: GameWorld.DebugLog('ÒѾ­ÔÚÉêÇë¼ÓÈëÏÉÃËÁбíÖÐ! familyID=%s' % familyID, playerID) return maxReqFamilyCnt = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 2) if len(reqFamilyIDList) >= maxReqFamilyCnt: GameWorld.DebugLog('ÒѾ­´ïµ½×î´óÉêÇë¼ÓÈëÏÉÃËÊý! %s, %s' % (len(reqFamilyIDList), reqFamilyIDList), playerID) return tagFamily = familyMgr.FindFamily(familyID) if not tagFamily: return lvMin = tagFamily.GetJoinLVMin() if curPlayer.GetLV() < lvMin: GameWorld.DebugLog('µÈ¼¶Î´´ïµ½¸ÃÏÉÃ˼ÓÈë×îµÍµÈ¼¶ÏÞÖÆ! lv=%s < %s' % (curPlayer.GetLV(), lvMin), playerID) return # ÐèÒªÉóºË£¬ÂúÔ±ºó¶Ë²»ÏÞÖÆÉêÇ룬ÓÉǰ¶Ë×ÔÐоö¶¨ÊÇ·ñ¿ÉÉêÇë if tagFamily.GetJoinReview(): reqPlayerIDDict = tagFamily.GetReqJoinPlayerInfo() if playerID not in reqPlayerIDDict: maxReqPlayerCnt = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 1) if len(reqPlayerIDDict) >= maxReqPlayerCnt: GameWorld.DebugLog('Ä¿±êÏÉÃËÉêÇë¼ÓÈëÊýÒÑÂú! %s, %s' % (len(reqFamilyIDList), reqFamilyIDList), playerID) PlayerControl.NotifyCode(curPlayer, "jiazu_pan_141056") return tagFamily.AddReqJoinPlayerID(playerID) # ¹ã²¥¸øÓÐÕÐÈËȨÏÞµÄ Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) #jiazu_pan_500807:ÉêÇëÈë°ï³É¹¦£¡ÇëµÈ´ý°ï»á¹ÜÀíÈËÔ±ÉóÅú£¡ PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807") Sync_RequestAddFamilyInfo(curPlayer) return # ²»ÐèÒªÉóºË£¬×Ô¶¯¼ÓÈë memberMax = GetFamilySetting(tagFamily.GetLV(), "MemberMax") if tagFamily.GetCount() >= memberMax: GameWorld.DebugLog('Ä¿±êÏÉÃ˳ÉÔ±ÒÑÂú! familyLV=%s,memberMax=%s' % (tagFamily.GetLV(), memberMax), playerID) return DoPlayerJionFamily(tagFamily, playerID, curPlayer) return def CancelJoinTagFamily(curPlayer, familyID): # ³·ÏúÉêÇë familyMgr = DBDataMgr.GetFamilyMgr() playerID = curPlayer.GetPlayerID() tagFamily = familyMgr.FindFamily(familyID) if tagFamily: tagFamily.DelReqJoinPlayerID(playerID) familyMgr.DelPlayerReqJoinFamilyID(playerID, familyID) Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) Sync_RequestAddFamilyInfo(curPlayer) return def Sync_RequestAddFamilyInfo(curPlayer, isForce=True): ## ֪ͨµ±Ç°ÉêÇë¼ÓÈëµÄÄÄЩ¼Ò×å playerID = curPlayer.GetPlayerID() familyMgr = DBDataMgr.GetFamilyMgr() reqFamilyIDList = familyMgr.GetPlayerReqJoinFamilyIDList(playerID) # ·ÇÇ¿ÖÆÍ¨ÖªÊ±Ã»ÓÐÉêÇë¼Ç¼µÄ¿É²»Í¨Öª£¬ÈçµÇ¼ if not isForce and not reqFamilyIDList: return clientPack = ChPyNetSendPack.tagMCNotifyRequestJoinFamilyInfo() clientPack.Clear() clientPack.RequestJoinFamilyIDList = reqFamilyIDList clientPack.RequestCount = len(clientPack.RequestJoinFamilyIDList) NetPackCommon.SendFakePack(curPlayer, clientPack) return def GetPack_FamilyReqJoinInfo(familyID): ## »ñÈ¡ // A5 22 ¼Ò×åÉêÇë¼ÓÈëµÄÍæ¼ÒÐÅÏ¢ #tagMCFamilyReqJoinInfo familyMgr = DBDataMgr.GetFamilyMgr() curFamily = familyMgr.FindFamily(familyID) if not curFamily: return reqPlayerIDDict = curFamily.GetReqJoinPlayerInfo() playerManager = GameWorld.GetPlayerManager() clientPack = ChPyNetSendPack.tagMCFamilyReqJoinInfo() clientPack.ReqJoinList = [] for playerID, reqTime in reqPlayerIDDict.items(): curPlayer = playerManager.FindPlayerByID(playerID) reqInfo = ChPyNetSendPack.tagMCFamilyReqJoinPlayer() reqInfo.PlayerID = playerID reqInfo.ReqTime = reqTime if curPlayer: reqInfo.IsOnLine = True viewCache = PlayerViewCache.FindViewCache(playerID) if viewCache: reqInfo.Name = viewCache.GetPlayerName() reqInfo.NameLen = len(reqInfo.Name) reqInfo.LV = viewCache.GetLV() reqInfo.Job = viewCache.GetJob() reqInfo.RealmLV = viewCache.GetRealmLV() reqInfo.Face = viewCache.GetFace() reqInfo.FacePic = viewCache.GetFacePic() reqInfo.FightPower = viewCache.GetFightPower() reqInfo.FightPowerEx = viewCache.GetFightPowerEx() reqInfo.ServerID = viewCache.GetServerID() clientPack.ReqJoinList.append(reqInfo) if len(clientPack.ReqJoinList) >= 100: break clientPack.ReqCnt = len(clientPack.ReqJoinList) return clientPack #// A6 21 ÉóºËÇëÇó¼ÓÈë¼Ò×å #tagCMJoinFamilyReply # #struct tagCMJoinFamilyReply #{ # tagHead Head; # DWORD TagPlayerID; //±»ÉóºËÍæ¼ÒID 0Ôò´ú±íÈ«²¿ # BYTE IsOK; //ÊÇ·ñͬÒâÆä¼ÓÈë #}; def OnJoinFamilyReply(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) tagPlayerID = clientData.TagPlayerID isOK = clientData.IsOK playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): #GameWorld.DebugLog("ûÓÐÕÐÈËȨÏÞ£¬ÎÞ·¨ÉóºËÈËÔ±ÈëÃË!", playerID) PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Popedom") return GameWorld.DebugLog("ÉóºËÈëÃËÉêÇë: tagPlayerID=%s,familyID=%s,isOK=%s" % (tagPlayerID, familyID, isOK), playerID) reqPlayerIDDict = family.GetReqJoinPlayerInfo() tagPlayerIDList = reqPlayerIDDict.keys() if tagPlayerID: if tagPlayerID not in reqPlayerIDDict: GameWorld.DebugLog("²»´æÔÚ¸ÃÉêÇëÈËÔ±! tagPlayerID=%s" % tagPlayerID) return tagPlayerIDList = [tagPlayerID] if not tagPlayerIDList: GameWorld.DebugLog("ûÓÐÉêÇëÈËÔ±!") return playerManager = GameWorld.GetPlayerManager() # ¾Ü¾ø if not isOK: for tagPlayerID in tagPlayerIDList: family.DelReqJoinPlayerID(tagPlayerID) tagPlayer = playerManager.FindPlayerByID(tagPlayerID) if not tagPlayer: continue Sync_RequestAddFamilyInfo(tagPlayer) #jiazu_pan_592934:{%S}¾Ü¾øÁËÄúµÄÈë°ïÉêÇë PlayerControl.NotifyCode(tagPlayer, "jiazu_pan_592934", [family.GetName()]) Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) return # ´¦ÀíͬÒâ offlinePlayerCanJoin = IpyGameDataPY.GetFuncCfg("FamilyReqJoin", 3) MemberMax = GetFamilySetting(family.GetLV(), "MemberMax") joinOKPlayerIDList = [] for tagPlayerID in tagPlayerIDList: if family.GetCount() >= MemberMax: PlayerControl.NotifyCode(curPlayer, "jiazu_lhs_202580") break tagPlayer = playerManager.FindPlayerByID(tagPlayerID) #ÉêÇëÄ¿±ê²»ÔÚÏß if not tagPlayer: if not offlinePlayerCanJoin: GameWorld.DebugLog("ÀëÏßÍæ¼ÒÎÞ·¨¼ÓÈëÏÉÃË! tagPlayerID=%s" % tagPlayerID, playerID) PlayerControl.NotifyCode(curPlayer, "jiazu_hwj35_367906") continue if family.FindMember(tagPlayerID): GameWorld.DebugLog("ÒѾ­ÊDZ¾Ã˳ÉÔ±! tagPlayerID=%s" % tagPlayerID, playerID) PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat") continue tagFamilyID = familyMgr.GetPlayerFamilyID(tagPlayerID) if tagFamilyID: GameWorld.DebugLog("ÒѾ­¼ÓÈëÆäËûÏÉÃË! tagPlayerID=%s,tagFamilyID=%s" % (tagPlayerID, tagFamilyID), playerID) PlayerControl.NotifyCode(curPlayer, "XW_JZ_InviteErr_Repeat") continue DoPlayerJionFamily(family, tagPlayerID, tagPlayer, broadcastFamilyChange=False) joinOKPlayerIDList.append(tagPlayerID) if not joinOKPlayerIDList: return Broadcast_FamilyChange(familyID, FamilyChangeType_MemJoin, excludeIDList=joinOKPlayerIDList) Broadcast_FamilyPack(familyID, GetPack_FamilyReqJoinInfo(familyID), FamilyPowerID_Call) return #// A6 22 ÐÞ¸ÄÊÕÈË·½Ê½ #tagCMChangeFamilyJoin # #struct tagCMChangeFamilyJoin #{ # tagHead Head; # BYTE JoinReview; //³ÉÔ±¼ÓÈëÊÇ·ñÐèÒªÉóºË£¬Ä¬ÈÏ0×Ô¶¯¼ÓÈë # WORD JoinLVMin; //ÏÞÖÆ×îµÍ¿É¼ÓÈëµÄÍæ¼ÒµÈ¼¶ #}; def OnChangeFamilyJoin(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) joinReview = clientData.JoinReview joinLVMin = clientData.JoinLVMin playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Call): GameWorld.DebugLog("ûÓÐÕÐÈËȨÏÞ", playerID) return GameWorld.DebugLog("ÐÞ¸ÄÕÐÈËÉèÖÃ: familyID=%s,joinReview=%s,joinLVMin=%s" % (familyID, joinReview, joinLVMin), playerID) family.SetJoinReview(joinReview) family.SetJoinLVMin(joinLVMin) Sync_FamilyInfo(curPlayer) Broadcast_FamilyChange(familyID, FamilyChangeType_JoinSet, FamilyPowerID_Call, excludeIDList=[playerID]) return #// A6 23 Ð޸ļÒ×幫¸æ #tagCMChangeFamilyBroadcast # #struct tagCMChangeFamilyBroadcast #{ # tagHead Head; # char Msg[200]; #}; def OnChangeFamilyBroadcast(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) broadcast = clientData.Msg playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Broadcast): GameWorld.DebugLog("ûÓÐÐ޸Ĺ«¸æÈ¨ÏÞ", playerID) return family.SetBroadcast(broadcast) GameWorld.DebugLog('¸ü¸ÄÏÉÃ˹«¸æ: Family=%s,¹«¸æ=%s' % (GameWorld.CodeToGbk(family.GetName()), GameWorld.CodeToGbk(broadcast)), playerID) Sync_FamilyInfo(curPlayer) Broadcast_FamilyChange(familyID, FamilyChangeType_Broadcast, excludeIDList=[playerID]) return #// A6 24 Ð޸ļÒ×å»ÕÕ #tagCMChangeFamilyEmblem # #struct tagCMChangeFamilyEmblem #{ # tagHead Head; # BYTE EmblemID; // ¸ü»»µÄ»ÕÕÂID #}; def OnChangeFamilyEmblem(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) changeEmblemID = clientData.EmblemID PlayerFamilyEmblem.OnChangeFamilyEmblem(curPlayer, changeEmblemID) return #// A6 25 Ð޸ļÒ×å³ÉԱְλ #tagCMChangeFamilyMemLV # #struct tagCMChangeFamilyMemLV #{ # tagHead Head; # DWORD PlayerID; // Ä¿±ê³ÉÔ±ID # BYTE FmLV; // ±ä¸üΪxxְλ #}; def OnChangeFamilyMemLV(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) OnChangeFamilyMemberLV(curPlayer, clientData.PlayerID, clientData.FmLV) return def OnChangeFamilyMemberLV(curPlayer, tagID, changeFmlv, isGMOP=False): '''±ä¸ü³ÉԱְλ @param curPlayer: ²Ù×÷µÄÍæ¼Ò @param tagID: Ä¿±ê³ÉÔ±ID @param changeFmlv: ÐÞ¸ÄΪxxְλ @param isGMOP: ÊÇ·ñÊÇGMºǫ́·¢ÆðµÄ£¬Èç¹ûÊÇGM·¢ÆðµÄ£¬Ò»°ãcurPlayer´«ÈëµÄΪĿ±ê³ÉÔ±IDʵÀý ''' if not curPlayer: return playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if changeFmlv < 0 or changeFmlv > IPY_PlayerDefine.fmlLeader: GameWorld.DebugLog("²»´æÔÚ¸ÃְλµÈ¼¶! changeFmlv=%s" % changeFmlv) return # ·ÇGM²Ù×÷µÄÐè¼ì²éȨÏÞ if not isGMOP: if not GetFamilyMemberHasPow(curMember, FamilyPowerID_ChangeFmlv): return if playerID == tagID: GameWorld.DebugLog("²»ÄÜÈÎÃâ×Ô¼ºµÄ¼Ò×åְλ", playerID) return tagMember = family.FindMember(tagID) if tagMember == None: GameWorld.DebugLog("¸ü¸Ä¼Ò×å³ÉԱְλʱĿ±ê³ÉÔ±²»´æÔÚ! tagID=%s" % tagID, playerID) return if not isGMOP: if curMember.GetFmLV() != IPY_PlayerDefine.fmlLeader: if changeFmlv >= curMember.GetFmLV(): GameWorld.DebugLog("Ð޸ĵÄְλ²»ÄܱÈ×Ô¼º¸ß»òƽ¼¶! changeFmlv=%s" % changeFmlv, playerID) return if tagMember.GetFmLV() >= curMember.GetFmLV(): GameWorld.DebugLog("Ð޸ĵÄÄ¿±ê³ÉԱְλ²»ÄܱÈ×Ô¼º¸ß»òƽ¼¶! tagFmlv=%s" % tagMember.GetFmLV(), playerID) return if changeFmlv == IPY_PlayerDefine.fmlLeader: changeType = FamilyChangeType_LeaderChange ChangeFamilyLeader(family, tagMember) else: fmLVMemCnt = 0 for index in range(family.GetCount()): familyMember = family.GetAt(index) if familyMember.GetFmLV() != changeFmlv: continue fmLVMemCnt += 1 maxCnt = GetFamilySetting(family.GetLV(), Def_FmlSetAttrName.get(changeFmlv, "")) if fmLVMemCnt >= maxCnt: # jiazu_hwj35_272921 ¸ÄΪ jiazu_chenxin_31379 PlayerControl.NotifyCode(curPlayer, "jiazu_chenxin_31379") GameWorld.DebugLog("Ŀǰ¸ÃְλµÄÈËÊýÒѾ­´ïµ½ÉÏÏÞ! changeFmlv=%s,fmLVMemCnt=%s >= %s" % (changeFmlv, fmLVMemCnt, maxCnt)) return changeType = FamilyChangeType_MemFmlvChange ChangeFamilyMemberLv(tagMember, changeFmlv) if isGMOP: family.SetBroadcast("") Sync_FamilyInfo(curPlayer) Broadcast_FamilyChange(familyID, changeType, excludeIDList=[playerID, tagID]) return True def ChangeFamilyLeader(family, newLeaderMem): ## ±ä¸ü¼Ò×å×峤 familyID = family.GetID() befLeaderID = family.GetLeaderID() newLeaderID = newLeaderMem.GetPlayerID() if befLeaderID == newLeaderID: return befLeaderMem = family.FindMember(befLeaderID) if befLeaderMem: #°ÑÔ­×峤½µÎªÆÕͨ³ÉÔ± ChangeFamilyMemberLv(befLeaderMem, IPY_PlayerDefine.fmlMember) family.SetLeaderID(newLeaderID) ChangeFamilyMemberLv(newLeaderMem, IPY_PlayerDefine.fmlLeader) GameWorld.Log("¼Ò×åÉèÖÃÐÂ×峤! familyID=%s,newLeaderID=%s,befLeaderID=%s" % (familyID, newLeaderID, befLeaderID)) return def ChangeFamilyMemberLv(tagMember, changeFamilyLV): ## Ð޸ijÉԱְλ£¬Ö»×öÐÞ¸ÄÂß¼­£¬²»×öÑéÖ¤£¬ÑéÖ¤Óɸ÷µ÷ÓÃÈë¿Ú×ÔÐÐÑéÖ¤ familyID = tagMember.GetFamilyID() tagID = tagMember.GetPlayerID() memName = tagMember.GetPlayerName() befFamilyLV = tagMember.GetFmLV() tagMember.SetFmLV(changeFamilyLV) tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagID) if tagPlayer: MapServer_FamilyRefresh(tagPlayer, familyID) Sync_FamilyInfo(tagPlayer) if GetFamilyMemberHasPow(tagMember, FamilyPowerID_Call): NetPackCommon.SendFakePack(tagPlayer, GetPack_FamilyReqJoinInfo(familyID)) # ¼Ç¼¼Ò×åʼþ¼Ç¼ÐÅÏ¢ tick = GameWorld.GetGameWorld().GetTick() AddFamilyActionNote(memName, familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_FMLV, changeFamilyLV, befFamilyLV], tick) #xx±»ÈÎÃüΪxx NotifyAllFamilyMemberMsg(familyID, "XW_JZ_AppointFamily", [memName, changeFamilyLV]) #GetFamilyMgr().SetSyncCrossFamilyUpd(familyMember.GetFamilyID(), familyMember.GetPlayerID(), syncNow=True) # ³ÉԱְλ±ä¸ü return #// A6 26 ÇëÇó¼Ò×å³ÉÔ±Áбí #tagCMGetFamilyInfo # #struct tagCMGetFamilyInfo #{ # tagHead Head; #}; def OnGetFamilyInfo(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) Sync_FamilyInfo(curPlayer) return #// A6 03 À뿪¼Ò×å #tagCMLeaveFamily # #struct tagCMLeaveFamily #{ # tagHead Head; #}; def OnLeaveFamily(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return familyLV = curMember.GetFmLV() # ְλ if family.GetCount() > 1 and familyLV == IPY_PlayerDefine.fmlLeader: GameWorld.DebugLog("×峤ÔÚ³ÉÔ±ÈËÊý´óÓÚ1ʱ²»ÄÜÖ±½ÓÍ˳ö¼Ò×å", playerID) return # ¹¦ÄÜÏÞÖÆÍ˳öÏÉÃË # ... # ½ø³öʱ¼äÏÞÖÆÔݲ»×ö£¬µÈÕýʽ¹¦ÄÜÔÙ²¹ #PlayerControl.SetLeaveFamilyTime(curPlayer, updTime) # Ö´ÐÐÍ˳ö GameWorld.DebugLog("À뿪¼Ò×å! familyID=%s" % familyID, playerID) family.DeleteMember(playerID) AddFamilyActionNote(curPlayer.GetName(), familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_Leave], tick) #XW_JZ_LeaveFamily {%S1%}Í˳öÁ˼Ò×壡 25 - - NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [curPlayer.GetName()]) MapServer_FamilyRefresh(curPlayer, 0) if family.GetCount() == 0: #Íæ¼ÒÀ뿪ºó, ¼Ò×åûÓÐÈËÁË , ɾ³ýÕâ¸ö¼Ò×å familyMgr.DelFamily(familyID) return Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave) return #// A6 05 ɾ³ý¼Ò×å³ÉÔ± #tagCMDeleteFamilyMember # #struct tagCMDeleteFamilyMember #{ # tagHead Head; # DWORD MemberID; #}; def OnDeleteFamilyMember(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) tagMemberID = clientData.MemberID playerID = curPlayer.GetPlayerID() if playerID == tagMemberID: return familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if not GetFamilyMemberHasPow(curMember, FamilyPowerID_Kick): GameWorld.DebugLog("ûÓÐÌßÈËȨÏÞ!") return tagMember = family.FindMember(tagMemberID) if not tagMember: return curFmlv = curMember.GetFmLV() tagFmlv = tagMember.GetFmLV() if tagFmlv >= curFmlv: GameWorld.DebugLog("Ö»ÄÜÌß±È×Ô¼ºÖ°Î»µÍµÄ³ÉÔ±! tagMemberID=%s,tagFmlv(%s) >= curFmlv(%s)" % (tagMemberID, tagFmlv, curFmlv), playerID) return # ¹¦ÄÜÏÞÖÆÌßÈË # ... tagPlayerName = tagMember.GetPlayerName() # ±»ÌßÍæ¼ÒÃû tagPlayerID = tagMember.GetPlayerID() # ±»ÌßÍæ¼ÒID family.DeleteMember(tagPlayerID) AddFamilyActionNote(tagPlayerName, familyID, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_MemberChange, ShareDefine.Def_FamilyMemberChange_KickOut], tick) #XW_JZ_LeaveFamily {%S1%}Í˳öÁ˼Ò×壡 25 - - NotifyAllFamilyMemberMsg(familyID, "XW_JZ_LeaveFamily", [tagPlayerName]) #ɾ³ýÍæ¼Ò tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(tagMemberID) if tagPlayer: MapServer_FamilyRefresh(tagPlayer, 0) Broadcast_FamilyChange(familyID, FamilyChangeType_MemLeave) return #// A6 11 ¼Ò×å¸ÄÃû #tagCMRenameFamily # #struct tagCMRenameFamily #{ # tagHead Head; # BYTE NewNameLen; # char NewName[NewNameLen]; # BYTE ItemIndex; //¸ÄÃûÎïÆ·ÔÚ±³°üÖеÄλÖà #}; def UpdateFamilyName(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) newName = clientData.NewName itemIndex = clientData.ItemIndex playerID = curPlayer.GetPlayerID() familyID = curPlayer.GetFamilyID() if familyID <= 0: return familyMgr = DBDataMgr.GetFamilyMgr() family = familyMgr.FindFamily(familyID) if not family: return curMember = family.FindMember(playerID) if not curMember: return if curMember.GetFmLV() != IPY_PlayerDefine.fmlLeader: GameWorld.DebugLog("·ÇÃËÖ÷²»¿É¸ÄÃû!", playerID) return familyName = CheckInputFamilyName(curPlayer, newName) if not familyName: return itemPack = curPlayer.GetItemManager().GetPack(IPY_GameWorld.rptItem) curItem = itemPack.GetAt(itemIndex) if not ItemCommon.CheckItemCanUse(curItem) or curItem.GetType() != ChConfig.Def_ItemType_ChangeFamilyName: GameWorld.DebugLog("ûÓÐÏÉÃ˸ÄÃûµÀ¾ß! itemIndex=%s" % itemIndex, playerID) return ItemCommon.DelItem(curPlayer, curItem, 1, True, 'UpdateFamilyName') #oldName = curFamily.GetName() family.SetName(familyName) infoPack = GetPack_FamilyInfo(familyID) playerManager = GameWorld.GetPlayerManager() for index in xrange(family.GetCount()): member = family.GetAt(index) memID = member.GetPlayerID() player = playerManager.FindPlayerByID(memID) if not player: continue Sync_FamilyInfo(player, infoPack) player.SetFamilyName(familyName) player.Notify_FamilyNameRefresh() #//04 36 ÖÜÎ§Íæ¼Ò¼Ò×åÃûË¢ÐÂ#tagPlayerFamilyNameRefresh #PlayerCompensation.SendMailByKey('FamilyNameChange', memberIDList, [], [oldName, familyName]) #PlayerControl.WorldNotify(0, 'Family_ChangeName', [oldName, familyName]) return #// A6 20 ËÑË÷¼Ò×åÁбí #tagCMViewFamilyPage # #struct tagCMViewFamilyPage #{ # tagHead Head; # BYTE MsgLen; //Ä£ºýËÑË÷¼Ò×壬Èç¹ûÊäÈëΪ¿Õ£¬ÔòΪ²»ÏÞÖÆ¸ÃÌõ¼þ # char Msg[MsgLen]; //size = MsgLen # BYTE PageIndex; //²éѯµÚXÒ³Ë÷Òý£¬0~n # BYTE ShowCount; //ÿҳÊýÁ¿£¬Ç°¶Ë¿É×ÔÐÐÖ¸¶¨£¬×î´ó50 #}; def OnViewFamilyPage(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) msg = clientData.Msg pageIndex = clientData.PageIndex showCount = min(clientData.ShowCount, 50) familyMgr = DBDataMgr.GetFamilyMgr() familyCount = familyMgr.GetCount() totalPage = 0 if not msg: startIndex = pageIndex * showCount endIndex = startIndex + showCount - 1 if familyCount > 0: totalPage = GameWorld.GetIntUpper(familyCount, showCount) # ÓÐÖ¸¶¨ËÑË÷ÄÚÈݵĺó¶Ë¹Ì¶¨·µ»Øµ¥Ò³ else: pageIndex = 0 showCount = 20 totalPage = 1 startIndex = 0 endIndex = familyCount - 1 clientPack = ChPyNetSendPack.tagMCFamilyViewList() clientPack.Msg = msg clientPack.MsgLen = len(clientPack.Msg) clientPack.PageIndex = pageIndex clientPack.ShowCount = showCount clientPack.TotalPage = totalPage clientPack.FamilyList = [] for index in range(startIndex, endIndex + 1): if index >= familyCount: break family = familyMgr.GetAt(index) if not family: continue if msg and msg not in family.GetName(): continue familyView = ChPyNetSendPack.tagMCFamilyView() familyView.FamilyID = family.GetID() familyView.FamilyName = family.GetName() familyView.FamilyNameLen = len(familyView.FamilyName) familyView.LeaderID = family.GetLeaderID() leaderMember = family.FindMember(familyView.LeaderID) familyView.LeaderName = leaderMember.GetPlayerName() if leaderMember else "" familyView.LeaderNameLen = len(familyView.LeaderName) familyView.FamilyLV = family.GetLV() familyView.JoinReview = family.GetJoinReview() familyView.JoinLVMin = family.GetJoinLVMin() familyView.ServerID = family.GetServerID() familyView.EmblemID = family.GetEmblemID() familyView.FightPower = family.GetFightPower() familyView.FightPowerEx = family.GetFightPowerEx() familyView.MemberCount = family.GetCount() clientPack.FamilyList.append(familyView) clientPack.FamilyCount = len(clientPack.FamilyList) if clientPack.FamilyCount >= showCount: break NetPackCommon.SendFakePack(curPlayer, clientPack) return #// A6 12 ¼Ò×å¾èÏ×»õ±Ò #tagCMFamilyMoneyDonate # #struct tagCMFamilyMoneyDonate #{ # tagHead Head; # BYTE DonateType; // ¾èÏ×ÀàÐÍ #}; def OnFamilyMoneyDonate(index, clientData, tick): #curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) #DonateType = clientData.DonateType #playerID = curPlayer.GetPlayerID() # ÏÈÆÁ±Î£¬µÈ¹¦Äܶ¨ÁËÔÙ¸Ä return #--------------------------------------------------------------------- def AddPlayerFamilyActiveValue(curPlayer, addValue, sendPackGameServer = False, reason = 0, isSysMsg=False): # ¶à¸öµØ·½Óõ½£¬Ïȱ£Áô£¬Ö®ºóɾ³ýͳһÐÞ¸Ä return True def SendPack_GameServer_AddFamilyDetail(curPlayer, addFamilyHornor = 0, addFamilyMoney = 0, addFamilyActiveValue = 0, resion=0): return def SendPack_GameServer_AddFamilyDetailEx(curPlayer, addPlayerActiveValue, addFamilyMoney = 0, addFamilyHornor = 0, resion=0): return ## ------------------------------------------------------------------------------------------------ #// A6 17 ²éѯ¼Ò×åÐÐΪÐÅÏ¢ #tagCMQueryFamilyAction # #struct tagCMQueryFamilyAction #{ # tagHead Head; # BYTE ActionType; // ÐÐΪÀàÐÍ # DWORD FamilyID; // ¼Ò×åID£¬·¢0ĬÈÏ×Ô¼º¼Ò×å #}; def OnQueryFamilyAction(index, cliendData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) if not curPlayer: return actionType = cliendData.ActionType familyID = cliendData.FamilyID if not familyID: familyID = curPlayer.GetFamilyID() SendFamilyActionInfo(curPlayer, familyID, actionType) return def SendFamilyActionInfo(curPlayer, familyID, actionType): ## ·¢ËͼÒ×åÐÐΪ # @param curPlayer: ΪNoneʱ֪ͨ¸ÃÏÉÃËËùÓгÉÔ± familyAction = DBDataMgr.GetFamilyActionMgr().GetFamilyAction(familyID, actionType) clientPack = ChPyNetSendPack.tagMCFamilyActionInfo() clientPack.FamilyID = familyID clientPack.ActionType = actionType clientPack.FamilyActionList = [] for index in xrange(familyAction.Count()): familyActionData = familyAction.At(index) actionData = ChPyNetSendPack.tagMCFamilyAction() actionData.Time = familyActionData.GetTime() actionData.Name = familyActionData.GetName() actionData.NameLen = len(actionData.Name) actionData.Value1 = familyActionData.GetValue1() actionData.Value2 = familyActionData.GetValue2() actionData.Value3 = familyActionData.GetValue3() actionData.Value4 = familyActionData.GetValue4() actionData.Value5 = familyActionData.GetValue5() actionData.Value6 = familyActionData.GetValue6() actionData.UseData = familyActionData.GetUserData() actionData.UseDataLen = len(actionData.UseData) clientPack.FamilyActionList.append(actionData) clientPack.Count = len(clientPack.FamilyActionList) if curPlayer: NetPackCommon.SendFakePack(curPlayer, clientPack) return Broadcast_FamilyPack(familyID, clientPack) return def SendFamilyAction(actionDataList, curPlayer=None): ## ͬ²½Ö¸¶¨ÏÉÃËaction # @param actionDataList: Ö§³ÖÁбí»òÖ¸¶¨actionData # @param curPlayer: ΪNoneʱ֪ͨ¸ÃÏÉÃËËùÓгÉÔ± if not isinstance(actionDataList, list): actionDataList = [actionDataList] if not actionDataList: return familyActionData = actionDataList[0] familyID = familyActionData.GetFamilyID() actionType = familyActionData.GetActionType() clientPack = ChPyNetSendPack.tagMCFamilyActionInfo() clientPack.FamilyID = familyID clientPack.ActionType = actionType clientPack.FamilyActionList = [] for familyActionData in actionDataList: actionData = ChPyNetSendPack.tagMCFamilyAction() actionData.Time = familyActionData.GetTime() actionData.Name = familyActionData.GetName() actionData.NameLen = len(actionData.Name) actionData.Value1 = familyActionData.GetValue1() actionData.Value2 = familyActionData.GetValue2() actionData.Value3 = familyActionData.GetValue3() actionData.Value4 = familyActionData.GetValue4() actionData.Value5 = familyActionData.GetValue5() actionData.Value6 = familyActionData.GetValue6() actionData.UseData = familyActionData.GetUserData() actionData.UseDataLen = len(actionData.UseData) clientPack.FamilyActionList.append(actionData) clientPack.Count = len(clientPack.FamilyActionList) if curPlayer: NetPackCommon.SendFakePack(curPlayer, clientPack) return Broadcast_FamilyPack(familyID, clientPack) return def GetFamilyDayAward(curPlayer): ##ÁìÈ¡ÏÉÃËÿÈÕ½±Àø 2СʱÍÑ»ú¹Òʱ¼ä return def Sync_FamilyDayRewardState(curPlayer): clientPack = ChPyNetSendPack.tagMCFamilyDayAward() clientPack.GetState = 0 clientPack.MoneyDonateCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyDonateRecord) NetPackCommon.SendFakePack(curPlayer, clientPack) return def AddFamilyActivity(curPlayer, actionid, addCnt=1): return ##--------------------------------------- ÏÉÃËÊÂÎñ -------------------------------------------------- AffairState_None = 0 # ÎÞ AffairState_Underway = 1 # ½øÐÐÖÐ AffairState_Finish = 2 # ÒÑÍê³É #// A6 13 ¼Ò×åÊÂÎñ²Ù×÷ #tagCMFamilyAffairOP # #struct tagCMFamilyAffairOP #{ # tagHead Head; # BYTE OPType; // ²Ù×÷ÀàÐÍ£º1-Ë¢ÐÂÊÂÎñ£»2-¿ªÊ¼ÊÂÎñ£»3-ÁìÈ¡ÊÂÎñ½±Àø£» # WORD AffairID; // ÊÂÎñID£¬¿ÉÑ¡ #}; def OnFamilyAffairOP(index, clientData, tick): curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index) opType = clientData.OPType affairID = clientData.AffairID if opType == 1: __FamilyAffair_Refresh(curPlayer) elif opType == 2: __FamilyAffair_Start(curPlayer, affairID) elif opType == 3: __FamilyAffair_GetAward(curPlayer, affairID) return def __FamilyAffair_CheckReset(curPlayer): ## ¼ì²éÈÎÎñÖØÖ㬵Ǽ£¬½øÈëÏÉÃË´¥·¢ info = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairInfo % 1) if not info: # ÈÎÎñ1»¹Ã»·ÖÅ䣬ĬÈÏÇ¿ÖÆÖØÖà __FamilyAffair_Refresh(curPlayer, True) else: SyncFamilyAffairInfo(curPlayer) return def __FamilyAffair_Refresh(curPlayer, isReset=False): ## Ë¢ÐÂÊÂÎñ playerID = curPlayer.GetPlayerID() moneyType, moneyValue = 0, 0 dayRefreshFreeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairRefreshFree) if not isReset: freeCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 2) if freeCountMax and dayRefreshFreeCount >= freeCountMax: moneyType, moneyValue = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 3) if not PlayerControl.HaveMoney(curPlayer, moneyType, moneyValue): return sendMailAffairList = [] refreshAffairIDList = [] affairCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 1) affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4) maxStar = 0 starWeightList = [] for starStr, starInfo in affairStarDict.items(): star = int(starStr) if star > maxStar: maxStar = star starWeightList.append([starInfo[0], star]) for affairID in range(1, affairCountMax + 1): star, state = __GetAffairInfo(curPlayer, affairID) if isReset: # ÖØÖÃʱ»¹ÔÚ½øÐÐÖеÄÖ±½Ó·¢½±Àø if state == AffairState_Underway: sendMailAffairList.append([affairID, star]) refreshAffairIDList.append(affairID) else: # ·ÇÖØÖÃÖ»´¦ÀíûÓÐ״̬·Ç×î¸ßÐÇµÄ if state == AffairState_None and star < maxStar: refreshAffairIDList.append(affairID) GameWorld.DebugLog("Ë¢ÐÂÊÂÎñ: isReset=%s,moneyType=%s,moneyValue=%s,dayRefreshFreeCount=%s" % (isReset, moneyType, moneyValue, dayRefreshFreeCount), playerID) GameWorld.DebugLog(" sendMailAffairList=%s" % sendMailAffairList, playerID) for mailInfo in sendMailAffairList: affairID, star = mailInfo if str(star) not in affairStarDict: continue paramList = [affairID, star] addItemList = affairStarDict[str(star)][2] PlayerControl.SendMailByKey("FamilyAffairAward", [playerID], addItemList, paramList) if isReset: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairRefreshFree, 0) for affairID in range(1, affairCountMax + 1): PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID, 0) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID, 0) else: if moneyType and moneyValue: PlayerControl.PayMoney(curPlayer, moneyType, moneyValue, "FamilyAffair") else: PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairRefreshFree, dayRefreshFreeCount + 1) GameWorld.DebugLog(" starWeightList=%s" % starWeightList, playerID) GameWorld.DebugLog(" refreshAffairIDList=%s" % refreshAffairIDList, playerID) for affairID in refreshAffairIDList: star = GameWorld.GetResultByWeightList(starWeightList, 1) __SetAffairInfo(curPlayer, affairID, star, AffairState_None) GameWorld.DebugLog(" Ëæ»úÊÂÎñ:affairID=%s,star=%s" % (affairID, star), playerID) SyncFamilyAffairInfo(curPlayer) return def __FamilyAffair_Start(curPlayer, affairID): ## ¿ªÊ¼ÊÂÎñ playerID = curPlayer.GetPlayerID() star, state = __GetAffairInfo(curPlayer, affairID) if not star: return if state != AffairState_None: GameWorld.DebugLog("ÏÉÃËÊÂÎñÒѾ­½øÐÐÖлòÒÑÍê³É£¬ÎÞ·¨¿ªÊ¼: affairID=%s,star=%s,state=%s" % (affairID, star, state), playerID) return startTime = int(time.time()) PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID, startTime) __SetAffairInfo(curPlayer, affairID, star, AffairState_Underway) GameWorld.DebugLog("ÏÉÃËÊÂÎñ¿ªÊ¼: affairID=%s,star=%s,startTime=%s" % (affairID, star, startTime), playerID) SyncFamilyAffairInfo(curPlayer, affairID) return def __FamilyAffair_GetAward(curPlayer, affairID): ## ÁìÈ¡ÊÂÎñ½±Àø playerID = curPlayer.GetPlayerID() curTime = int(time.time()) affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4) star, state = __GetAffairInfo(curPlayer, affairID) if state != AffairState_Underway: GameWorld.DebugLog("ÏÉÃËÊÂÎñ״̬·Ç½øÐÐÖÐÎÞ·¨ÁìÈ¡: affairID=%s,star=%s,state=%s" % (affairID, star, state), playerID) SyncFamilyAffairInfo(curPlayer, affairID) return startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID) remainDuration = __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict) if remainDuration != 0: GameWorld.DebugLog("ÏÉÃËÊÂÎñµ±Ç°Ê£Óàʱ³¤Î´Íê³É: affairID=%s,remainDuration=%s,startTime=%s" % (affairID, remainDuration, startTime), playerID) SyncFamilyAffairInfo(curPlayer, affairID) return if str(star) not in affairStarDict: return addItemList = affairStarDict[str(star)][2] if not ItemCommon.GiveAwardItem(curPlayer, addItemList): return __SetAffairInfo(curPlayer, affairID, star, AffairState_Finish) GameWorld.DebugLog("ÏÉÃËÊÂÎñÁì½±: affairID=%s,star=%s" % (affairID, star), playerID) SyncFamilyAffairInfo(curPlayer, affairID) return def __GetAffairInfo(curPlayer, affairID): affairInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID) star, state = affairInfo / 10, affairInfo % 10 return star, state def __SetAffairInfo(curPlayer, affairID, star, state): info = star * 10 + state PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_Player_Dict_FamilyAffairInfo % affairID, info) return def __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict): ## -1-δ¿ªÊ¼£»>=0-Ê£Óàʱ³¤ startTime = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairStartTime % affairID) if not startTime: return -1 starInfo = affairStarDict.get(str(star), []) needDuration = starInfo[1] if len(starInfo) > 1 else 0 # ¿ÉÀ©Õ¹¼õʱ³¤ÊôÐÔ speedPer = PlayerControl.GetAffairSpeedPer(curPlayer) if speedPer: needDuration = int(needDuration * max(10000 - speedPer, 0) / 10000.0) #GameWorld.DebugLog("ÊÂÎñ¼ÓËÙ: needDuration=%s,speedPer=%s" % (needDuration, speedPer), curPlayer.GetPlayerID()) remainDuration = max(needDuration - (curTime - startTime), 0) return remainDuration def SyncFamilyAffairInfo(curPlayer, affairID=None): if affairID == None: affairIDList = [] affairCountMax = IpyGameDataPY.GetFuncCfg("FamilyAffair", 1) for affairID in range(1, affairCountMax + 1): affairIDList.append(affairID) else: affairIDList = [affairID] curTime = int(time.time()) affairStarDict = IpyGameDataPY.GetFuncEvalCfg("FamilyAffair", 4) affairInfoList = [] for affairID in affairIDList: star, state = __GetAffairInfo(curPlayer, affairID) remainDuration = __GetAffairRemainDuration(curPlayer, affairID, star, curTime, affairStarDict) affairInfo = ChPyNetSendPack.tagMCFamilyAffair() affairInfo.AffairID = affairID affairInfo.Star = star affairInfo.State = state affairInfo.RemainDuration = max(0, remainDuration) affairInfoList.append(affairInfo) if not affairInfoList: return clientPack = ChPyNetSendPack.tagMCFamilyAffairInfo() clientPack.Clear() clientPack.RefreshFreeCount = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_FamilyAffairRefreshFree) clientPack.AffairInfoList = affairInfoList clientPack.Count = len(clientPack.AffairInfoList) NetPackCommon.SendFakePack(curPlayer, clientPack) return