| #!/usr/bin/python  | 
| # -*- coding: GBK -*-  | 
| #-------------------------------------------------------------------------------  | 
| #  | 
| ##@package GameWorldLogic.FBProcess.FBHelpBattle  | 
| #  | 
| # @todo:¸±±¾Öúսϵͳ  | 
| # @author hxp  | 
| # @date 2018-11-24  | 
| # @version 1.0  | 
| #  | 
| # ÏêϸÃèÊö: ¸±±¾Öúսϵͳ  | 
| #  | 
| #-------------------------------------------------------------------------------  | 
| #"""Version = 2018-11-24 22:30"""  | 
| #-------------------------------------------------------------------------------  | 
|   | 
| import GameWorld  | 
| import ChConfig  | 
| import PlayerControl  | 
| import ChPyNetSendPack  | 
| import NetPackCommon  | 
| import PlayerViewCacheTube  | 
| import PlayerActGarbageSorting  | 
| import FBCommon  | 
| import IpyGameDataPY  | 
| import ShareDefine  | 
| import PyGameData  | 
| import random  | 
| import GameMap  | 
| import NPCCommon  | 
| import FBLogic  | 
| import IPY_GameWorld  | 
| import PlayerActivity  | 
| import ItemControler  | 
|   | 
| MaxRobotID = 100 # ×î´ó»úÆ÷ÈËNPC¶¨ÒåID  | 
|   | 
| def DoPlayerOnDay(curPlayer):  | 
|     checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)  | 
|     checkInCount = checkInInfo / 10 # ÀÛ¼ÆµÇ¼Ç  | 
|     todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒÑµÇ¼Ç  | 
|     if todayIsCheckIn:  | 
|         checkInInfo = checkInCount * 10 + 0  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)  | 
|         SyncCheckInState(curPlayer, 0, False)  | 
|     return  | 
|   | 
| def DoPlayerLogin(curPlayer):  | 
|     checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)  | 
|     todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒÑµÇ¼Ç  | 
|     if todayIsCheckIn:  | 
|         SyncCheckInState(curPlayer, 1, True)  | 
|     return  | 
|   | 
| def SyncCheckInState(curPlayer, checkInState, isLogin):  | 
|     ## Í¬²½µÇ¼Ç״̬  | 
|     checkInPack = ChPyNetSendPack.tagMCHelpBattleCheckInResult()  | 
|     checkInPack.IsOK = checkInState  | 
|     checkInPack.IsLogin = int(isLogin)  | 
|     NetPackCommon.SendFakePack(curPlayer, checkInPack)  | 
|     return  | 
|   | 
| def GameServer_FBHelpBattleResult(curPlayer, msgList, tick):  | 
|     ## GameServer½á¹û·µ»Ø´¦Àí  | 
|       | 
|     if not msgList:  | 
|         return  | 
|       | 
|     cmd = msgList[0]  | 
|     # µÇ¼Ç  | 
|     if cmd == "CheckIn":  | 
|         __OnHelpBattleCheckInResult(curPlayer, msgList, tick)  | 
|           | 
|     # Ë¢Ð  | 
|     elif cmd == "Refresh":  | 
|         __OnHelpBattleRefreshResult(curPlayer, msgList, tick)  | 
|           | 
|     # É¨µ´ÕÙ»½  | 
|     elif cmd == "SweepCall":  | 
|         __OnHelpBattleSweepCallResult(curPlayer, msgList, tick)  | 
|       | 
|     return  | 
|   | 
| #// B1 05 ÖúÕ½µÇ¼Ç #tagCMHelpBattleCheckIn  | 
| #  | 
| #struct    tagCMHelpBattleCheckIn  | 
| #{  | 
| #    tagHead         Head;  | 
| #};  | 
| def OnHelpBattleCheckIn(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     checkInInfo = curPlayer.NomalDictGetProperty(ChConfig.Def_PDict_HelpBattleCheckInCount)  | 
|     checkInCount = checkInInfo / 10 # ÀÛ¼ÆµÇ¼Ç  | 
|     todayIsCheckIn = checkInInfo % 10 # ½ñÌìÊÇ·ñÒÑµÇ¼Ç  | 
|     if todayIsCheckIn:  | 
|         GameWorld.DebugLog("µ±ÌìÒѵǼǣ¬²»ÐèÒªÖØ¸´µÇ¼Ç£¡", curPlayer.GetPlayerID())  | 
|         return  | 
|     fightPower = PlayerControl.GetFightPower(curPlayer)  | 
|     msgInfo = str(["CheckIn", checkInCount, fightPower])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))  | 
|     return  | 
|   | 
| def __OnHelpBattleCheckInResult(curPlayer, msgList, tick):  | 
|     ## µÇ¼Ç·µ»Ø  | 
|     cmd, checkInCount, fightPower, isOK, haveViewCache = msgList  | 
|     if isOK:  | 
|         checkInInfo = (checkInCount + 1) * 10 + 1  | 
|         PlayerControl.NomalDictSetProperty(curPlayer, ChConfig.Def_PDict_HelpBattleCheckInCount, checkInInfo)  | 
|         PlayerActivity.AddDailyActionFinishCnt(curPlayer, ShareDefine.DailyActionID_HelpBattleCheckIn)  | 
|         PlayerActGarbageSorting.AddActGarbageTaskProgress(curPlayer, ChConfig.Def_GarbageTask_HelpBattle)  | 
|           | 
|         # Ã»ÓÐÊý¾Ý»º´æµÄ»°£¬ÂíÉÏͬ²½Ò»´Î  | 
|         if not haveViewCache:  | 
|             PlayerViewCacheTube.UpdateGameServerPlayerCache(curPlayer, tick, False)  | 
|               | 
|     SyncCheckInState(curPlayer, 1, False)  | 
|       | 
|     GameWorld.DebugLog("FBHelpBattleResult: %s,checkInCount=%s,fightPower=%s,isOK=%s,haveViewCache=%s"   | 
|                        % (cmd, checkInCount, fightPower, isOK, haveViewCache), curPlayer.GetPlayerID())  | 
|     return  | 
|   | 
| #// B1 06 ÖúÕ½ÕÙ»½ #tagCMHelpBattleCall  | 
| #  | 
| #struct    tagCMHelpBattleCall  | 
| #{  | 
| #    tagHead         Head;  | 
| #    BYTE        IsOneKeyCall;    // ÊÇ·ñÒ»¼üÕÙ»½  | 
| #    DWORD        PlayerID;        // ÕÙ»½µÄÍæ¼ÒID£¬´óÓÚ1СÓÚ100´ú±í»úÆ÷ÈË  | 
| #    BYTE        IsGoldCall;    // ÊÇ·ñÏÉÓñÕÙ»½  | 
| #};  | 
| def OnHelpBattleCall(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     isOneKeyCall = clientData.IsOneKeyCall  | 
|     calledPlayerID = clientData.PlayerID  | 
|     #isGoldCall = clientData.IsGoldCall  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID())  | 
|     funcLineID = FBCommon.GetFBPropertyMark()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)  | 
|     if not ipyData:  | 
|         return  | 
|       | 
|     helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})  | 
|     maxHelpPlayerCount = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 2) # ×î´óÖúÕ½ÈËÊý  | 
|     calledCount = 0  | 
|     freePlayerIDList = []  | 
|     helpNPCRobotIDList = []  | 
|     for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():  | 
|         objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)  | 
|         if objID:  | 
|             if helpPlayerID == calledPlayerID:  | 
|                 GameWorld.DebugLog("¸ÃÖúÕ½»úÆ÷ÈËIDÒѾÕÙ»½¹ý£¬²»ÔÊÐíÖØ¸´ÕÙ»½!calledPlayerID=%s" % calledPlayerID)  | 
|                 return  | 
|             calledCount += 1  | 
|         # Í³¼ÆÃâ·ÑµÄδÕÙ»½µÄ  | 
|         elif not helpPlayerInfoDict.get("NeedGoldCall", 0):  | 
|             if "Name" in helpPlayerInfoDict:  | 
|                 freePlayerIDList.append(helpPlayerID)  | 
|             else:  | 
|                 helpNPCRobotIDList.append(helpPlayerID)  | 
|     if calledCount >= maxHelpPlayerCount:  | 
|         GameWorld.Log("ÒѾÕÙ»½ÂúÈËÊý£¡ÎÞ·¨ÔÙÕÙ»½£¡calledCount=%s" % calledCount, playerID)  | 
|         return  | 
|       | 
|     calledPlayerDict = {} # {±»ÕÙ»½µÄÍæ¼ÒID:¹ØÏµ, ...}  | 
|     # ÓÅÏÈÕÙ»½Ãâ·ÑÍæ¼Ò¾µÏñ£¬²»×ã²ÅÕÐNPC£¬Ôݲ»×öÕ½Á¦ÅÅÐò  | 
|     if isOneKeyCall:  | 
|         lackCount = maxHelpPlayerCount - calledCount  | 
|         if freePlayerIDList:  | 
|             randIDList = random.sample(freePlayerIDList, min(lackCount, len(freePlayerIDList)))  | 
|             lackCount -= len(randIDList)  | 
|             for randID in randIDList:  | 
|                 helpPlayerInfoDict = helpBattlePlayerDict[randID]  | 
|                 calledPlayerDict[randID] = helpPlayerInfoDict.get("Relation", 0)  | 
|         if lackCount > 0 and helpNPCRobotIDList:  | 
|             for robotID in helpNPCRobotIDList[:lackCount]:  | 
|                 calledPlayerDict[robotID] = 0       | 
|                   | 
| # ÐÞ¸ÄÁ˹æÔò£¬ÎÞÉç½»ÈËÊý¼°»úÆ÷ÈËÈËÊý×öÁËÏÞÖÆ£¬ËùÒÔ¿ÉÄܳöÏÖÈËÊý²»×ãµÄÇé¿ö£¬¹ÊÆÁ±Î´ËÅÐ¶Ï  | 
| #        if calledCount + len(calledPlayerDict) < maxHelpPlayerCount:  | 
| #            GameWorld.ErrLog("ÎÞ·¨Ò»¼üÕÙ»½!ÈËÊý²»×ã! calledCount=%s,calledPlayerDict=%s,maxHelpPlayerCount=%s"   | 
| #                             % (calledCount, calledPlayerDict, maxHelpPlayerCount), playerID)  | 
| #            return  | 
|     else:  | 
|         if calledPlayerID not in helpBattlePlayerDict:  | 
|             GameWorld.ErrLog("²»´æÔÚ¸ÃÖúÕ½Íæ¼Ò£¬ÎÞ·¨ÕÙ»½£¡calledPlayerID=%s" % (calledPlayerID), playerID)  | 
|             return  | 
|         helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID]  | 
|         if helpPlayerInfoDict.get("NeedGoldCall", 0):  | 
|             goldCallCost = IpyGameDataPY.GetFuncCfg("HelpBattleCall", 5) # ¸¶·ÑÕÙ»½ÏûºÄÏÉÓñ£¬ÓÅÏÈÏûºÄ°óÓñ  | 
|             # âýÓ¢°æ¸ÄΪֱ½Ó¿Û°óÓñÁéʯ 2019/10/8  | 
|             costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, goldCallCost)  | 
|             if not costMoneyList:  | 
|                 return  | 
|               | 
|             infoDict = {"MapID":mapID, 'lineID':funcLineID, "Type":"Call"}  | 
|             for moneyType, moneyNum in costMoneyList:  | 
|                 PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBHelpBattle, infoDict)  | 
|         calledPlayerDict[calledPlayerID] = helpPlayerInfoDict.get("Relation", 0)  | 
|           | 
|     # Ö±½ÓÔÚµØÍ¼ÕÙ»½³öÀ´  | 
|     robotNPCID = IpyGameDataPY.GetFuncCfg("HelpBattleRobot", 1)  | 
|     posX, posY = curPlayer.GetPosX(), curPlayer.GetPosY()  | 
|     for calledPlayerID in calledPlayerDict.keys():  | 
|         if calledPlayerID not in helpBattlePlayerDict:  | 
|             continue  | 
|         helpPlayerInfoDict = helpBattlePlayerDict[calledPlayerID]  | 
|         job = helpPlayerInfoDict.get("Job", 1)  | 
|         if "FightPower" in helpPlayerInfoDict:  | 
|             fightPower = helpPlayerInfoDict["FightPower"]  | 
|             npcLV = helpPlayerInfoDict["LV"]  | 
|         else:  | 
|             fightPower = ipyData.GetRobotFightPower()  | 
|             npcLV = ipyData.GetRobotLV()  | 
|             calledPlayerDict.pop(calledPlayerID) # ÕÐNPC²»Í¨ÖªGameServer  | 
|               | 
|         jobSkillDict = ipyData.GetRobotSkillsDict()  | 
|           | 
|         position = GameMap.GetEmptyPlaceInAreaEx(posX, posY, 2, 6)  | 
|         npcPosX, npcPosY = position.GetPosX(), position.GetPosY()  | 
|         helpBattleNPC = NPCCommon.SummonMapNpc(robotNPCID, npcPosX, npcPosY)  | 
|         if not helpBattleNPC:  | 
|             continue  | 
|         objID = helpBattleNPC.GetID()  | 
|         helpBattleNPC.SetIsNeedProcess(True)  | 
|         GameWorld.Log("ÕÙ»½ÖúÕ½³É¹¦: calledPlayerID=%s,objID=%s,fightPower=%s" % (calledPlayerID, objID, fightPower), playerID)  | 
|         gameFB.SetGameFBDict(ChConfig.Def_FB_HelpBattleFBObjID % calledPlayerID, objID)  | 
|         helpBattleNPC.SetDict(ChConfig.Def_NPC_Dict_AtkDelayTick, calledCount * 1000) # °´×ª»»Ë³Ðòÿ¸öÑÓ³¤1Ãë¹¥»÷£¬·ÀÖ¹¶¯×÷Ò»Ö  | 
|         calledCount += 1  | 
|         # ÉèÖÃÖúÕ½ÊôÐÔ  | 
|         npcControl = NPCCommon.NPCControl(helpBattleNPC)  | 
|         npcControl.SetHelpBattleRobotRebornAttr(fightPower)  | 
|         __DoGiveHelpBattleRobotSkill(helpBattleNPC, jobSkillDict, job, npcLV)  | 
|           | 
|         # Í¨ÖªÇ°¶ËÕÙ»½³É¹¦  | 
|         callResultPack = ChPyNetSendPack.tagMCHelpBattleCallResult()  | 
|         callResultPack.ObjID = objID  | 
|         callResultPack.PlayerID = calledPlayerID  | 
|         callResultPack.Job = job  | 
|         NetPackCommon.SendFakePack(curPlayer, callResultPack)  | 
|           | 
|     # ÕÙ»½Âúºó£¬Ç°¶Ë¹Ø±Õ½çÃæÄ¬ÈÏ·¢Ò»¼üÕÙ»½£¬ÎÞÂÛÕжàÉÙÈ˶¼Ö±½Ó¿ªÊ¼  | 
|     if isOneKeyCall or calledCount >= len(helpBattlePlayerDict) or calledCount >= maxHelpPlayerCount:  | 
|         FBLogic.OnCallHelpBattleOK(curPlayer, tick)  | 
|           | 
|     # Í¨ÖªGameServer  | 
|     if calledPlayerDict:  | 
|         msgInfo = str(["Call", mapID, funcLineID, calledPlayerDict])  | 
|         GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))  | 
|         GameWorld.Log("GameServer_QueryPlayerResult: %s" % msgInfo, curPlayer.GetID())  | 
|     return  | 
|   | 
| def __DoGiveHelpBattleRobotSkill(curNPC, jobSkillDict, job, npcLV):  | 
|     skillManager = curNPC.GetSkillManager()  | 
|     if job not in jobSkillDict:  | 
|         return  | 
|     skillInfoDict = jobSkillDict[job]  | 
|     #{Ö°Òµ:{(¼¼ÄÜID,...):ËùÐèµÈ¼¶, ¼¼ÄÜID:ËùÐèµÈ¼¶, ...}, ...}  | 
|     #{1:{(12000, 12001, 12002, 12003):1, 12011:7, 12012:15, 12013:30, 12014:80, 12015:140}, 2:{(12100, 12101, 12102, 12103):1, 12111:7, 12112:15, 12114:80, 12115:140}}  | 
|     skillIDList = []  | 
|     for skillInfo, needLV in skillInfoDict.items():  | 
|         if npcLV < needLV:  | 
|             continue  | 
|         if isinstance(skillInfo, int):  | 
|             skillIDList.append(skillInfo)  | 
|         else:  | 
|             skillIDList += list(skillInfo)  | 
|     GameWorld.DebugLog("    ¸øÖúÕ½»úÆ÷È˼¼ÄÜ: job=%s,npcLV=%s, %s" % (job, npcLV, skillIDList))  | 
|     for skillID in skillIDList:  | 
|         skillManager.LearnSkillByID(skillID)  | 
|     return  | 
|   | 
| #// B1 07 ÖúսˢР#tagCMHelpBattleRefresh  | 
| #  | 
| #struct    tagCMHelpBattleRefresh  | 
| #{  | 
| #    tagHead         Head;  | 
| #};  | 
| def OnHelpBattleRefresh(index, clientData, tick):  | 
|     curPlayer = GameWorld.GetPlayerManager().GetPlayerByIndex(index)  | 
|     SendGameServer_RefreshHelpBattlePlayer(curPlayer, isClientRefresh=True)  | 
|     return  | 
|   | 
| def SendGameServer_RefreshHelpBattlePlayer(curPlayer, mapID=0, funcLineID=0, isClientRefresh=False):  | 
|     ## ·¢ËÍGameServerÇëÇóË¢ÐÂÖúÕ½Íæ¼ÒÁÐ±í  | 
|     if not mapID:  | 
|         mapID = FBCommon.GetRecordMapID(curPlayer.GetMapID())  | 
|     if not funcLineID:  | 
|         funcLineID = FBCommon.GetFBPropertyMark()  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)  | 
|     if not ipyData:  | 
|         return  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     costMoneyList = []  | 
|     calledPlayerIDDict = {} # ÒѾÕÙ»½µÄÍæ¼ÒID×Öµä {playerID:[ÊÇ·ñ¸¶·ÑÕÙ»½, Ö°Òµ], ...}  | 
|       | 
|     refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)  | 
|     if isClientRefresh:  | 
|         freeRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 1)  | 
|         goldRefreshCount = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 2)  | 
|         if refreshCount >= (freeRefreshCount + goldRefreshCount):  | 
|             GameWorld.DebugLog("³¬¹ýË¢ÐÂÖúÕ½Áбí´ÎÊý£¡ÎÞ·¨Ë¢ÐÂ!refreshCount=%s" % (refreshCount), playerID)  | 
|             return  | 
|           | 
|         if refreshCount >= freeRefreshCount:  | 
|             costGold = IpyGameDataPY.GetFuncCfg("HelpBattleRefresh", 3)  | 
|             # âýÓ¢°æ¸ÄΪֱ½Ó¿Û°óÓñÁéʯ 2019/10/8  | 
|             costMoneyList = PlayerControl.HaveMoneyEx(curPlayer, IPY_GameWorld.TYPE_Price_Gold_Paper, costGold)  | 
|             if not costMoneyList:  | 
|                 GameWorld.DebugLog("»õ±Ò²»×ã!ÎÞ·¨Ë¢ÐÂÖúÕ½£¡")  | 
|                 return  | 
|               | 
|         # »ñÈ¡ÒѾÕÙ»½µÄÍæ¼Ò¾µÏñID  | 
|         helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})  | 
|         for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():  | 
|             objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)  | 
|             if not objID:  | 
|                 continue  | 
|             needGoldCall = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleGoldCall % helpPlayerID)  | 
|             job = helpPlayerInfoDict.get("Job", 1)  | 
|             relation = helpPlayerInfoDict.get("Relation", 0) # ¹ØÏµÐèÒÔË¢ÐÂÁбíʱµÄΪ׼£¬Èç¹ûÒѾÕÙ»½ÁË£¬ÔòÒѵ±Ê±µÄΪ׼  | 
|             calledPlayerIDDict[helpPlayerID] = [needGoldCall, job, relation]  | 
|               | 
|     # ·Ç¿Í»§¶ËˢеÄÊÓÎªÖØÐ¿ªÊ¼£¬ÖØÖÃˢдÎÊý   | 
|     else:  | 
|         if not refreshCount:  | 
|             gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, 0)  | 
|         gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBFightPower, ipyData.GetFightPowerMin())  | 
|         gameFB.SetGameFBDict(ChConfig.FBPD_HelpBattleFBBaseHurt, ipyData.GetRobotBaseHurt())  | 
|         GameWorld.DebugLog("ÉèÖø±±¾Õ½Á¦=%s,±£µ×É˺¦=%s" % (ipyData.GetFightPowerMin(), ipyData.GetRobotBaseHurt()))  | 
|           | 
|     msgInfo = str(["Refresh", mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))  | 
|     GameWorld.Log("SendGameServer_RefreshHelpBattlePlayer %s" % (msgInfo), playerID)  | 
|     return  | 
|   | 
| def __OnHelpBattleRefreshResult(curPlayer, msgList, tick):  | 
|     ## Ë¢Ð·µ»Ø  | 
|     cmd, mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict, helpBattlePlayerDict = msgList  | 
|       | 
|     playerID = curPlayer.GetPlayerID()  | 
|     gameFB = GameWorld.GetGameFB()  | 
|       | 
|     # ¿ÛÇ®£¬¼ÓˢдÎÊý  | 
|     infoDict = {"MapID":mapID, 'lineID':funcLineID, "Type":"Refresh"}  | 
|     for moneyType, moneyNum in costMoneyList:  | 
|         PlayerControl.PayMoney(curPlayer, moneyType, moneyNum, ChConfig.Def_Cost_FBHelpBattle, infoDict)  | 
|     refreshCount = gameFB.GetPlayerGameFBDictByKey(playerID, ChConfig.FBPD_HelpBattleRefreshCount)  | 
|     if isClientRefresh:  | 
|         refreshCount += 1  | 
|         gameFB.SetPlayerGameFBDict(playerID, ChConfig.FBPD_HelpBattleRefreshCount, refreshCount)  | 
|           | 
|     GameWorld.Log("FBHelpBattleResult: %s,mapID=%s,funcLineID=%s,isClientRefresh=%s,costMoneyList=%s,calledPlayerIDDict=%s,refreshCount=%s"   | 
|                   % (cmd, mapID, funcLineID, isClientRefresh, costMoneyList, calledPlayerIDDict, refreshCount), playerID)  | 
|     GameWorld.Log("    helpBattlePlayerDict=%s" % (helpBattlePlayerDict), playerID)  | 
|     PyGameData.g_fbHelpBattlePlayerDict[playerID] = helpBattlePlayerDict  | 
|       | 
|     # Í¨ÖªÇ°¶Ë  | 
|     helpPlayerListPack = ChPyNetSendPack.tagMCHelpBattleList()  | 
|     helpPlayerListPack.RefreshCount = refreshCount  | 
|     helpPlayerListPack.HelpPlayerList = []  | 
|     for helpPlayerID, helpPlayerInfoDict in helpBattlePlayerDict.items():  | 
|         helpPlayer = ChPyNetSendPack.tagMCHelpBattlePlayer()  | 
|         helpPlayer.ObjID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID) # »ñÈ¡ÒѾÕÙ»½µÄ¶ÔÓ¦objID  | 
|         helpPlayer.PlayerID = helpPlayerID  | 
|         helpPlayer.Job = helpPlayerInfoDict.get("Job", 1)  | 
|         # Íæ¼Ò¾µÏñ²ÅÓÐÃû×Ö£¬ÖúÕ½NPCÃû×Öǰ¶Ë´¦Àí  | 
|         if "Name" in helpPlayerInfoDict:  | 
|             helpPlayer.Name =  helpPlayerInfoDict["Name"]  | 
|             helpPlayer.NameLen =  len(helpPlayer.Name)  | 
|             helpPlayer.LV =  helpPlayerInfoDict["LV"]  | 
|             helpPlayer.RealmLV =  helpPlayerInfoDict["RealmLV"]  | 
|             helpPlayer.FightPower =  helpPlayerInfoDict["FightPower"]  | 
|             helpPlayer.Relation = helpPlayerInfoDict.get("Relation", 0)  | 
|             helpPlayer.IsNeedGold =  helpPlayerInfoDict.get("NeedGoldCall", 0)  | 
|         helpPlayerListPack.HelpPlayerList.append(helpPlayer)  | 
|     helpPlayerListPack.HelpCount = len(helpPlayerListPack.HelpPlayerList)  | 
|     NetPackCommon.SendFakePack(curPlayer, helpPlayerListPack)  | 
|     return  | 
|   | 
| def SendGameServer_SweepCallHelpBattlePlayer(curPlayer, mapID, funcLineID):  | 
|     ## ·¢ËÍGameServerÇëÇóɨµ´ÖúÕ½Íæ¼Ò  | 
|     ipyData = IpyGameDataPY.GetIpyGameData("FBHelpBattle", mapID, funcLineID)  | 
|     if not ipyData:  | 
|         return  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     msgInfo = str(["SweepCall", mapID, funcLineID])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))  | 
|     GameWorld.Log("SendGameServer_SweepCallHelpBattlePlayer %s" % (msgInfo), playerID)  | 
|     return  | 
|   | 
| def __OnHelpBattleSweepCallResult(curPlayer, msgList, tick):  | 
|     ## Öúսɨµ´½á¹û´¦Àí  | 
|     cmd, mapID, funcLineID, helpBattlePlayerDict = msgList  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     GameWorld.DebugLog("__OnHelpBattleSweepCallResult %s,mapID=%s,funcLineID=%s,helpBattlePlayerDict=%s"   | 
|                        % (cmd, mapID, funcLineID, helpBattlePlayerDict), playerID)  | 
|       | 
|     fbFuncIpyData = IpyGameDataPY.GetIpyGameData("FBFunc", mapID)  | 
|     if not fbFuncIpyData:  | 
|         return  | 
|       | 
|     assistPlayerIDList = []  | 
|     for helpPlayerID in helpBattlePlayerDict.keys():  | 
|         if helpPlayerID <= MaxRobotID:  | 
|             continue  | 
|         assistPlayerIDList.append(helpPlayerID)  | 
|     __DoGivePlayerAssistLihe(curPlayer, mapID, funcLineID, assistPlayerIDList)  | 
|       | 
|     #ɨµ´½á¹û¸ø½±ÀøµÈ  | 
|     FBLogic.OnPlayerFBHelpBattleSweepResult(curPlayer, mapID, funcLineID, helpBattlePlayerDict)  | 
|     return  | 
|   | 
| def DoFBHelpBattleFinish(curPlayer, mapID, lineID):  | 
|     ## ¸±±¾ÖúÕ½Íê³É  | 
|       | 
|     assistPlayerIDList = []  | 
|     gameFB = GameWorld.GetGameFB()  | 
|     playerID = curPlayer.GetPlayerID()  | 
|     helpBattlePlayerDict = PyGameData.g_fbHelpBattlePlayerDict.get(playerID, {})  | 
|     for helpPlayerID in helpBattlePlayerDict.keys():  | 
|         objID = gameFB.GetGameFBDictByKey(ChConfig.Def_FB_HelpBattleFBObjID % helpPlayerID)  | 
|         if not objID:  | 
|             continue  | 
|         if helpPlayerID <= MaxRobotID:  | 
|             continue  | 
|         assistPlayerIDList.append(helpPlayerID)  | 
|     __DoGivePlayerAssistLihe(curPlayer, mapID, lineID, assistPlayerIDList)  | 
|       | 
|     return  | 
|   | 
| def __DoGivePlayerAssistLihe(curPlayer, mapID, lineID, assistPlayerIDList):  | 
|     ## ¸øÍæ¼ÒÐÖúÀñºÐ½±Àø  | 
|       | 
|     if not assistPlayerIDList:  | 
|         return  | 
|       | 
|     liheItemID = 0  | 
|     mapAssistGiftDict = IpyGameDataPY.GetFuncEvalCfg("AssistAward", 2, {})  | 
|     mapID = FBCommon.GetRecordMapID(mapID)  | 
|     if str(mapID) in mapAssistGiftDict:  | 
|         liheItemID = mapAssistGiftDict[str(mapID)][0]  | 
|     if not liheItemID:  | 
|         return  | 
|       | 
|     ItemControler.GivePlayerItemOrMail(curPlayer, [[liheItemID, 1, 0]])  | 
|       | 
|     msgInfo = str(["AssistFinish", liheItemID, mapID, lineID, assistPlayerIDList])  | 
|     GameWorld.GetPlayerManager().GameServer_QueryPlayerResult(curPlayer.GetID(), 0, 0, "FBHelpBattle", msgInfo, len(msgInfo))  | 
|     return  | 
|   | 
|   | 
| def __GetTeamFBMemRelationInfo(curPlayer, isHelp, leavePlayerID):  | 
|     ## ¼ÆËã¶ÓÔ±¼äÏ໥¼Ó³ÉÐÅÏ¢£¬ÀëÏßÍæ¼Ò²»Ëã  | 
|     relation = 0  | 
|     relationAdd = 0 # Éç½»¹ØÏµ¼Ó³É  | 
|     relationPlayerID = 0  | 
|     relationPlayerName = ""  | 
|     teamID = curPlayer.GetTeamID()  | 
|     if teamID not in PyGameData.g_teamFBMemRelationDict:  | 
|         return relation, relationAdd, relationPlayerID, relationPlayerName  | 
|       | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     friendList, memFamilyIDDict, memNameDict = PyGameData.g_teamFBMemRelationDict[teamID]  | 
|     relationList = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 3, []) # Éç½»¹ØÏµÓÅÏȼ¶  | 
|     relationCoinAddDict = IpyGameDataPY.GetFuncEvalCfg("HelpBattlePoint", 2, {}) # Éç½»¹ØÏµ¼Ó³É {"Éç½»¹ØÏµ":[¹ý¹Ø¼Ó³É, ÖúÕ½¼Ó³É], ...}   | 
|     playerID = curPlayer.GetPlayerID()  | 
|     familyID = curPlayer.GetFamilyID()  | 
|     if isHelp:  | 
|         # ÖúÕ½µÄËæ±ãȡһλÓÅÏȼ¶×î¸ßµÄ¼´¿É  | 
|         defaultRelationPlayerID = 0  | 
|         for memPlayerID, memFamilyID in memFamilyIDDict.items():  | 
|             memRelation, relationPlayerID = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)  | 
|             if not memRelation:  | 
|                 if not defaultRelationPlayerID and relationPlayerID:  | 
|                     defaultRelationPlayerID = relationPlayerID  | 
|                 continue  | 
|             relation = memRelation  | 
|             relationAddList = relationCoinAddDict.get(str(memRelation), [])  | 
|             relationAdd += relationAddList[1] if len(relationAddList) == 2 else 0  | 
|             relationPlayerName = memNameDict[relationPlayerID]  | 
|             return relation, relationAdd, relationPlayerID, relationPlayerName  | 
|           | 
|         relationPlayerID = defaultRelationPlayerID  | 
|         relationPlayerName = memNameDict.get(relationPlayerID, "")  | 
|         GameWorld.DebugLog("ÖúսĬÈÏÎÞ¹ØÏµ¶ÓÔ±£º relationPlayerID=%s,relationPlayerName=%s" % (relationPlayerID, relationPlayerName), playerID)  | 
|     else:  | 
|         # ·ÇÖúÕ½ÏíÊÜËùÓжÓÔ±¼Ó³É  | 
|         for memPlayerID, memFamilyID in memFamilyIDDict.items():  | 
|             memRelation = __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID)[0]  | 
|             if not memRelation:  | 
|                 continue  | 
|             if memRelation == relationList[0]:  | 
|                 relation = memRelation  | 
|             elif relation:  | 
|                 relation = memRelation  | 
|             relationAddList = relationCoinAddDict.get(str(memRelation), [])  | 
|             relationAdd += relationAddList[0] if len(relationAddList) == 2 else 0  | 
|               | 
|     return relation, relationAdd, relationPlayerID, relationPlayerName  | 
|   | 
| def __GetTemMemRelation(playerManager, playerID, familyID, memPlayerID, memFamilyID, relationList, friendList, leavePlayerID):  | 
|     ## ÀëÏßÍæ¼Ò²»ËãÉç½»¹ØÏµ  | 
|     if leavePlayerID and memPlayerID == leavePlayerID:  | 
|         return 0, 0  | 
|     if playerID == memPlayerID:  | 
|         return 0, 0  | 
|     memPlayer = playerManager.FindPlayerByID(memPlayerID)  | 
|     if memPlayer == None or memPlayer.IsEmpty():  | 
|         return 0, 0  | 
|     for checkRelation in relationList:  | 
|         if checkRelation == 1:  | 
|             if [playerID, memPlayerID] in friendList:  | 
|                 return checkRelation, memPlayerID  | 
|         if checkRelation == 2:  | 
|             if playerID != memPlayerID and familyID and familyID == memFamilyID:  | 
|                 return checkRelation, memPlayerID              | 
|     return 0, memPlayerID  | 
|   | 
| def RefershTeamFBMemRelation(tick, leavePlayerID=0):  | 
|     ## Ë¢ÐÂ×é¶Ó¸±±¾¶ÓÔ±¹ØÏµ  | 
|     playerManager = GameWorld.GetMapCopyPlayerManager()  | 
|     for i in xrange(playerManager.GetPlayerCount()):  | 
|         player = playerManager.GetPlayerByIndex(i)  | 
|         if player == None or player.IsEmpty():  | 
|             continue  | 
|         if leavePlayerID and player.GetPlayerID() == leavePlayerID:  | 
|             PyGameData.g_teamFBMemRelationAddDict.pop(leavePlayerID, 0)  | 
|             continue  | 
|         relation, relationAdd, relationPlayerID, relationPlayerName = __GetTeamFBMemRelationInfo(player, FBCommon.GetIsHelpFight(player), leavePlayerID)  | 
|         PyGameData.g_teamFBMemRelationAddDict[player.GetPlayerID()] = [relation, relationAdd, relationPlayerID, relationPlayerName]  | 
|           | 
|     for index in xrange(playerManager.GetPlayerCount()):  | 
|         player = playerManager.GetPlayerByIndex(index)  | 
|         if player == None or player.IsEmpty():  | 
|             continue  | 
|         if leavePlayerID and player.GetPlayerID() == leavePlayerID:  | 
|             continue  | 
|         FBLogic.DoFBHelp(player, tick)  | 
|           | 
|     return  | 
|   | 
| def GetTeamFBMemRelationInfo(playerID):  | 
|     if playerID not in PyGameData.g_teamFBMemRelationAddDict:  | 
|         return 0, 0  | 
|     return PyGameData.g_teamFBMemRelationAddDict[playerID][:2]  | 
|   |