| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #---------------------------------------------------------------------  | 
| #  | 
| #---------------------------------------------------------------------  | 
| ##@package PlayerFamilyAction  | 
| # @todo: ¼Ò×åÐÐΪ  | 
| #  | 
| # @author: jiang  | 
| # @date  2011-11-30  | 
| # @version 2.1  | 
| # @note:   | 
| # @change: "2013-03-13 17:00" wdb É¾³ý·â°ü  | 
| # @change: "2013-06-06 15:00" Alee »Ö¸´¼Ò×å·â°ü  | 
| # @change: "2013-12-06 15:00" hxp Ð޸ļÒ×åÅÅÐаñ³ÉÔ±ÅжϷµ»ØÖµ  | 
| # @change: "2014-05-04 20:00" xmnathan Ôö¼Ó¼Ò×åÊÕÈËÉóºË·½Ê½£¬¼°¸ù¾Ý²»Í¬·½Ê½½øÐд¦Àí  | 
| # @change: "2014-09-22 11:30" hxp Ôö¼Ó֪ͨMapServerÍæ¼ÒÉêÇë¼ÓÈë¼Ò×åÉêÇë³É¹¦Óë·ñ  | 
| # @change: "2014-10-31 13:30" hxp »Ö¸´Õ½ÃËÐüÉÍÈÎÎñ  | 
| # @change: "2015-03-22 17:00" hxp Ôö¼Ó¿Í»§¶Ë²éѯ¼Ò×åÐÐΪ; ¼Ò×åÐÐΪÔö¼ÓuseData  | 
| # @change: "2015-04-02 19:00" hxp Çå³ýFamilyActionÖ§³ÖuseData  | 
| # @change: "2015-04-07 14:00" hxp Çå³ýFamilyActionÔö¼Ó·µ»ØÖµ  | 
| # @change: "2015-04-09 11:00" hxp ²éѯFamilyAction²»ÏÞÖÆ±¾Õ½ÃË  | 
| # @change: "2016-05-18 16:00" hxp Ôö¼ÓÕ½Ã˹ÙԱģÐÍ×°±¸ÐÅÏ¢¸üд¦Àí  | 
| #---------------------------------------------------------------------  | 
| #"""Version = 2016-05-18 16:00"""  | 
| #---------------------------------------------------------------------  | 
| import time  | 
| import GameWorld  | 
| import ChConfig  | 
| import NetPackCommon  | 
| import ChPyNetSendPack  | 
| import PlayerViewCache  | 
| import ShareDefine  | 
| import PlayerControl  | 
| import IPY_GameServer  | 
| import DataRecordPack  | 
| import cPickle  | 
| #---------------------------------------------------------------------  | 
|   | 
| ## ÉèÖÃÍæ¼Ò¼Ò×åÐÐΪ  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionData ÐÐΪÊý¾Ý×Ö·û´®("[Êý¾Ý1, Êý¾Ý2, Êý¾Ý3]")  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def MapServer_PlayerFamilyActionNote(curPlayer, actionType, actionData, tick):  | 
|       | 
|     actionDataList = cPickle.loads(actionData)  | 
|       | 
|     familyId = curPlayer.GetFamilyID()  | 
|       | 
|     #ÉêÇë½øÈë¼Ò×å  | 
|     if actionType == ShareDefine.Def_ActionType_FamilyAdd:  | 
|         if familyId:  | 
|             #ÒѾÓмÒ×å  | 
|             return  | 
|           | 
|         #¼Ç¼ÉêÇë¸Ã¼Ò×åµÄÐÅÏ¢  | 
|         __RequestAddFamilyNote(curPlayer, actionType, actionDataList, tick)  | 
|         return  | 
|           | 
|     if not familyId:  | 
|         #µ±Ç°Íæ¼ÒûÓмÒ×å  | 
|         return  | 
|       | 
|     #¼Ò×åÐüÉÍÈÎÎñ  | 
|     if actionType == ShareDefine.Def_ActionType_FamilyArrest:  | 
|         __AddFamilyArrestNote(curPlayer, familyId, actionType, actionDataList, tick)  | 
|         return  | 
|       | 
|     curPlayerName = curPlayer.GetName()  | 
|     AddFamilyActionNote(curPlayerName, familyId, actionType, actionDataList, tick)  | 
|     return  | 
|   | 
|   | 
| ## Ôö¼ÓÍæ¼Ò¼Ò×åÐüÉÍÈÎÎñÍê³ÉÇé¿ö  | 
| #  @param familyId ¼Ò×åʵÀý  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionDataList ÐÐΪÊý¾ÝÁÐ±í  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None    | 
| def __AddFamilyArrestNote(curPlayer, familyId, actionType, actionDataList, tick):  | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()    | 
|     familyAction = allFamilyActionManager.GetFamilyAction(familyId, actionType)  | 
|       | 
|     familyActionCnt = familyAction.Count()  | 
|     arrestId = actionDataList[0]  # ÐüÉÍÈÎÎñid  | 
|       | 
|     for index in range(0, familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|         value = familyActionData.GetValue1()  | 
|         if value == arrestId:  | 
|             #¸ÃÈÎÎñÒѾÍê³É  | 
|             return  | 
|       | 
|     curPlayerName = curPlayer.GetName()  | 
|       | 
|     #¸öÈËÌáʾ»÷ɱĿ±êÍê³É jiazu_hgg_0 »÷ɱÐüÉÍÄ¿±ê!  | 
|     PlayerControl.NotifyCode(curPlayer, "jiazu_hgg_0")  | 
|       | 
|     #È«¼Ò×åÌáʾ jiazu_hgg_31379 °ï»á³ÉÔ±%sÍê³ÉÁËÈÎÎñ  | 
|     PlayerControl.FamilyNotify(familyId, "jiazu_hgg_31379", [curPlayerName])  | 
|       | 
|     #¼Ç¼»÷ɱÈÎÎñÐÅÏ¢  | 
|     AddFamilyActionNote(curPlayerName, familyId, actionType, actionDataList, tick)  | 
|       | 
|     #¼Ç¼ÐüÉÍ»÷ɱʼþÐÅÏ¢  | 
|     AddFamilyActionNote(curPlayerName, familyId, ShareDefine.Def_ActionType_FamilyEvent, [ShareDefine.Def_FamilyActionEvent_Arrest, arrestId], tick)  | 
|     return  | 
|   | 
|   | 
| ## Ôö¼ÓÍæ¼Ò¼Ò×åÐÐΪ  | 
| #  @param curName Ãû×Ö  | 
| #  @param familyId ¸ÃÐÐΪËùÊô¼Ò×åID  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionDataList ÐÐΪÊý¾ÝÁÐ±í  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @param isClearNone ³¬¹ý¼Ç¼ʱÊÇ·ñÇå¿Õ×îÔçÊý¾Ý  | 
| #  @return ¼Ç¼ÊÇ·ñ³É¹¦  | 
| def AddFamilyActionNote(curName, familyId, actionType, actionDataList, tick, isClearNone=True, useData=""):  | 
|     if actionType not in ShareDefine.Def_ActionTypeList:  | 
|         #¼Ç¼ÐÐΪÀàÐÍ´íÎó  | 
|         GameWorld.ErrLog("¼Ç¼¼Ò×åÐÐΪÀàÐÍ:%s ´íÎó")  | 
|         return False  | 
|       | 
|     #ËùÓмÒ×åÐÐΪ¶ÔÏó¹ÜÀíÆ÷  | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()    | 
|     familyAction = allFamilyActionManager.GetFamilyAction(familyId, actionType)  | 
|       | 
|     familyActionCnt = familyAction.Count()  | 
|       | 
|     if familyActionCnt >= ChConfig.ActionTypeSaveCnt.get(actionType, 0):  | 
|         if not isClearNone:  | 
|             #³¬¹ý¼Ç¼¼Ç¼²»ÁËÁË  | 
|             return False  | 
|           | 
|         familyAction.SortByTime()  # °´Ê±¼äÉýÐò  | 
|         familyAction.DelAction(0)  # É¾³ýµÚÒ»¸ö  | 
|           | 
|     #Ìí¼ÓÒ»¸öÐÐΪ¶ÔÏó  | 
|     familyActionObj = familyAction.AddAction()  | 
|       | 
|     #---ÉèÖÃÐÐΪ¶ÔÏóÊý¾Ý---  | 
|     familyActionObj.SetFamilyId(familyId)         # ÉèÖøÃÐÐΪËùÊô¼Ò×åId  | 
|     familyActionObj.SetActionType(actionType)     # ÉèÖÃÐÐΪÀàÐÍ  | 
|     familyActionObj.SetName(curName)  # ÉèÖÃÃû×Ö  | 
|     familyActionObj.SetUseData(useData, len(useData)) # ÉèÖÃ×Ô¶¨ÒåÊý¾Ý  | 
|       | 
|     curTimeStr = GameWorld.GetCurrentDataTimeStr()  | 
|     curTimeTuple = time.strptime(curTimeStr, ChConfig.TYPE_Time_Format)  | 
|     curTimeNum = int(time.mktime(curTimeTuple))  | 
|     familyActionObj.SetTime(curTimeNum)                 # ÉèÖÃʱ¼ä  | 
|       | 
|     actionDataLen = len(actionDataList)  | 
|     if actionDataLen >= 1:  | 
|         familyActionObj.SetValue1(actionDataList[0])  | 
|       | 
|     if actionDataLen >= 2:  | 
|         familyActionObj.SetValue2(actionDataList[1])  | 
|       | 
|     if actionDataLen >= 3:  | 
|         familyActionObj.SetValue3(actionDataList[2])  | 
|           | 
|     if actionDataLen >= 4:  | 
|         familyActionObj.SetValue4(actionDataList[3])  | 
|           | 
|     if actionDataLen >= 5:  | 
|         familyActionObj.SetValue5(actionDataList[4])  | 
|           | 
|     if actionDataLen >= 6:  | 
|         familyActionObj.SetValue6(actionDataList[5])  | 
|       | 
|     return True  | 
|   | 
|   | 
| ## ¼Ç¼ÉêÇë½øÈë¸Ã¼Ò×åµÄÐÅÏ¢  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param actionType: ÐÐΪÀàÐÍ  | 
| #  @param actionDataList: ÐÐΪÊý¾ÝÁÐ±í  | 
| #  @param tick: Ê±¼ä´Á  | 
| #  @return  | 
| def __RequestAddFamilyNote(curPlayer, actionType, actionDataList, tick):  | 
|       | 
|     requestAddFamilyID = actionDataList[0]  # ÉêÇë½øÈëµÄ¼Ò×å  | 
|     fightPower = actionDataList[1] if len(actionDataList) > 1 else PlayerControl.GetFightPower(curPlayer)  | 
|     requestPlayerName = curPlayer.GetName()  # ÉêÇëµÄÍæ¼ÒÃû×Ö  | 
|       | 
|     familyManager = GameWorld.GetFamilyManager()  | 
|     curFamily = familyManager.FindFamily(requestAddFamilyID)  | 
|     if not curFamily:  | 
|         #ûÓиüÒ×å  | 
|         GameWorld.ErrLog("__RequestAddFamilyNote Err not Id = %s family" % (requestAddFamilyID))  | 
|         return  | 
|       | 
|     #¼Ò×åÉóºËÉèÖþܾøÍæ¼Ò¼ÓÈë  | 
|     curAcceptJoinType = curFamily.GetAcceptJoin()  | 
|     if curAcceptJoinType == ShareDefine.FamilyAcceptJoin_Refuse:  | 
|         GameWorld.Log("__RequestAddFamilyNote FamilyID = %s RefuseJoin" % requestAddFamilyID, curPlayer.GetID())  | 
|         return  | 
|     #¼Ò×åÉóºËÉèÖÃÔÊÐíÍæ¼ÒÖ±½Ó¼ÓÈë  | 
|     if curAcceptJoinType == ShareDefine.FamilyAcceptJoin_Agree:  | 
|         import PlayerFamily  | 
|         maxMemberCnt = PlayerFamily.GetFamilySetting(curFamily, ChConfig.Def_FamilySetting_MaxMemberCnt)  | 
|         if curFamily.GetCount() < maxMemberCnt and curPlayer.GetLV() >= ChConfig.Def_Family_JionMinLV:  | 
|             #Ö±½Ó¼ÓÈË  | 
|             PlayerFamily.DoPlayerJionFamily(curFamily, curPlayer, IPY_GameServer.fmlMember)  | 
|             #֪ͨËùÓмÒ×å³ÉÔ±, Õâ¸öÈ˼ÓÈëÁ˼Ò×å  | 
|             PlayerFamily.NotifyAllFamilyMemberMsg(curFamily, curPlayer, "XW_JZ_EnterFamily", [curPlayer.GetName()])  | 
|             PlayerControl.NotifyCode(curPlayer, 'XW_JZ_EnterFamilyInfo', [curFamily.GetName()])  | 
|             #֪ͨ¿Í»§¶Ë¼Ò×åÐÅÏ¢¸Ä±ä  | 
|             curFamily.Broadcast_FamilyChange()  | 
|             GameWorld.Log("__RequestAddFamilyNote FamilyID = %s AgreeJoin" % requestAddFamilyID, curPlayer.GetID())  | 
|             return  | 
|               | 
|           | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()    | 
|     familyAction = allFamilyActionManager.GetFamilyAction(requestAddFamilyID, actionType)  | 
|     familyActionCnt = familyAction.Count()  | 
|       | 
|     for index in range(0, familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|         name = familyActionData.GetName()  | 
|         if name == requestPlayerName:  | 
|             #jiazu_pan_143504:ÄúÒѾÏò¸Ã°ï»áÌá½»Èë°ïÉêÇëÁË£¬ÇëµÈ´ý°ï»á¹ÜÀíÈËÔ±ÉóÅú!  | 
|             PlayerControl.NotifyCode(curPlayer, "jiazu_pan_143504")  | 
|             return  | 
|       | 
|     #Íæ¼ÒId, µÈ¼¶,Ö°Òµ,Õ½¶·Á¦  | 
|     actionDataList = [curPlayer.GetID(), curPlayer.GetLV(), curPlayer.GetJob(), fightPower % ChConfig.Def_PerPointValue, fightPower / ChConfig.Def_PerPointValue]  | 
|   | 
|     result = AddFamilyActionNote(requestPlayerName, requestAddFamilyID, actionType, actionDataList, tick, False)  | 
|     if not result:  | 
|         #jiazu_pan_141056:¶Ô²»Æð£¬Ä¿±ê°ï»áÉêÇëÈë°ïÁбíÒÑÂú£¬ÉêÇëÈë°ïʧ°Ü£¡  | 
|         PlayerControl.NotifyCode(curPlayer, "jiazu_pan_141056")  | 
|     else:  | 
|         sendMsg = str([requestAddFamilyID]) # ¸æËßMapÍæ¼ÒÉêÇë¼ÓÈë¼Ò×å³É¹¦  | 
|         curPlayer.MapServer_QueryPlayerResult(0, 0, 'FamilyAdd', sendMsg, len(sendMsg))  | 
|         #jiazu_pan_500807:ÉêÇëÈë°ï³É¹¦£¡ÇëµÈ´ý°ï»á¹ÜÀíÈËÔ±ÉóÅú£¡   | 
|         PlayerControl.NotifyCode(curPlayer, "jiazu_pan_500807")  | 
|         #֪ͨ  | 
|         NotifyFamilyRequestInfo(curFamily)  | 
|     return  | 
|   | 
|   | 
| #Íⲿµ÷Óú¯Êý  | 
| #===============================================================================  | 
| ## É¾³ý¼Ò×åËùÓÐÐÐΪÊý¾Ý  | 
| #  @param familyId: °ï»áId  | 
| #  @param actionType: ÐÐΪÀàÐÍ,СÓÚ0ÔòĬÈÏɾ³ýËùÓÐÐÐΪ  | 
| #  @param day: Ïà²îÌìÊý  | 
| #  @param playerID: ¼Ç¼µÄÍæ¼ÒID  | 
| #  @return: -1-È«²¿É¾³ý£»>=0-ɾ³ýµÄ¸öÊý  | 
| def ClearFamilyAction(familyId, actionType= -1, day=0, playerID=0, useData=""):  | 
|     #ËùÓмÒ×åÐÐΪ¶ÔÏó¹ÜÀíÆ÷  | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()   | 
|       | 
|     if day == 0 and playerID == 0 and useData == "":  | 
|         if  actionType > 0:  | 
|             allFamilyActionManager.DelFamilyAction(familyId, actionType)  | 
|             __DoDelFamilyActionOverLogic(familyId, actionType)  | 
|             return -1  | 
|           | 
|         for actionType in ShareDefine.Def_ActionTypeList:  | 
|             allFamilyActionManager.DelFamilyAction(familyId, actionType)  | 
|             __DoDelFamilyActionOverLogic(familyId, actionType)  | 
|         return -1  | 
|       | 
|     familyAction = allFamilyActionManager.GetFamilyAction(familyId, actionType)  | 
|     familyActionCnt = familyAction.Count()  | 
|     familyAction.SortByTime()  # °´Ê±¼äÉýÐò  | 
|       | 
|     clearIndexList = []  # É¾³ýµÄË÷ÒýÁÐ±í  | 
|     for index in range(0, familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|         noteTime = int(familyActionData.GetTime())  | 
|           | 
|         noteTime = time.strftime(ChConfig.TYPE_Time_Format, time.localtime(noteTime))  | 
|         pastTimeDay = int(GameWorld.GetPastHour(noteTime) / 24)  | 
|           | 
|         if day and pastTimeDay < day:  | 
|             continue  | 
|           | 
|         if playerID != 0 and familyActionData.GetValue1() != playerID:  | 
|             continue  | 
|           | 
|         if useData and familyActionData.GetUseData() != useData:  | 
|             continue  | 
|           | 
|         clearIndexList.append(index)  | 
|       | 
|     if clearIndexList == []:  | 
|         return 0  | 
|       | 
|     #ɾ³ý³¬¹ýʱ¼äµÄÐÐΪÊý¾Ý  | 
|     if len(clearIndexList) == familyActionCnt:  | 
|         #ËùÓÐÊý¾Ý¶¼³¬¹ýʱ¼ä, É¾³ýÕû¸ö¼Ç¼  | 
|         allFamilyActionManager.DelFamilyAction(familyId, actionType)  | 
|         __DoDelFamilyActionOverLogic(familyId, actionType)  | 
|         return -1  | 
|       | 
|     clearCnt = 0  # ÒѾɾ³ýÊýÁ¿  | 
|     for index in clearIndexList:  | 
|         clearIndex = index - clearCnt  | 
|         familyAction.DelAction(clearIndex)  | 
|           | 
|         clearCnt += 1  | 
|     __DoDelFamilyActionOverLogic(familyId, actionType)  | 
|     return clearCnt  | 
|   | 
| def __DoDelFamilyActionOverLogic(familyId, actionType):  | 
|     ## É¾³ý¼Ò×åÐÐΪ¼Ç¼ºóµÄ²Ù×÷  | 
|     family = GameWorld.GetFamilyManager().FindFamily(familyId)  | 
|     if not family:  | 
|         return  | 
|     if actionType == ShareDefine.Def_ActionType_FamilyAdd:  | 
|         NotifyFamilyRequestInfo(family)  | 
|           | 
|     return  | 
|   | 
| ## »ñÈ¡ÐüÉÍÈÎÎñÍê³ÉÇé¿ö  | 
| #  @param curPlayer: Íæ¼ÒʵÀý  | 
| #  @param arrestId: ÐüÉÍÈÎÎñid  | 
| #  @return ÈÎÎñÊÇ·ñÍê³É  | 
| def GetFamilyArrestOverState(curPlayer, arrestId):  | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()    | 
|     familyAction = allFamilyActionManager.GetFamilyAction(curPlayer.GetFamilyID(), ShareDefine.Def_ActionType_FamilyArrest)  | 
|       | 
|     familyActionCnt = familyAction.Count()  | 
|     if familyActionCnt <= 0:  | 
|         #δ¼Ç¼, Ã»ÓÐÍê³É  | 
|         return False  | 
|       | 
|     for index in range(0, familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|         value = familyActionData.GetValue1()  | 
|         if value == arrestId:  | 
|             #¸ÃÈÎÎñÒѾÍê³É  | 
|             return True  | 
|       | 
|     return False  | 
|   | 
| #===============================================================================  | 
| # //B0 25 ÇëÇó¼Ò×åÐüÉÍÈÎÎñÍê³ÉÇé¿ö #tagQueryFamilyArrestOverState  | 
| #   | 
| # struct    tagQueryFamilyArrestOverState  | 
| #   | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #===============================================================================  | 
| ## ÇëÇó¼Ò×åÐüÉÍÈÎÎñÍê³ÉÇé¿ö  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def QueryFamilyArrestOverState(index, cliendData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     familyId = curPlayer.GetFamilyID()  | 
|     if not familyId:  | 
|         #µ±Ç°Íæ¼ÒûÓмÒ×å  | 
|         return  | 
|       | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()    | 
|     familyAction = allFamilyActionManager.GetFamilyAction(familyId, ShareDefine.Def_ActionType_FamilyArrest)  | 
|     familyActionCnt = familyAction.Count()  | 
|       | 
|     packList = []  | 
|     for index in range(0, familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|         playerName = familyActionData.GetName()  # Íê³ÉÈÎÎñµÄÍæ¼ÒÃû×Ö  | 
|         arrestId = familyActionData.GetValue1()  # Íê³ÉµÄÈÎÎñId  | 
|           | 
|         familyArrestOverState = ChPyNetSendPack.tagFamilyArrestOverState()  | 
|           | 
|         familyArrestOverState.NameLen = len(playerName)  | 
|         familyArrestOverState.Name = playerName  | 
|         familyArrestOverState.ID = arrestId  | 
|         familyArrestOverState.OverState = 1  | 
|         packList.append(familyArrestOverState)  | 
|           | 
|     familyArrestOverStateInfo = ChPyNetSendPack.tagFamilyArrestOverStateInfo()  | 
|     familyArrestOverStateInfo.Count = len(packList)  | 
|     familyArrestOverStateInfo.ArrestOverStateInfo = packList  | 
|       | 
|     #·¢°ü¸ø¿Í»§¶Ë  | 
|     NetPackCommon.SendFakePack(curPlayer, familyArrestOverStateInfo)  | 
|     return  | 
|   | 
|   | 
| #===============================================================================  | 
| # //A4 02  ²é¿´ÉêÇëÈë»áµÄÍæ¼Ò #tagCGViewFamilyRequestInfo  | 
| #   | 
| # struct    tagCGViewFamilyRequestInfo  | 
| # {  | 
| #    tagHead        Head;  | 
| # };  | 
| #===============================================================================  | 
| ## ²é¿´ÉêÇë°ï»áµÄ³ÉÔ±ÐÅÏ¢  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def ViewFamilyRequestInfo(curPlayer):  | 
|     if PlayerControl.GetIsTJG(curPlayer):  | 
|         return  | 
|       | 
|     familyID = curPlayer.GetFamilyID()  | 
|     if familyID <= 0:  | 
|         #¸ÃÍæ¼ÒûÓмÒ×å  | 
|         GameWorld.ErrLog("ViewFamilyRequestInfo playerID = %s not family" % (curPlayer.GetID()))  | 
|         return  | 
|       | 
|     allFamilyActionManager = GameWorld.GetFamilyActionManager()    | 
|     familyAction = allFamilyActionManager.GetFamilyAction(familyID, ShareDefine.Def_ActionType_FamilyAdd)  | 
|     familyActionCnt = familyAction.Count()  | 
|       | 
|     packList = []  | 
|     for index in range(0, familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|         requestPlayerName = familyActionData.GetName()  # ÉêÇëµÄÍæ¼ÒÃû×Ö  | 
|         requestTime = familyActionData.GetTime()  # ÉêÇëµÄʱ¼ä  | 
|         playerID = familyActionData.GetValue1()  # ID  | 
|         playerLV = familyActionData.GetValue2()  # µÈ¼¶  | 
|         playerJob = familyActionData.GetValue3()  # Ö°Òµ  | 
|         fightPower = familyActionData.GetValue4()  # Õ½¶·Á¦  | 
|         fightPower += familyActionData.GetValue5() * ChConfig.Def_PerPointValue  | 
|         tagPlayer = GameWorld.GetPlayerManager().FindPlayerByID(playerID)  | 
|         if not tagPlayer:  | 
|             isOnLine = 0  | 
|         else:  | 
|             isOnLine = 1  | 
|             playerLV = tagPlayer.GetLV()  | 
|             if PlayerControl.GetFightPower(tagPlayer) > fightPower:  | 
|                 fightPower = PlayerControl.GetFightPower(tagPlayer)  | 
|               | 
|         memberInfo = ChPyNetSendPack.tagtMemberInfo()  | 
|         memberInfo.PlayerID = playerID  | 
|         memberInfo.NameLen = len(requestPlayerName)   | 
|         memberInfo.Name = requestPlayerName  | 
|         memberInfo.PlayerLV = playerLV  | 
|         memberInfo.PlayeJob = playerJob  | 
|         memberInfo.PlayeFightPower = fightPower % ChConfig.Def_PerPointValue  | 
|         memberInfo.PlayeFightPowerEx = fightPower / ChConfig.Def_PerPointValue  | 
|         memberInfo.RequestTime = requestTime  | 
|         memberInfo.IsOnLine = isOnLine  | 
|         packList.append(memberInfo)  | 
|           | 
|     requestMemberInfo = ChPyNetSendPack.tagGCViewFamilyRequestInfo()  | 
|     requestMemberInfo.Clear()  | 
|     requestMemberInfo.RequestMemberCount = familyActionCnt  | 
|     requestMemberInfo.MemberInfo = packList  | 
|           | 
|     #·¢°ü¸ø¿Í»§¶Ë  | 
|     NetPackCommon.SendFakePack(curPlayer, requestMemberInfo)  | 
|     return  | 
|   | 
| def NotifyFamilyRequestInfo(curFamily):  | 
|     import PlayerFamily  | 
|     playerManager = GameWorld.GetPlayerManager()  | 
|     for i in range(0, curFamily.GetCount()):  | 
|         notifyMember = curFamily.GetAt(i)  | 
|         notifyPlayer = playerManager.FindPlayerByID(notifyMember.GetPlayerID())  | 
|           | 
|         if notifyPlayer == None:  | 
|             continue  | 
|         if not PlayerFamily.GetFamilyMemberHasPow(notifyMember, ChConfig.Def_PurviewDictKey_CanCall):  | 
|             continue  | 
|         ViewFamilyRequestInfo(notifyPlayer)  | 
|     return  | 
|   | 
| #// A4 08 ²éѯ¼Ò×åÐÐΪÐÅÏ¢ #tagCGQueryFamilyAction  | 
| #  | 
| #struct    tagCGQueryFamilyAction  | 
| #{  | 
| #    tagHead        Head;  | 
| #    BYTE        ActionType;        // ÐÐΪÀàÐÍ  | 
| #    DWORD        FamilyID;         // ¼Ò×åID  | 
| #};  | 
| #===============================================================================  | 
| ## ÇëÇó¼Ò×åÐÐΪÐÅÏ¢  | 
| #  @param index Íæ¼ÒË÷Òý  | 
| #  @param clientData ·â°üÊý¾Ý½á¹¹Ìå  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return None  | 
| def QueryFamilyActionInfo(index, cliendData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|       | 
|     if not curPlayer:  | 
|         return  | 
|       | 
|     actionType = cliendData.ActionType  | 
|     familyID = cliendData.FamilyID  | 
|       | 
|     if actionType not in ChConfig.Def_QueryNoLimit_ActionTypeList:  | 
|         playerFamilyId = curPlayer.GetFamilyID()  | 
|         if not playerFamilyId:  | 
|             return  | 
|       | 
|         if playerFamilyId != familyID:  | 
|             return  | 
|       | 
|     SendFamilyActionInfo(curPlayer, familyID, actionType)  | 
|     return  | 
|   | 
| ## ·¢ËͼÒ×åÐÐΪ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param familyID   | 
| #  @param actionType   | 
| #  @return None  | 
| def SendFamilyActionInfo(curPlayer, familyID, actionType):  | 
|     familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType)  | 
|       | 
|     familyActionCnt = familyAction.Count()  | 
|       | 
|     actionInfoPack = ChPyNetSendPack.tagGCFamilyActionInfo()  | 
|     actionInfoPack.Clear()  | 
|     actionInfoPack.FamilyID = familyID  | 
|     actionInfoPack.ActionType = actionType  | 
|     actionInfoPack.FamilyActionList = []      | 
|       | 
|     for index in xrange(familyActionCnt):  | 
|         familyActionData = familyAction.At(index)  | 
|           | 
|         actionData = ChPyNetSendPack.tagGCFamilyAction()  | 
|         actionData.Clear()  | 
|         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.GetUseData()  | 
|         actionData.UseDataLen = len(actionData.UseData)  | 
|         actionInfoPack.FamilyActionList.append(actionData)  | 
|       | 
|     actionInfoPack.Count = len(actionInfoPack.FamilyActionList)  | 
|       | 
|     if curPlayer:  | 
|         NetPackCommon.SendFakePack(curPlayer, actionInfoPack)  | 
|         return  | 
|       | 
|     # Ã»ÓÐÖ¸¶¨Íæ¼ÒµÄÇé¿öÏÂ֪ͨȫսÃË  | 
|     family = GameWorld.GetFamilyManager().FindFamily(familyID)  | 
|     if not family:  | 
|         return  | 
|       | 
|     for index in xrange(family.GetCount()):  | 
|         curMember = family.GetAt(index)  | 
|         curPlayer = curMember.GetPlayer()  | 
|         #²»ÔÚÏß  | 
|         if curPlayer == None:  | 
|             continue  | 
|         NetPackCommon.SendFakePack(curPlayer, actionInfoPack)  | 
|           | 
|     return  | 
|   | 
|   | 
| ## É¾³ýʱ»ú: 1-½µÎªÆÕͨ³ÉÔ±£»2-Í˳ö¼Ò×å  | 
| def DelFamilyOfficerModelEquip(familyID, delPlayerID):  | 
|     if delPlayerID <= 0:  | 
|         return  | 
|       | 
|     clearCnt = ClearFamilyAction(familyID, ShareDefine.Def_ActionType_OfficerModelEquip, playerID=delPlayerID)  | 
|     GameWorld.DebugLog("ɾ³ý¼Ò×å¹ÙԱģÐÍ×°±¸ÐÅÏ¢£¡familyID=%s,playerID=%s,delCnt=%s" % (familyID, delPlayerID, clearCnt))  | 
|     return  | 
|   | 
| ## ¸üмÒ×å¹ÙԱģÐÍ×°±¸ÐÅÏ¢  | 
| def UpdFamilyOfficerModelEquip(familyID, playerID):  | 
|       | 
|     curFamily = GameWorld.GetFamilyManager().FindFamily(familyID)  | 
|     if curFamily == None:  | 
|         return  | 
|       | 
|     curMember = curFamily.FindMember(playerID)  | 
|     if curMember == None:  | 
|         return  | 
|       | 
|     memberLV = curMember.GetFamilyLV()  | 
|     # ÆÕͨ³ÉÔ±²»¼Ç¼  | 
|     if memberLV == IPY_GameServer.fmlMember:  | 
|         #GameWorld.DebugLog("ÆÕͨ³ÉÔ±²»¼Ç¼¼Ò×å¹ÙԱģÐÍ×°±¸ÐÅÏ¢£¡")  | 
|         return  | 
|       | 
|     modelEquipInfoList = []  | 
|     #modelEquipInfoList = PlayerViewCache.GetPlayerCacheEquipView(playerID)  | 
|     if not modelEquipInfoList:  | 
|         #GameWorld.DebugLog("ÕÒ²»µ½¼Ò×å¹ÙԱģÐÍ×°±¸ÐÅÏ¢, ²»¼Ç¼£¡familyID=%s,playerID=%s" % (familyID, playerID))  | 
|         return  | 
|       | 
|     findActionObj = None  | 
|     actionType = ShareDefine.Def_ActionType_OfficerModelEquip  | 
|     familyAction = GameWorld.GetFamilyActionManager().GetFamilyAction(familyID, actionType)  | 
|     familyActionCnt = familyAction.Count()  | 
|       | 
|     for i in xrange(familyActionCnt):  | 
|         actionData = familyAction.At(i)  | 
|         if actionData.GetValue1() != playerID:  | 
|             continue  | 
|         findActionObj = actionData  | 
|         break  | 
|           | 
|     if not findActionObj:  | 
|         if familyActionCnt >= ChConfig.ActionTypeSaveCnt.get(actionType, 0):  | 
|             GameWorld.ErrLog("UpdFamilyOfficerModelEquip familyActionCnt=%s ÒÑ´ïµ½×î´óÖµ£¡" % familyActionCnt)  | 
|         findActionObj = familyAction.AddAction()  | 
|           | 
|     memberName = curMember.GetName()  | 
|     memberJob = curMember.GetJob()  | 
|     #---ÉèÖÃÐÐΪ¶ÔÏóÊý¾Ý---  | 
|     findActionObj.SetFamilyId(familyID)  | 
|     findActionObj.SetActionType(actionType)  | 
|     findActionObj.SetName(memberName)  | 
|     findActionObj.SetValue1(playerID)  | 
|     findActionObj.SetValue2(memberJob)  | 
|     findActionObj.SetValue3(memberLV)  | 
|     useData = str(modelEquipInfoList)  | 
|     findActionObj.SetUseData(useData, len(useData)) # ÉèÖÃ×Ô¶¨ÒåÊý¾Ý  | 
|     GameWorld.DebugLog("¸üмÒ×å¹ÙԱģÐÍ×°±¸ÐÅÏ¢: familyID=%s,playerID=%s,name=%s,job=%s,memLV=%s,useData=%s,actionNowCnt=%s"   | 
|                        % (familyID, playerID, memberName, memberJob, memberLV, str(useData), familyAction.Count()))  | 
|     return  | 
|   | 
|   | 
|   | 
|   |