| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.GameLogic_DuJie  | 
| #  | 
| # @todo:¶É½Ù¸±±¾  | 
| # @author xdh  | 
| # @date 2017-10-10 14:30  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¶É½Ù¸±±¾  | 
| #  | 
| #---------------------------------------------------------------------  | 
| """Version = 2017-10-10 14:30"""  | 
| import FBCommon  | 
| import ChConfig  | 
| import IPY_GameWorld  | 
| import PlayerControl  | 
| import GameWorld  | 
| import NPCCustomRefresh  | 
| import IpyGameDataPY  | 
| import PlayerPrestigeSys  | 
| import GameFuncComm  | 
| import ItemCommon  | 
| import ShareDefine  | 
| import ItemControler  | 
| import PlayerSuccess  | 
| import EventShell  | 
| import EventReport  | 
| import FBHelpBattle  | 
|   | 
| import math  | 
| import time  | 
|   | 
| #µ±Ç°¸±±¾µØÍ¼µÄ״̬  | 
| (  | 
| FB_Step_CallHelp, # ÖúÕ½ÕÙ»½  | 
| FB_Step_MapPrepare, # µØÍ¼×¼±¸  | 
| FB_Step_Fighting, # Õ½¶·ÖÐ  | 
| FB_Step_LeaveTime, # ×ÔÓÉʱ¼ä  | 
| ) = range(4)  | 
|   | 
| #---¶É½Ù¸±±¾---  | 
| DuJieFB_Star = 'DuJieFB_Star' #ÆÀ¼¶  | 
| DuJieFB_RealmLV = "DuJieFB_RealmLV"     # ¾³½çµÈ¼¶  | 
| DuJieFB_LeaderPlayerID = "DuJieFB_LeaderPlayerID"     # ¶Ó³¤ID  | 
|   | 
|   | 
| (  | 
| Def_Time_MapPrepare, # ×¼±¸Ê±¼ä, Ãë  | 
| Def_Time_Fight, # ³ÖÐøÊ±¼ä, Ãë  | 
| Def_Time_Leave, # ½áÊøÊ±¼ä, Ãë  | 
| Def_StarTime, # ÐǼ¶¶ÔÓ¦ºÄʱÅäÖÃ, Ãë  | 
| Def_HelpAddAttrID, #»¤·¨¿ÉÔö¼ÓµÄÊôÐÔ  | 
| ) = range(5)  | 
|   | 
|   | 
| def GetRealmFBTimeCfg():  | 
|     lineID = 1 if FBCommon.GetFBPropertyMark() else 0  | 
|     return FBCommon.GetFBLineStepTime(ChConfig.Def_FBMapID_DuJie, lineID)  | 
|   | 
| def GetDuJieBossID():  | 
|     realmLV = GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_RealmLV)  | 
|     realmIpyData = PlayerPrestigeSys.GetRealmIpyData(realmLV)  | 
|     if not realmIpyData:  | 
|         GameWorld.ErrLog("ûÓиþ³½çµÈ¼¶Êý¾Ý! Lv=%s" % realmLV)  | 
|         return  | 
|     return realmIpyData.GetBossID()  | 
|   | 
| #---FB½Ó¿Ú----------  | 
| ##¸±±¾³õʼ»¯  | 
| # @param tick:ʱ¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| def DoFBInit(tick):  | 
|     #GameWorld.GetGameFB().GameServer_RegisterFBInfo(GetRealmFBTimeCfg()[Def_MaxPlayerCnt], '')  | 
|     return  | 
|   | 
| ##¿ªÆô¸±±¾  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¿ªÆô¸±±¾  | 
| def OnOpenFB(tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameFB.SetGameFBDict(DuJieFB_RealmLV, 0)  | 
|     gameFB.SetGameFBDict(DuJieFB_Star, 0)  | 
|     gameFB.SetGameFBDict(DuJieFB_LeaderPlayerID, 0)  | 
|     return  | 
|   | 
|   | 
| ##¹Ø±Õ¸±±¾  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks   | 
| def OnCloseFB(tick):  | 
|     #¸±±¾Ìß³öÍæ¼Ò  | 
|     FBCommon.DoLogic_FBKickAllPlayer()  | 
|     return  | 
|   | 
| ##Íæ¼ÒËÀÍö.  | 
| # @param curPlayer:ËÀÍöµÄÍæ¼Ò   | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks Íæ¼ÒÖ÷¶¯À뿪¸±±¾.  | 
| def DoPlayerDead(curPlayer):  | 
|     if curPlayer.GetID() == GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_LeaderPlayerID):  | 
|         __DoDoJieFBOver(False, GameWorld.GetGameWorld().GetTick())  | 
|     return  | 
|   | 
| ## ÊÇ·ñÄܹ»Í¨¹ý»î¶¯²éѯ½øÈë  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineID Ïß·id  | 
| #  @param tick Ê±¼ä´Á  | 
| #  @return ²¼¶ûÖµ  | 
| def OnEnterFBEvent(curPlayer, mapID, lineID, tick):  | 
|     return __CheckEnter(curPlayer, mapID, lineID)  | 
|   | 
|   | 
| ##½øÈ븱±¾¼ì²é  | 
| #  @param curPlayer Íæ¼ÒʵÀý  | 
| #  @param mapID µØÍ¼ID  | 
| #  @param lineID Ïß·id  | 
| # @return None  | 
| def __CheckEnter(curPlayer, mapID, lineID):  | 
|     if not GameFuncComm.GetFuncCanUse(curPlayer, ShareDefine.GameFuncID_Official):  | 
|         GameWorld.DebugLog("¾ôλ¾³½ç¹¦ÄÜ먦Æô, ÎÞ·¨¿ªÆô¶É½Ù!curLV=%s" % curPlayer.GetLV())  | 
|         return False  | 
|     if lineID == 0 or curPlayer.GetTeamLV() == IPY_GameWorld.tmlLeader or (lineID == 1 and curPlayer.GetTeamID() == 0):  | 
|         curRealmLV = curPlayer.GetOfficialRank()  | 
|         realmIpyData = PlayerPrestigeSys.GetRealmIpyData(curRealmLV)  | 
|         if not realmIpyData:  | 
|             GameWorld.ErrLog("ûÓиþ³½çµÈ¼¶Êý¾Ý! Lv=%s" % curRealmLV)  | 
|             return False  | 
|         needRealmPoint = realmIpyData.GetNeedPoint()  | 
|         if not needRealmPoint:  | 
|             GameWorld.DebugLog("¾³½çÒÑÊÇ×î´óµÈ¼¶£¬²»ÄÜÉý¼¶! Lv=%s" % curRealmLV, curPlayer.GetPlayerID())  | 
|             return False  | 
|         if not PlayerControl.HaveMoney(curPlayer, ShareDefine.TYPE_Price_RealmPoint, needRealmPoint, False):  | 
|             GameWorld.DebugLog("¾³½çÐÞÁ¶µã²»×㣬ÎÞ·¨¿ªÆô¶É½Ù£¡needRealmPoint=%s" % (needRealmPoint), curPlayer.GetPlayerID())  | 
|             return False  | 
| #        if curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBIsOpen) != 1:  | 
| #            return False  | 
|      | 
|       | 
|     return True  | 
|   | 
|   | 
| ##¸±±¾Íæ¼Ò½øÈëµã  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param mapID µØÍ¼ID  | 
| # @param lineId ·ÖÏßID  | 
| # @param ipyEnterPosInfo ¹¦ÄÜÏß·IPYÅäÖÃ×ø±êÐÅÏ¢  | 
| # @param tick Ê±¼ä´Á  | 
| # @return posX, posY, Ëæ»ú°ë¾¶(¿ÉÑ¡)  | 
| def OnGetFBEnterPos(curPlayer, mapID, lineId, ipyEnterPosInfo, tick):  | 
|     return ipyEnterPosInfo  | 
|      | 
|   | 
|   | 
| ##ÊÇ·ñ¿ÉÒÔ½øÈë  | 
| # @param ask ÇëÇó½á¹¹Ìå  | 
| # @param tick Ê±¼ä´Á  | 
| # @return TChangeMapError  | 
| # @remarks   | 
| def OnChangeMapAsk(ask, tick):  | 
|     return IPY_GameWorld.cmeAccept  | 
|   | 
|   | 
| ##Íæ¼Ò½øÈ븱±¾  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks Íæ¼Ò½øÈ븱±¾  | 
| def DoEnterFB(curPlayer, tick):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     fbStep = gameFB.GetFBStep()  | 
|     if fbStep == FB_Step_LeaveTime:  | 
|         PlayerControl.PlayerLeaveFB(curPlayer)  | 
|         return  | 
|       | 
|     lineID = curPlayer.NomalDictGetProperty(ChConfig.Def_Player_Dict_ReqFBFuncLine)  | 
|     if lineID: #С¾³½ç0 ´ó¾³½çΪ¾³½çµÈ¼¶  | 
|         lineID = curPlayer.GetOfficialRank()  | 
|     if not FBCommon.GetHadSetFBPropertyMark():  | 
|         FBCommon.SetFBPropertyMark(lineID)  | 
|         if lineID == 0:  | 
|             FBCommon.SetFBStep(FB_Step_MapPrepare, tick)  | 
|   | 
|               | 
|       | 
|       | 
|     fbPlayerCnt = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_NPCStrengthenPlayerCnt)  | 
|     DuJieFBCfg = GetRealmFBTimeCfg()  | 
|     if not gameFB.GetGameFBDictByKey(DuJieFB_LeaderPlayerID):  | 
|         #ÖØÖÃÊôÐÔ¼Ó³É  | 
|            | 
|         for attrID in DuJieFBCfg[Def_HelpAddAttrID]:  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBAttrAdd % attrID, 0)  | 
|           | 
|         GameWorld.DebugLog('Íæ¼Ò½øÈ븱±¾')  | 
|           | 
|         #if lineID == 0 or fbPlayerCnt == 1 or curPlayer.GetTeamLV() == IPY_GameWorld.tmlLeader:  | 
|         __SetFBLeaderPlayer(curPlayer)  | 
| #            if gameFB.GetFBStep() == FB_Step_Fighting:  | 
| #                __OnDuJieFBStart(tick)  | 
|     fbStep = gameFB.GetFBStep()  | 
|       | 
|     if lineID !=0 and fbStep == FB_Step_CallHelp:  | 
|         FBHelpBattle.SendGameServer_RefreshHelpBattlePlayer(curPlayer, ChConfig.Def_FBMapID_DuJie, lineID)  | 
|         return  | 
|       | 
|     if fbStep == FB_Step_MapPrepare:  | 
|         #³õʼ»¯²¢Í¨ÖªµÈ´ýµ¹¼ÆÊ±  | 
|         __EnterFBInPrepare(curPlayer, DuJieFBCfg[Def_Time_MapPrepare] * 1000, gameFB, tick)  | 
|           | 
|     elif fbStep == FB_Step_Fighting:  | 
|         #֪ͨ½øÈëʱ¼ä  | 
|         notifyTick = max(DuJieFBCfg[Def_Time_Fight] * 1000 - (tick - gameFB.GetFBStepTick()), 0)  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttTowerTake, 0, notifyTick, True)  | 
|         #__UpdDuJieFBStar(tick, True)  | 
|   | 
|     DoFBHelp(curPlayer, tick)  | 
|       | 
|     return  | 
|   | 
| ## ÕÙ»½ÖúÕ½Íê³É  | 
| def OnCallHelpBattleOK(curPlayer, tick):  | 
|     lineID = 1 if FBCommon.GetFBPropertyMark() else 0  | 
|     EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_DuJie, lineID, ChConfig.CME_Log_Start, 0)  | 
|     DuJieFBCfg = GetRealmFBTimeCfg()  | 
|     FBCommon.SetFBStep(FB_Step_MapPrepare, tick)  | 
|     __EnterFBInPrepare(curPlayer, DuJieFBCfg[Def_Time_MapPrepare] * 1000, GameWorld.GetGameFB(), tick)  | 
|     return  | 
|   | 
| def __SetFBLeaderPlayer(curPlayer):  | 
|     ##ÉèÖø±±¾¶É½ÙÖ÷ÈË  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     gameFB.SetGameFBDict(DuJieFB_LeaderPlayerID, curPlayer.GetPlayerID())  | 
|     gameFB.SetGameFBDict(DuJieFB_RealmLV, curPlayer.GetOfficialRank())  | 
|     PlayerPrestigeSys.SyncRealmFBState(curPlayer)  | 
|       | 
|     FBCommon.UpdateFBEnterTick(curPlayer)  | 
|     #ÇëÇ󻤷¨  | 
|     OnGetMemberForHelpDujie(curPlayer, False)  | 
|     return  | 
|   | 
| ##¸±±¾¶¨Ê±Æ÷  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ·µ»ØÖµÎÞÒâÒå  | 
| # @remarks ¸±±¾¶¨Ê±Æ÷  | 
| def OnProcess(tick):  | 
|     fbStep = GameWorld.GetGameFB().GetFBStep()  | 
|       | 
|     if fbStep == FB_Step_MapPrepare:  | 
|         __DoLogic_MapPrepare(tick)  | 
|     elif fbStep == FB_Step_Fighting:  | 
|         __DoLogic_MapFighting(tick)  | 
|     elif fbStep == FB_Step_LeaveTime:  | 
|         __DoLogic_MapLeave(tick)  | 
|     return  | 
|   | 
|   | 
| ## ¸üе±Ç°¸±±¾ÐǼ¶  | 
| def __UpdDuJieFBStar(tick, isForce=False):  | 
|     return  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     curStar = gameFB.GetGameFBDictByKey(DuJieFB_Star)  | 
|     if curStar == 1:  | 
|         return curStar  | 
|       | 
|     useSecond = int(math.ceil((tick - gameFB.GetFBStepTick()) / 1000.0))  | 
|     DuJieFBCfg = GetRealmFBTimeCfg()  | 
|     starTimeList = DuJieFBCfg[Def_StarTime]  | 
|     diffSecond = 0  | 
|     updStar = 1 # Ä¬ÈÏÖÁÉÙ1ÐÇ  | 
|     for star, starTime in enumerate(starTimeList, 2):  | 
|         if useSecond <= starTime:  | 
|             updStar = star  | 
|             diffSecond = starTime - useSecond  | 
|               | 
|     if curStar == updStar and not isForce:  | 
|         return curStar  | 
|           | 
|     gameFB.SetGameFBDict(DuJieFB_Star, updStar)  | 
|       | 
|     GameWorld.DebugLog("__UpdDuJieFBStar useSecond=%s,curStar=%s,updStar=%s, diffSecond=%s"   | 
|                        % (useSecond, curStar, updStar, diffSecond))  | 
|       | 
|       | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         curPlayer = playerManager.GetPlayerByIndex(index)  | 
|         if not curPlayer:  | 
|             continue  | 
|         DoFBHelp(curPlayer, tick)  | 
|         if updStar != 1:  | 
|             curPlayer.Sync_TimeTick(IPY_GameWorld.tttFlagTake, 0, diffSecond * 1000, True)  | 
|               | 
|     return updStar  | 
|   | 
|   | 
| def __EnterFBInPrepare(curPlayer, downTime, gameFB, tick, notifyEff=False):  | 
|     #֪ͨ׼±¸µ¹¼ÆÊ±  | 
|     notifyTick = max(downTime - (tick - gameFB.GetFBStepTick()), 0)  | 
|     curPlayer.Sync_TimeTick(IPY_GameWorld.tttWaitStart, 0, notifyTick, True)  | 
|       | 
|     if notifyEff:  | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttAddUpTime, 0, notifyTick, True)  | 
|     return  | 
|   | 
|   | 
| def __DoLogic_MapPrepare(tick):  | 
|     invadeCfg = GetRealmFBTimeCfg()  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < invadeCfg[Def_Time_MapPrepare] * 1000:  | 
|         return  | 
|     FBCommon.SetFBStep(FB_Step_Fighting, tick)  | 
|     __OnDuJieFBStart(tick)  | 
|     return  | 
|   | 
|   | 
| def __DoLogic_MapFighting(tick):  | 
|     invadeCfg = GetRealmFBTimeCfg()  | 
|       | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() >= invadeCfg[Def_Time_Fight] * 1000:  | 
|         __DoDoJieFBOver(False, tick)  | 
|         return  | 
|     __UpdDuJieFBStar(tick)  | 
|     return  | 
|   | 
| def __DoLogic_MapLeave(tick):  | 
|     invadeCfg = GetRealmFBTimeCfg()  | 
|     if tick - GameWorld.GetGameFB().GetFBStepTick() < invadeCfg[Def_Time_Leave] * 1000:  | 
|         return  | 
|     # Ê±¼äµ½£¬Ìß³ö»¹ÔÚ¸±±¾µÄÍæ¼ÒµÈ...  | 
|     #FBCommon.DoLogic_FBKickAllPlayer()  | 
|     return  | 
|   | 
| def __OnDuJieFBStart(tick):  | 
|     lineID = 1 if FBCommon.GetFBPropertyMark() else 0  | 
|     if not GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_LeaderPlayerID):  | 
|         findLeader = False  | 
|         playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|         for index in xrange(playerManager.GetPlayerCount()):  | 
|             curPlayer = playerManager.GetPlayerByIndex(index)  | 
|             if not curPlayer:  | 
|                 continue  | 
|             if curPlayer.GetTeamLV() == IPY_GameWorld.tmlLeader or (lineID == 1 and curPlayer.GetTeamID() == 0):  | 
|                 __SetFBLeaderPlayer(curPlayer)  | 
|                 findLeader = True  | 
|                 break  | 
|         if not findLeader:  | 
|             GameWorld.Log('    ×¼±¸µ¹¼ÆÊ±Òѹý£¬¶Ó³¤ÈÔδ½øÈ븱±¾£¡£¡£¡ ')  | 
|             FBCommon.DoLogic_FBKickAllPlayer()  | 
|             return  | 
|     DuJieFBCfg = GetRealmFBTimeCfg()  | 
|     bossID = GetDuJieBossID()  | 
|     if not bossID:  | 
|         return  | 
|     mapID = GameWorld.GetMap().GetMapID()  | 
|       | 
|     refreshBossMark = FBCommon.GetFBLineRefreshNPC(mapID, lineID)  | 
|     NPCCustomRefresh.SetNPCRefresh(refreshBossMark, [bossID])  | 
|   | 
|     # Í¨Öª¿ªÊ¼  | 
|     FBCommon.Sync_Player_TimeTick(IPY_GameWorld.tttTowerTake, DuJieFBCfg[Def_Time_Fight] * 1000)   | 
|     FBCommon.NotifyCopyMapPlayerFBHelp(tick, DoFBHelp)  | 
|     __UpdDuJieFBStar(tick)  | 
|     return  | 
|   | 
|   | 
| def __DoDoJieFBOver(isPass, tick):  | 
|     # ¸±±¾½áÊøÂß¼  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_Step_Fighting:  | 
|         return  | 
|     GameWorld.DebugLog("´¦Àí¶É½Ù¸±±¾½áÊøÂß¼")  | 
|     invadeCfg = GetRealmFBTimeCfg()  | 
|     costTime = tick - gameFB.GetFBStepTick()  | 
|     FBCommon.SetFBStep(FB_Step_LeaveTime, tick)  | 
|   | 
|     leaderPlayerID = gameFB.GetGameFBDictByKey(DuJieFB_LeaderPlayerID)  | 
|     copyMapPlayerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     leaderPlayer = copyMapPlayerManager.FindPlayerByID(leaderPlayerID)  | 
|     if not leaderPlayer:  | 
|         #¶É½ÙµÄÈ˲»ÔÚÔòËãʧ°Ü  | 
|         isPass = False  | 
|       | 
|     # Í¨ÖªGameServer¸±±¾½áÊø  | 
|     msgStr = str([isPass, leaderPlayerID])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(0, 0, 0, 'DuJieFBOver', msgStr, len(msgStr))  | 
|   | 
|     curStar = gameFB.GetGameFBDictByKey(DuJieFB_Star)  | 
|     realmLV = gameFB.GetGameFBDictByKey(DuJieFB_RealmLV)  | 
|     realmIpyData = PlayerPrestigeSys.GetRealmIpyData(realmLV)  | 
|     FBPropertyMark = FBCommon.GetFBPropertyMark()  | 
|     lineID = 1 if FBPropertyMark else 0  | 
|     leaveTick = invadeCfg[Def_Time_Leave] * 1000  | 
|     overDict = {FBCommon.Over_costTime:costTime,FBCommon.Over_grade:curStar, FBCommon.Over_leaderID:leaderPlayerID}  | 
|     playerCnt = copyMapPlayerManager.GetPlayerCount()  | 
|     for i in xrange(playerCnt):  | 
|           | 
|         curPlayer = copyMapPlayerManager.GetPlayerByIndex(i)  | 
|           | 
|         if curPlayer == None or curPlayer.IsEmpty():  | 
|             continue  | 
| #        isHelpFight = lineID == 1 and curPlayer.GetPlayerID() != leaderPlayerID  | 
| #        joinType = FBCommon.GetFBJoinType(curPlayer, isHelpFight)  | 
|         EventReport.WriteEvent_FB(curPlayer, ChConfig.Def_FBMapID_DuJie, lineID, ChConfig.CME_Log_End, 0, isPass)  | 
|       | 
|         curPlayer.Sync_TimeTick(IPY_GameWorld.tttLeaveMap, 0, leaveTick, True)  | 
|         if isPass and leaderPlayer:  | 
|             if curPlayer.GetPlayerID() == leaderPlayerID:  | 
|                 #¶É½Ùͨ¹ý´¦Àí  | 
|                 PlayerPrestigeSys.DologicDujieFBPass(curPlayer, realmLV, curStar)  | 
|                 #Çå³ýCD  | 
|                 FBCommon.SetFBPDictValue(curPlayer, ChConfig.Def_PDict_LastEnterFBTick % ChConfig.Def_FBMapID_DuJie, 0)  | 
|                 FBCommon.SyncFBEnterTick(curPlayer)  | 
|                 if lineID:  | 
|                     addXianyuanCoin, reason = FBHelpBattle.DoFBAddXianyuanCoin(curPlayer, ChConfig.Def_FBMapID_DuJie, FBPropertyMark)  | 
|                     overDict[FBCommon.Over_xianyuanCoin] = [addXianyuanCoin, reason]  | 
|               | 
|             if realmIpyData and realmIpyData.GetIsBigRealm():  | 
|                 #³É¾Í  | 
|                 PlayerSuccess.DoAddSuccessProgress(curPlayer, ShareDefine.SuccType_DujieFBHelpPass, 1)  | 
|             if playerCnt > 1: #¶àÈË×é¶Ó¶É½Ù  | 
|                 EventShell.EventRespons_FBEvent(curPlayer, 'teamdujie')  | 
|         FBCommon.NotifyFBOver(curPlayer, ChConfig.Def_FBMapID_DuJie, lineID, isPass, overDict)  | 
|       | 
|     return  | 
|   | 
| def __GiveTeamAward(curPlayer, leaderPlayer, realmIpyData, curStar):  | 
|     #°ïæ´òµÄ¸ø½±Àø  | 
|     if not realmIpyData:  | 
|         return  | 
|     teamAwardDict = realmIpyData.GetTeamAward()  | 
|     if not teamAwardDict:  | 
|         return  | 
|       | 
|     prizeItemList = teamAwardDict.get(curStar, [])  | 
|     needSpace = len(prizeItemList)  | 
|     emptySpace = ItemCommon.GetItemPackSpace(curPlayer, IPY_GameWorld.rptItem, needSpace)  | 
|     isSendMail = int(needSpace > emptySpace) # ÊÇ·ñ·¢ËÍÓʼþ  | 
|     if isSendMail:  | 
|         PlayerControl.SendMailByKey("RealmFBTeam", [curPlayer.GetPlayerID()], prizeItemList, [leaderPlayer.GetPlayerName()])  | 
|         GameWorld.DebugLog("±³°ü¿Õ¼ä²»¹»£¬·¢ËÍÓʼþ: mailItemList=%s" % str(prizeItemList), curPlayer.GetPlayerID())  | 
|     else:  | 
|         for itemID, itemCnt, isBind in prizeItemList:  | 
|             ItemControler.GivePlayerItem(curPlayer, itemID, itemCnt, isBind, [IPY_GameWorld.rptItem],  | 
|                                             event=["Dojie", False, {}])  | 
|     return  | 
|   | 
| ##»ñµÃ¸±±¾°ïÖúÐÅÏ¢  | 
| # @param curPlayer Íæ¼ÒʵÀý  | 
| # @param tick Ê±¼ä´Á  | 
| # @return ÎÞÒâÒå  | 
| # @remarks ÓÃÓÚ֪ͨÕóÓª±È·ÖÌõ  | 
| def DoFBHelp(curPlayer, tick, helpDict={}):  | 
|   | 
|     gameFB = GameWorld.GetGameFB()  | 
|     leaderPlayerID = gameFB.GetGameFBDictByKey(DuJieFB_LeaderPlayerID)  | 
| #    curStar = gameFB.GetGameFBDictByKey(DuJieFB_Star)  | 
|     helpDict[FBCommon.Help_leaderID] = leaderPlayerID  | 
|     FBCommon.Notify_FBHelp(curPlayer, helpDict)  | 
|     return  | 
|   | 
| def DoFB_Npc_KillNPC(attacker, curNPC, tick):  | 
|     __FBNPCOnKilled(curNPC, tick)  | 
|     return  | 
|   | 
| ## Ö´Ðи±±¾É±¹ÖÂß¼  | 
| #  @param curPlayer É±¹ÖµÄÈË  | 
| #  @param curNPC ±»É±µÄ¹Ö  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFB_Player_KillNPC(curPlayer, curNPC, tick):  | 
|     __FBNPCOnKilled(curNPC, tick)  | 
|     return  | 
|   | 
| def __FBNPCOnKilled(curNPC, tick):  | 
|     bossID = curNPC.GetNPCID()  | 
|     if bossID != GetDuJieBossID():  | 
|         return  | 
|     GameWorld.DebugLog('¶É½ÙÒѱ»»÷ɱ£¡')  | 
|       | 
| #    # È«·þ¹ã²¥  | 
| #    PlayerControl.WorldNotify(0, "jiazu_liubo_202580", [curPlayer.GetFamilyName(), mapID, bossID])  | 
|     __DoDoJieFBOver(True, tick)  | 
|     return  | 
| ## ¼ì²éÊÇ·ñ¿É¹¥»÷£¬ Ö÷Åж¨²»¿É¹¥»÷µÄÇé¿ö£¬ÆäËûÂß¼ÓÉÍâ²ã¾ö¶¨  | 
| #  @param attacker ¹¥»÷·½  | 
| #  @param defender ·ÀÊØ·½  | 
| #  @return bool  | 
| def CheckCanAttackTagObjInFB(attacker, defender):  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     if gameFB.GetFBStep() != FB_Step_Fighting:  | 
|         return False  | 
|     return True  | 
|   | 
| ## ¸±±¾ÐÐΪ  | 
| #  @param curPlayer Íæ¼Ò  | 
| #  @param actionType ÐÐΪÀàÐÍ  | 
| #  @param actionInfo ÐÐΪÐÅÏ¢  | 
| #  @param tick µ±Ç°Ê±¼ä  | 
| #  @return None  | 
| def DoFBAction(curPlayer, actionType, actionInfo, tick):  | 
|       | 
|     if curPlayer.GetPlayerID() != GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_LeaderPlayerID):  | 
|         return  | 
|     #ÑéÖ¤¼ä¸ô  | 
|     if tick - curPlayer.GetTickByType(ChConfig.TYPE_Player_Tick_DuJieInspire) < IpyGameDataPY.GetFuncCfg('RealmFBHelpAttr', 3):  | 
|         #ûµ½¼ä¸ô  | 
|         GameWorld.DebugLog("µã»÷¹ÄÎè¼ä¸ô")  | 
|         return  | 
|     curPlayer.SetTickByType(ChConfig.TYPE_Player_Tick_DuJieInspire, tick)  | 
|     OnGetMemberForHelpDujie(curPlayer, True)  | 
|       | 
|     return  | 
|   | 
| def OnGetMemberForHelpDujie(curPlayer, isInspire):  | 
|     #ÏòÃËÓÑѰÇóÊØ»¤  | 
| #    if curPlayer.GetFamilyID() <= 0:  | 
| #        GameWorld.DebugLog("ûÓÐÕ½ÃË£¬²»ÄÜÇëÇóÊØ»¤£¡")  | 
| #        return  | 
|       | 
|     realmLV = GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_RealmLV)  | 
|     realmIpyData = PlayerPrestigeSys.GetRealmIpyData(realmLV)  | 
|     if not realmIpyData:  | 
|         return  | 
|     if realmIpyData.GetIsBigRealm():  | 
|         GameWorld.DebugLog("´ó¾³½ç¶É½Ù£¬²»ÄÜÇëÇóÊØ»¤£¡")  | 
|         return  | 
|     GameWorld.DebugLog("ÏòÃËÓÑѰÇó¶É½ÙÊØ»¤£¡")  | 
|     atkAdd = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBAttrAdd % ShareDefine.Def_Effect_BaseAtkAddPer)  | 
|     msgStr = str([atkAdd, isInspire])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, 'GetMemberForHelpDujie', msgStr, len(msgStr))  | 
|     return  | 
|   | 
|   | 
|   | 
| def OnGetDuJieHelpInfo(curPlayer, helpInfo):  | 
|     #ÊÕµ½ÊØ»¤ÐÅÏ¢   | 
|     realmFBHelpAttrDict = IpyGameDataPY.GetFuncEvalCfg('RealmFBHelpAttr')  | 
|     totalAttrDict = {}  | 
|     fbhelpInfo = ''  | 
|     for helpType, name in helpInfo:  | 
|         attrDict = realmFBHelpAttrDict.get(str(helpType), {})  | 
|         for attrID, attrValue in attrDict.items():  | 
|             totalAttrDict[attrID] = totalAttrDict.get(attrID, 0) + attrValue  | 
|         fbhelpInfo +='%s|%s,' % (helpType, name)  | 
|           | 
|     for attrID, attrValue in totalAttrDict.items():  | 
|         if int(attrID) in GetRealmFBTimeCfg()[Def_HelpAddAttrID]:  | 
|             PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_RealmFBAttrAdd % attrID, attrValue)  | 
|   | 
|     #Ë¢ÊôÐÔ  | 
|     PlayerControl.PlayerControl(curPlayer).RefreshPlayerAttrByBuff()  | 
|       | 
|     #¸±±¾°ïÖúÐÅÏ¢  | 
|     if fbhelpInfo:  | 
|         fbhelpInfo = fbhelpInfo[:-1]  | 
|     helpDict = {'helpInfo':fbhelpInfo}  | 
|     DoFBHelp(curPlayer, 0, helpDict)  | 
|     return  | 
|   | 
| def CalcDujieFBAttrAdd(curPlayer, allAttrList):  | 
|     #»¤·¨ÊôÐÔ¼ÆËã  | 
|     if FBCommon.GetRecordMapID(curPlayer.GetMapID()) != ChConfig.Def_FBMapID_DuJie:  | 
|         return  | 
|     leaderPlayerID = GameWorld.GetGameFB().GetGameFBDictByKey(DuJieFB_LeaderPlayerID)  | 
|     if curPlayer.GetID() != leaderPlayerID:  | 
|         return  | 
| #    fbStep = GameWorld.GetGameFB().GetFBStep()  | 
| #    if fbStep != FB_Step_Fighting:  | 
| #        return  | 
|     fbcfg = GetRealmFBTimeCfg()  | 
|     if not fbcfg:  | 
|         return  | 
|     GameWorld.DebugLog('»¤·¨ÊôÐÔ¼ÆËã allAttrList=%s'%allAttrList)  | 
|     for attrID in GetRealmFBTimeCfg()[Def_HelpAddAttrID]:  | 
|         attrValue = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_RealmFBAttrAdd % attrID)  | 
|         PlayerControl.CalcAttrDict_Type(attrID, attrValue, allAttrList)  | 
|       | 
|     GameWorld.DebugLog('»¤·¨ÊôÐÔ¼ÆËã½á¹û allAttrList=%s'%allAttrList)  | 
|     return  | 
| ## ÊÇ·ñ¸±±¾¸´»î  | 
| #  @param None  | 
| #  @return ÊÇ·ñ¸±±¾¸´»î  | 
| def OnPlayerReborn():  | 
|     return True |