#!/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]