| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_FamilyBoss  | 
| #  | 
| # @todo:Õ½ÃËboss¸±±¾/ÏÉÃËÊÔÁ¶  | 
| # @author hxp  | 
| # @date 2023-09-29  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: Õ½ÃËboss¸±±¾/ÏÉÃËÊÔÁ¶  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2023-09-29 02:00"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import FBCommon  | 
| import GameWorld  | 
| import IPY_GameWorld  | 
| import PlayerControl  | 
| import NPCCustomRefresh  | 
| import ChPyNetSendPack  | 
| import ItemControler  | 
| import NetPackCommon  | 
| import IpyGameDataPY  | 
| import SkillCommon  | 
| import PyGameData  | 
| import BuffSkill  | 
| import ChConfig  | 
|   | 
| #µ±Ç°¸±±¾µØÍ¼µÄ״̬  | 
| (  | 
| FB_Step_Open, # µØÍ¼¿ªÆô  | 
| FB_Step_MapPrepare, # µØÍ¼×¼±¸  | 
| FB_Step_Fighting, # Õ½¶·ÖÐ  | 
| FB_Step_LeaveTime, # ×ÔÓÉʱ¼ä  | 
| FB_Step_Over, # ¸±±¾¹Ø±Õ  | 
| ) = range(5)  | 
|   | 
| class BattlePlayer():  | 
|       | 
|     def __init__(self, playerID):  | 
|         self.playerID = playerID  | 
|         self.hurtValue = 0 # µ±Ç°ÀÛ¼ÆÉ˺¦  | 
|         self.hurtValueLast = 0 # ÉÏ´Îͬ²½½áËãʱÉ˺¦  | 
|         self.fightTickTotal = 0 # ÀÛ¼ÆÕ½¶·tick  | 
|         self.statsTick = 0 # Í³¼Ætick  | 
|         return  | 
|       | 
|     def onEnter(self, curPlayer, tick):  | 
|         hurtValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValue)  | 
|         hurtValuePoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValuePoint)  | 
|         self.hurtValue = hurtValuePoint * ChConfig.Def_PerPointValue + hurtValue  | 
|         self.hurtValueLast = self.hurtValue  | 
|         self.fightTickTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossFightSeconds) * 1000  | 
|         self.statsTick = tick  | 
|         return  | 
|       | 
| def OnFBPlayerOnLogin(curPlayer):  | 
|     SyncFamilyBossPlayerInfo(curPlayer)  | 
|     return  | 
|   | 
| def OnFBPlayerOnDay(curPlayer):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     hurtValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValue)  | 
|     hurtValuePoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValuePoint)  | 
|     hurtValueTotal = hurtValuePoint * ChConfig.Def_PerPointValue + hurtValue  | 
|       | 
|     rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAward)  | 
|     #ÏÉÃËÉËѪ½±ÀøGameServer´¦Àí²¹·¢  | 
|       | 
|     #GameWorld.DebugLog("ÏÉÃËbossÉËѪ¹ýÌì. hurtValueTotal=%s,rewardRecord=%s" % (hurtValueTotal, rewardRecord), playerID)  | 
|     ipyDataMgr = IpyGameDataPY.IPY_Data()  | 
|     for index in range(ipyDataMgr.GetFamilyBossHurtAwardCount()):  | 
|         ipyData = ipyDataMgr.GetFamilyBossHurtAwardByIndex(index)  | 
|         if ipyData.GetAwardType() != 1:  | 
|             continue  | 
|         needHurtTotal = ipyData.GetNeedHurtTotal()  | 
|         if hurtValueTotal < needHurtTotal:  | 
|             #GameWorld.DebugLog("    ÉËѪ²»×㣬²»²¹·¢¸Ã½±Àø! needHurtTotal=%s" % needHurtTotal, playerID)  | 
|             continue  | 
|         recordIndex = ipyData.GetRecordIndex()  | 
|         if rewardRecord & pow(2, recordIndex):  | 
|             #GameWorld.DebugLog("    ¸Ã¸öÈ˽±ÀøÒÑÁì½±! recordIndex=%s,rewardRecord=%s" % (recordIndex, rewardRecord), playerID)  | 
|             continue  | 
|           | 
|         paramList = [needHurtTotal]  | 
|         awardItemList = ipyData.GetAwardItemList()  | 
|         PlayerControl.SendMailByKey("FamilyBossHurtAward", [playerID], awardItemList, paramList)  | 
|         #GameWorld.DebugLog("    Óʼþ²¹·¢ÉËѪ½±Àø! recordIndex=%s" % recordIndex, playerID)  | 
|           | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtValue, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtValuePoint, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossFightSeconds, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtAward, 0)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtAwardFamily, 0)  | 
|     SyncFamilyBossPlayerInfo(curPlayer)      | 
|     return  | 
|   | 
| def GetBattlePlayer(playerID):  | 
|     if playerID in PyGameData.g_familyBossHurtPlayerDict:  | 
|         batPlayer = PyGameData.g_familyBossHurtPlayerDict[playerID]  | 
|     else:  | 
|         batPlayer = BattlePlayer(playerID)  | 
|         PyGameData.g_familyBossHurtPlayerDict[playerID] = batPlayer  | 
|     return batPlayer  | 
|   | 
| def OnOpenFB(tick):  | 
|     return  | 
|   | 
| def OnCloseFB(tick):  | 
|     GameWorld.GetGameWorld().SetPropertyID(0)  | 
|     FBCommon.DoLogic_FBKickAllPlayer()  | 
|     return  | 
|   | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     if curPlayer.GetFamilyID() <= 0:  | 
|         GameWorld.DebugLog("ûÓÐÕ½ÃË£¬²»ÄܽøÈëÕ½ÃËboss¸±±¾£¡", curPlayer.GetPlayerID())  | 
|         return False  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     fightSeconds = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossFightSeconds) # ÒÑÕ½¶·Ê±³¤  | 
|     fightSecondsMax = IpyGameDataPY.GetFuncCfg("FamilyBossFB", 1)  | 
|     if fightSeconds >= fightSecondsMax:  | 
|         GameWorld.DebugLog("ÒѾ´ïµ½ÏÉÃËbossÕ½¶·Ê±³¤ÉÏÏÞ£¬ÎÞ·¨½øÈë. fightSeconds=%s" % fightSeconds, playerID)  | 
|         return False  | 
|       | 
|     return True  | 
|   | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|   | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
| def DoEnterFB(curPlayer, tick):  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     batPlayer = GetBattlePlayer(playerID)  | 
|     batPlayer.onEnter(curPlayer, tick)  | 
|     GameWorld.DebugLog("DoEnterFB: fbStep=%s,fightTickTotal=%s,hurtValue=%s" % (fbStep, batPlayer.fightTickTotal, batPlayer.hurtValue), playerID)  | 
|       | 
|     fightSecondsMax = IpyGameDataPY.GetFuncCfg("FamilyBossFB", 1)  | 
|     remainTick = fightSecondsMax * 1000 - batPlayer.fightTickTotal  | 
|     if remainTick <= 0:  | 
|         PlayerControl.PlayerLeaveFB(curPlayer)  | 
|         return  | 
|       | 
|     if fbStep != FB_Step_Fighting:  | 
|         __SetFBToFight(tick)  | 
|           | 
|     curPlayer.Sync_TimeTick(IPY_GameWorld.tttAddUpTime, 0, remainTick, True)\  | 
|       | 
|     statsFBMemberHurt(tick, 1)  | 
|     return  | 
|   | 
| def __SetFBToFight(tick):  | 
|     FBCommon.SetFBStep(FB_Step_Fighting, tick)  | 
|     refreshMark, bossID = FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_FamilyBossMap, 0)  | 
|     if not GameWorld.FindNPCByNPCID(bossID):  | 
|         NPCCustomRefresh.SetNPCRefresh(refreshMark, [bossID])  | 
|     return  | 
|   | 
| ##¸±±¾¶¨Ê±Æ÷  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¸±±¾¶¨Ê±Æ÷  | 
| def OnProcess(tick):  | 
|     fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|       | 
|     if fbStep == FB_Step_Fighting:  | 
|         __DoLogic_MapFighting(tick)  | 
|           | 
|     return  | 
|   | 
| def __DoLogic_MapFighting(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     lastTick = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NotifyFBHelpTick)  | 
|     if tick - lastTick < 5000:  | 
|         return  | 
|     gameFB.SetGameFBDict(ChConfig.Def_FB_NotifyFBHelpTick, tick)  | 
|     statsFBMemberHurt(tick)  | 
|     return  | 
|   | 
| def statsFBMemberHurt(tick, statsType=0, exitPlayerID=0):  | 
|     ## Í³¼Æ¸±±¾ÏÉÃ˳ÉÔ±É˺¦  | 
|     # statsType 0-³£¹æ£»1-Íæ¼Ò½øÈ룻2-Íæ¼ÒÍ˳ö  | 
|       | 
|     fightMemCount = 0  | 
|     familyID = GameWorld.GetGameWorld().GetPropertyID()  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|         playerID = curPlayer.GetPlayerID()  | 
|         if playerID != exitPlayerID:  | 
|             fightMemCount += 1  | 
|               | 
|     needMemCount, skillTypeID = IpyGameDataPY.GetFuncEvalCfg("FamilyBossFB", 2)  | 
|       | 
|     fightSecondsMax = IpyGameDataPY.GetFuncCfg("FamilyBossFB", 1)  | 
|     addFamilyHurt = 0  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|           | 
|         playerID = curPlayer.GetPlayerID()  | 
|         batPlayer = GetBattlePlayer(playerID)  | 
|         if not batPlayer.statsTick:  | 
|             GameWorld.Log("ÏÉÃËÍæ¼Òδ³õʼ»¯Íê±Ï£¬²»Í³¼Æ!", playerID)  | 
|             continue  | 
|           | 
|         hurtValue = batPlayer.hurtValue  | 
|         addHurtValue = max(0, hurtValue - batPlayer.hurtValueLast)  | 
|         batPlayer.hurtValueLast = hurtValue  | 
|           | 
|         passTick = tick - batPlayer.statsTick  | 
|         if passTick > 0:  | 
|             batPlayer.fightTickTotal += passTick  | 
|         batPlayer.statsTick = tick  | 
|           | 
|         fightSeconds = batPlayer.fightTickTotal / 1000  | 
|           | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtValue, hurtValue % ChConfig.Def_PerPointValue)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtValuePoint, hurtValue / ChConfig.Def_PerPointValue)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossFightSeconds, fightSeconds)  | 
|           | 
|         addFamilyHurt += addHurtValue  | 
|         #GameWorld.DebugLog("ÏÉÃËÍæ¼ÒÉËѪͳ¼Æ: fightSeconds=%s,hurtValue=%s,addHurtValue=%s, %s" % (fightSeconds, hurtValue, addHurtValue, addFamilyHurt), playerID)  | 
|           | 
|         # °ïÖúÐÅÏ¢  | 
|         helpDict = {"hurtValue":hurtValue, "fightSeconds":fightSeconds, "fightMemCount":fightMemCount}  | 
|         FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|           | 
|         if playerID == exitPlayerID:  | 
|             batPlayer.statsTick = 0  | 
|             BuffSkill.DelBuffBySkillID(curPlayer, skillTypeID, tick)  | 
|             SyncFamilyBossPlayerInfo(curPlayer)  | 
|         elif fightSeconds >= fightSecondsMax:  | 
|             GameWorld.DebugLog("    Ã»ÓÐÕ½¶·Ê±³¤ÁË£¬Ìß³ö¸±±¾", playerID)  | 
|             PlayerControl.PlayerLeaveFB(curPlayer)  | 
|         else:  | 
|             # ´¦Àíbuff  | 
|             __parseFightBuff(curPlayer, fightMemCount, needMemCount, skillTypeID, tick)  | 
|               | 
|     SendGameServer("FBMemberHurt", [statsType, familyID, fightMemCount, addFamilyHurt])  | 
|     return  | 
|   | 
| def __parseFightBuff(curPlayer, fightMemCount, needMemCount, skillTypeID, tick):  | 
|     if fightMemCount < needMemCount:  | 
|         #GameWorld.DebugLog("    ÈËÊý²»×ãÕ½¶·buff", curPlayer.GetPlayerID())  | 
|         BuffSkill.DelBuffBySkillID(curPlayer, skillTypeID, tick)  | 
|         return  | 
|     skillLV = fightMemCount - needMemCount + 1   | 
|     findBuff = SkillCommon.FindBuffByID(curPlayer, skillTypeID)[0]  | 
|     if findBuff and findBuff.GetSkill().GetSkillLV() == skillLV:  | 
|         #GameWorld.DebugLog("    Õ½¶·buffµÈ¼¶²»±ä.skillTypeID=%s,skillLV=%s" % (skillTypeID, skillLV), curPlayer.GetPlayerID())  | 
|         return  | 
|     #GameWorld.DebugLog("    Õ½¶·buffµÈ¼¶¸Ä±ä.skillTypeID=%s,skillLV=%s" % (skillTypeID, skillLV), curPlayer.GetPlayerID())  | 
|     BuffSkill.DelBuffBySkillID(curPlayer, skillTypeID, tick)  | 
|     SkillCommon.AddBuffBySkillType(curPlayer, skillTypeID, tick, skillLV)  | 
|     return  | 
|   | 
| def OnEnterFamily(curPlayer):  | 
|     #½øÈëÏÉÃËʱ²¹Í¬²½Á콱״̬µ½GameServer  | 
|     SendGameServer_FamilyHurtAwardStateFamily(curPlayer)  | 
|     return  | 
|   | 
| def SendGameServer_FamilyHurtAwardStateFamily(curPlayer):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     familyID = curPlayer.GetFamilyID()  | 
|     hurtAwardStateFamily = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAwardFamily)  | 
|     SendGameServer("FamilyHurtAwardStateFamily", [familyID, playerID, hurtAwardStateFamily])  | 
|     return  | 
|   | 
| ##Íæ¼ÒÍ˳ö¸±±¾  | 
| def DoExitFB(curPlayer, tick):  | 
|     statsFBMemberHurt(tick, 2, curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| ##Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoPlayerLeaveFB(curPlayer, tick):  | 
|     return  | 
|   | 
| ## Íæ¼Ò¶ÔNPCÔì³ÉÉ˺¦  | 
| def DoFB_Player_HurtNPC(curPlayer, curNPC, hurtHP):  | 
|     familyID = curPlayer.GetFamilyID()  | 
|     if not familyID:  | 
|         return  | 
|     bossID = FBCommon.GetFBLineRefreshNPC(ChConfig.Def_FBMapID_FamilyBossMap, 0)[1]  | 
|     if bossID != curNPC.GetNPCID():  | 
|         return  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     batPlayer = GetBattlePlayer(playerID)  | 
|     batPlayer.hurtValue += hurtHP  | 
|     #GameWorld.DebugLog("Ôö¼ÓÉËѪ: familyID=%s,hurtHP=%s, %s" % (familyID, hurtHP, batPlayer.hurtValue), playerID)  | 
|     return  | 
|   | 
| ## ÊÇ·ñ¸±±¾¸´»î  | 
| def OnPlayerReborn():  | 
|     return True  | 
|   | 
| def OnResetFBRebornPlacePos(curPlayer, rebornPlace, tick):  | 
|     ipyEnterPosInfo = FBCommon.GetFBLineEnterPosInfo(ChConfig.Def_FBMapID_FamilyBossMap, 0)  | 
|     posX, posY = ipyEnterPosInfo[:2]  | 
|     curPlayer.ResetPos(posX, posY)  | 
|     return  | 
|   | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_Step_Fighting:  | 
|         return False  | 
|     return True  | 
|   | 
|   | 
| def GetFamilyBossHurtAward(curPlayer, awardType, awardIndex):  | 
|     ## awardType 1-¸öÈË£»2-ÏÉÃË  | 
|       | 
|     awardIndex = GameWorld.ToIntDef(awardIndex)  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FamilyBossHurtAward", awardType, awardIndex)  | 
|     if not ipyData:  | 
|         return  | 
|     needHurtTotal = ipyData.GetNeedHurtTotal()  | 
|     awardItemList = ipyData.GetAwardItemList()  | 
|       | 
|     familyID = curPlayer.GetFamilyID()  | 
|     if awardType == 2:  | 
|         if not familyID:  | 
|             return  | 
|         rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAwardFamily)  | 
|         if rewardRecord & pow(2, awardIndex):  | 
|             GameWorld.DebugLog("ÏÉÃËbossÉËѪÏÉÃ˽±ÀøÒÑÁì½±!awardIndex=%s,rewardRecord=%s" % (awardIndex, rewardRecord), playerID)  | 
|             return  | 
|         SendGameServer("FamilyHurtAwardReq", [familyID, awardType, awardIndex, needHurtTotal, awardItemList], playerID)  | 
|         return  | 
|       | 
|     hurtValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValue)  | 
|     hurtValuePoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValuePoint)  | 
|     hurtValueTotal = hurtValuePoint * ChConfig.Def_PerPointValue + hurtValue  | 
|       | 
|     if hurtValueTotal < needHurtTotal:  | 
|         GameWorld.DebugLog("ÏÉÃËbossÉËѪ¸öÈ˽±ÀøÉËѪ²»×ã²»ÄÜÁìÈ¡: awardIndex=%s,hurtValueTotal=%s < %s" % (awardIndex, hurtValueTotal, needHurtTotal), playerID)  | 
|         return  | 
|       | 
|     rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAward)  | 
|     if rewardRecord & pow(2, awardIndex):  | 
|         GameWorld.DebugLog("ÏÉÃËbossÉËѪ¸öÈ˽±ÀøÒÑÁì½±!awardIndex=%s,rewardRecord=%s" % (awardIndex, rewardRecord), playerID)  | 
|         return  | 
|     updRewardRecord = rewardRecord | pow(2, awardIndex)  | 
|     PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtAward, updRewardRecord)  | 
|       | 
|     GameWorld.DebugLog("ÏÉÃËbossÉËѪÏÉÃ˽±Àø·¢·Å: familyID=%s,awardType=%s,awardIndex=%s,updRewardRecord=%s,awardItemList=%s"   | 
|                        % (familyID, awardType, awardIndex, updRewardRecord, awardItemList), playerID)  | 
|       | 
|     event = ["FamilyBossHurtAward", False, {"awardType":awardType, "awardIndex":awardIndex}]  | 
|     ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, None, event)  | 
|       | 
|     SyncFamilyBossPlayerInfo(curPlayer)  | 
|     return  | 
|   | 
| def SendGameServer(msgType, msgData, playerID=0):  | 
|     msgInfo = str([msgType, msgData])  | 
|     GameWorld.DebugLog("ÏÉÃËbossÊÔÁ¶Í¬²½GameServer: msgType=%s,%s" % (msgType, msgData), playerID)  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(playerID, 0, 0, "FamilyBoss", msgInfo, len(msgInfo))  | 
|     return  | 
|   | 
| def GameServer_FamilyBossInfo(curPlayer, resultList):  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     msgType, msgData = resultList[:2]  | 
|       | 
|     GameWorld.Log("ÏÉÃËBossÊÔÁ¶GameServer·µ»Ø: %s" % str(resultList), playerID)  | 
|     if msgType == "FamilyHurtAwardReq":  | 
|         familyID, awardType, awardIndex, needHurtTotal, awardItemList = msgData  | 
|         hurtValueTotal = resultList[2]  | 
|         if hurtValueTotal < needHurtTotal:  | 
|             GameWorld.DebugLog("ÏÉÃËbossÉËѪÏÉÃ˽±ÀøÉËѪ²»×ã²»ÄÜÁìÈ¡: awardIndex=%s,hurtValueTotal=%s < %s" % (awardIndex, hurtValueTotal, needHurtTotal), playerID)  | 
|             return  | 
|           | 
|         rewardRecord = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAwardFamily)  | 
|         if rewardRecord & pow(2, awardIndex):  | 
|             GameWorld.DebugLog("ÏÉÃËbossÉËѪÏÉÃ˽±Àø·µ»ØÊ±ÒÑÁì½±!awardIndex=%s,rewardRecord=%s" % (awardIndex, rewardRecord), playerID)  | 
|             return  | 
|         updRewardRecord = rewardRecord | pow(2, awardIndex)  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_FamilyBossHurtAwardFamily, updRewardRecord)  | 
|           | 
|         GameWorld.DebugLog("ÏÉÃËbossÉËѪÏÉÃ˽±Àø·¢·Å: familyID=%s,awardType=%s,awardIndex=%s,updRewardRecord=%s,awardItemList=%s"   | 
|                            % (familyID, awardType, awardIndex, updRewardRecord, awardItemList), playerID)  | 
|           | 
|         event = ["FamilyBossHurtAward", False, {"awardType":awardType, "awardIndex":awardIndex}]  | 
|         ItemControler.GivePlayerItemOrMail(curPlayer, awardItemList, None, event)  | 
|           | 
|         SendGameServer_FamilyHurtAwardStateFamily(curPlayer)  | 
|         SyncFamilyBossPlayerInfo(curPlayer)  | 
|           | 
|     return  | 
|   | 
| def SyncFamilyBossPlayerInfo(curPlayer):  | 
|     clientPack = ChPyNetSendPack.tagMCFamilyBosFBPlayerInfo()  | 
|     clientPack.Clear()  | 
|     clientPack.HurtTotal = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValue)  | 
|     clientPack.HurtTotalPoint = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtValuePoint)  | 
|     clientPack.FightSeconds = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossFightSeconds)  | 
|     clientPack.HurtAwardState = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAward)  | 
|     clientPack.HurtAwardStateFamily = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_FamilyBossHurtAwardFamily)  | 
|     NetPackCommon.SendFakePack(curPlayer, clientPack)  | 
|     return  |